Rev 6601 | Rev 6615 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6601 | Rev 6612 | ||
---|---|---|---|
1 | #ifndef KOLIBRI_TREELIST_H |
1 | #ifndef KOLIBRI_TREELIST_H |
2 | #define KOLIBRI_TREELIST_H |
2 | #define KOLIBRI_TREELIST_H |
3 | 3 | ||
4 | 4 | ||
5 | /// êîíñòàíòû ñòèëÿ |
5 | /// êîíñòàíòû ñòèëÿ |
6 | enum tl_style { |
6 | enum tl_style { |
7 | TL_KEY_NO_EDIT = 1, // ýëåìåíò íåëüçÿ ðåäàêòèðîâàòü íà êëàâèàòóðå (èçìåíÿòü óðîâíè, óäàëÿòü) |
7 | TL_KEY_NO_EDIT = 1, // ýëåìåíò íåëüçÿ ðåäàêòèðîâàòü íà êëàâèàòóðå (èçìåíÿòü óðîâíè, óäàëÿòü) |
8 | TL_DRAW_PAR_LINE = 2, // ðèñîâàòü ëèíèè ê ðîäèòåëüñêîìó óçëó |
8 | TL_DRAW_PAR_LINE = 2, // ðèñîâàòü ëèíèè ê ðîäèòåëüñêîìó óçëó |
9 | TL_LISTBOX_MODE = 4 //ñòèëü íå îòîáðàæàåò óðîâíè (êàê â ListBox âñå îäíîãî óðîâíÿ) |
9 | TL_LISTBOX_MODE = 4 //ñòèëü íå îòîáðàæàåò óðîâíè (êàê â ListBox âñå îäíîãî óðîâíÿ) |
10 | }; |
10 | }; |
11 | 11 | ||
12 | /// êîíñòàíòû äëÿ ôóíêöèé |
12 | /// êîíñòàíòû äëÿ ôóíêöèé |
13 | enum tl_err { |
13 | enum tl_err { |
14 | TL_ERR_LOAD_CAPTION = 1, //â ïàìÿòè íåò çàãîëîâêà 'tree' |
14 | TL_ERR_LOAD_CAPTION = 1, //â ïàìÿòè íåò çàãîëîâêà 'tree' |
15 | TL_ERR_SAVE_MEMOTY_SIZE = 2, //íå õâàòàåò ïàìÿòè äëÿ ñîõðàíåíèÿ ýëåìåíòà |
15 | TL_ERR_SAVE_MEMOTY_SIZE = 2, //íå õâàòàåò ïàìÿòè äëÿ ñîõðàíåíèÿ ýëåìåíòà |
16 | TL_ERR_LOAD_INFO_SIZE = 4, //íå ñîâïàäàåò ðàçìåð èíôîðìàöèîííîé ñòðóêòóðû ïðè îòêðûòèè |
16 | TL_ERR_LOAD_INFO_SIZE = 4, //íå ñîâïàäàåò ðàçìåð èíôîðìàöèîííîé ñòðóêòóðû ïðè îòêðûòèè |
17 | }; |
17 | }; |
18 | 18 | ||
19 | typedef struct __attribute__ ((__packed__)) { |
19 | typedef struct __attribute__ ((__packed__)) { |
20 | uint16_t type; //òèï ýëåìåíòà, èëè èíäåêñ èêîíêè äëÿ óçëà |
20 | uint16_t type; //òèï ýëåìåíòà, èëè èíäåêñ èêîíêè äëÿ óçëà |
21 | uint8_t lev; //óðîâåíü ýëåìåíòà |
21 | uint8_t lev; //óðîâåíü ýëåìåíòà |
22 | uint8_t clo; //ôëàã çàêðûòèÿ, èëè îòêðûòèÿ (èìååò ñìûñë äëÿ ðîäèòåëüñêîãî óçëà) |
22 | uint8_t clo; //ôëàã çàêðûòèÿ, èëè îòêðûòèÿ (èìååò ñìûñë äëÿ ðîäèòåëüñêîãî óçëà) |
23 | uint32_t prev; //èíäåêñ ïðåäûäóùåãî ýëåìåíòà |
23 | uint32_t prev; //èíäåêñ ïðåäûäóùåãî ýëåìåíòà |
24 | uint32_t next; //èíäåêñ ïîñëåäóþùåãî ýëåìåíòà |
24 | uint32_t next; //èíäåêñ ïîñëåäóþùåãî ýëåìåíòà |
25 | uint32_t tcreat; //âðåì. ñîçäàíèÿ |
25 | uint32_t tcreat; //âðåì. ñîçäàíèÿ |
26 | uint32_t tdel; //âðåì. óäàëåíèÿ |
26 | uint32_t tdel; //âðåì. óäàëåíèÿ |
27 | } treelist_node; |
27 | } treelist_node; |
28 | 28 | ||
29 | 29 | ||
30 | typedef struct __attribute__ ((__packed__)) { |
30 | typedef struct __attribute__ ((__packed__)) { |
31 | uint32_t left; |
31 | uint32_t left; |
32 | uint32_t top; |
32 | uint32_t top; |
33 | uint32_t width; |
33 | uint32_t width; |
34 | uint32_t height; |
34 | uint32_t height; |
35 | void *data_info; // óêàçàòåëü íà îñíîâíûå äàíûå |
35 | void *data_info; // óêàçàòåëü íà îñíîâíûå äàíûå |
36 | uint16_t info_size; // ðàçìåð äàííûõ âûäåëÿåìûõ äëÿ êàæäîãî óçëà (ïîëüçîâàòåëüñüêèå äàííûå + òåêñò äëÿ ïîäïèñè) |
36 | uint16_t info_size; // ðàçìåð äàííûõ âûäåëÿåìûõ äëÿ êàæäîãî óçëà (ïîëüçîâàòåëüñüêèå äàííûå + òåêñò äëÿ ïîäïèñè) |
37 | uint32_t info_max_count; // ìàêñèìàëüíîå êîëè÷åñòâî óçëîâ, êîòîðûå ìîæíî äîáàâèòü â ýëåìåíò |
37 | uint32_t info_max_count; // ìàêñèìàëüíîå êîëè÷åñòâî óçëîâ, êîòîðûå ìîæíî äîáàâèòü â ýëåìåíò |
38 | uint32_t style; // ñòèëè ýëåìåíòà |
38 | uint32_t style; // ñòèëè ýëåìåíòà |
39 | treelist_node *data_nodes; // óêàçàòåëü íà ñòðóêòóðû óçëîâ |
39 | treelist_node *data_nodes; // óêàçàòåëü íà ñòðóêòóðû óçëîâ |
40 | void *data_img; // óêàçàòåëü íà èçîáðàæåíèÿ ñ èêîíêàìè óçëîâ |
40 | void *data_img; // óêàçàòåëü íà èçîáðàæåíèÿ ñ èêîíêàìè óçëîâ |
41 | uint16_t img_cx; // øèðèíà èêîíîê |
41 | uint16_t img_cx; // øèðèíà èêîíîê |
42 | uint16_t img_cy; // âûñîòà èêîíîê |
42 | uint16_t img_cy; // âûñîòà èêîíîê |
43 | void *data_img_sys;//óêàçàòåëü íà ñèñòåìíûå èçîáðàæåíèÿ (ñòðåëêè, ïëþñèêè) |
43 | void *data_img_sys;//óêàçàòåëü íà ñèñòåìíûå èçîáðàæåíèÿ (ñòðåëêè, ïëþñèêè) |
44 | uint32_t ch_tim; // êîëè÷åñòâî èçìåíåíèé â ôàéëå |
44 | uint32_t ch_tim; // êîëè÷åñòâî èçìåíåíèé â ôàéëå |
45 | uint32_t tim_undo; // êîëè÷åñòâî îòìåíåííûõ äåéñòâèé |
45 | uint32_t tim_undo; // êîëè÷åñòâî îòìåíåííûõ äåéñòâèé |
46 | uint32_t cur_pos; // ïîçèöèÿ êóðñîðà |
46 | uint32_t cur_pos; // ïîçèöèÿ êóðñîðà |
47 | color_t col_bkg; // öâåò ôîíà |
47 | color_t col_bkg; // öâåò ôîíà |
48 | color_t col_zag; // öâåò çàãîëîâêà |
48 | color_t col_zag; // öâåò çàãîëîâêà |
49 | color_t col_txt; // öâåò òåêñòà |
49 | color_t col_txt; // öâåò òåêñòà |
50 | uint16_t capt_cy; // âûñîòà ïîäïèñè |
50 | uint16_t capt_cy; // âûñîòà ïîäïèñè |
51 | uint16_t info_capt_offs;//ñäâèã äëÿ íà÷àëà òåêñòà (ïîäïèñè óçëà) |
51 | uint16_t info_capt_offs;//ñäâèã äëÿ íà÷àëà òåêñòà (ïîäïèñè óçëà) |
52 | uint16_t info_capt_len;//äëèíà òåêñòà ïîäïèñè óçëà (åñëè = 0 òî äî êîíöà ñòðóêòóðû) |
52 | uint16_t info_capt_len;//äëèíà òåêñòà ïîäïèñè óçëà (åñëè = 0 òî äî êîíöà ñòðóêòóðû) |
53 | void *el_focus; // óêàçàòåëü íà ñòðóêòóðó ýëåìåíòà â ôîêóñå |
53 | void *el_focus; // óêàçàòåëü íà ñòðóêòóðó ýëåìåíòà â ôîêóñå |
54 | scrollbar *p_scroll; // óêàçàòåëü íà ñòðóêòóðó ñêðîëëèíãà |
54 | scrollbar *p_scroll; // óêàçàòåëü íà ñòðóêòóðó ñêðîëëèíãà |
55 | void *on_press; // +84 óêàçàòåëü íà ôóíêöèþ, êîòîðàÿ âûçûâàåòñÿ ïðè íàæàòèè Enter |
55 | void *on_press; // +84 óêàçàòåëü íà ôóíêöèþ, êîòîðàÿ âûçûâàåòñÿ ïðè íàæàòèè Enter |
56 | } treelist; |
56 | } treelist; |
57 | 57 | ||
58 | static inline treelist* kolibri_new_treelist( uint32_t x_w, uint32_t y_h, uint16_t capt_cy, uint32_t icon_size_xy, uint16_t info_size, uint32_t info_max_count, |
58 | static inline treelist* kolibri_new_treelist( uint32_t x_w, uint32_t y_h, uint16_t capt_cy, uint32_t icon_size_xy, uint16_t info_size, uint32_t info_max_count, |
59 | uint16_t info_capt_len, uint16_t info_capt_offs, enum tl_style style, void *el_focus, color_t back, color_t title, color_t txt) |
59 | uint16_t info_capt_len, uint16_t info_capt_offs, enum tl_style style, void *el_focus, color_t back, color_t title, color_t txt) |
60 | { |
60 | { |
61 | treelist *tl = (treelist *)calloc(1, sizeof(treelist)); |
61 | treelist *tl = (treelist *)calloc(1, sizeof(treelist)); |
62 | tl->left= x_w >> 16; |
62 | tl->left= x_w >> 16; |
63 | tl->width = x_w & 0xFFFF; |
63 | tl->width = x_w & 0xFFFF; |
64 | tl->top = y_h >> 16; |
64 | tl->top = y_h >> 16; |
65 | tl->height = y_h & 0xFFFF; |
65 | tl->height = y_h & 0xFFFF; |
66 | tl->info_size = info_size; |
66 | tl->info_size = info_size; |
67 | tl->info_max_count = info_max_count; |
67 | tl->info_max_count = info_max_count; |
68 | tl->style = style; |
68 | tl->style = style; |
69 | tl->img_cx = icon_size_xy >> 16; |
69 | tl->img_cx = icon_size_xy >> 16; |
70 | tl->img_cy = icon_size_xy & 0xFFFF; |
70 | tl->img_cy = icon_size_xy & 0xFFFF; |
71 | tl->col_bkg = back; |
71 | tl->col_bkg = back; |
72 | tl->col_zag = title; |
72 | tl->col_zag = title; |
73 | tl->col_txt = txt; |
73 | tl->col_txt = txt; |
74 | tl->info_capt_len = info_capt_len; |
74 | tl->info_capt_len = info_capt_len; |
75 | tl->info_capt_offs = info_capt_offs; |
75 | tl->info_capt_offs = info_capt_offs; |
76 | tl->el_focus = el_focus; |
76 | tl->el_focus = el_focus; |
77 | tl->p_scroll = kolibri_new_scrollbar_def(X_Y(0, 16), X_Y(70, 30), 100, 30, 0); |
77 | tl->p_scroll = kolibri_new_scrollbar_def(X_Y(0, 16), X_Y(0, 0), 100, 30, 0); |
78 | return tl; |
78 | return tl; |
79 | } |
79 | } |
80 | 80 | ||
81 | static inline void gui_add_treelist(kolibri_window *wnd, treelist* tl) |
81 | static inline void gui_add_treelist(kolibri_window *wnd, treelist* tl) |
82 | { |
82 | { |
83 | kolibri_window_add_element(wnd, KOLIBRI_TREELIST, tl); |
83 | kolibri_window_add_element(wnd, KOLIBRI_TREELIST, tl); |
84 | } |
84 | } |
85 | 85 | ||
86 | 86 | ||
87 | ///ðåàêöèÿ íà ìûøü |
87 | ///ðåàêöèÿ íà ìûøü |
88 | extern void (*tl_mouse)(treelist *) __attribute__((__stdcall__)); |
88 | extern void (*tl_mouse)(treelist *) __attribute__((__stdcall__)); |
89 | 89 | ||
90 | ///âûâîä ñïèñêà íà ýêðàí |
90 | ///âûâîä ñïèñêà íà ýêðàí |
91 | extern void (*tl_draw)(treelist *) __attribute__((__stdcall__)); |
91 | extern void (*tl_draw)(treelist *) __attribute__((__stdcall__)); |
- | 92 | __attribute__((__stdcall__)) static inline void treelist_draw(treelist *tl) |
|
- | 93 | { |
|
- | 94 | tl->p_scroll->all_redraw = 1; |
|
- | 95 | (*tl_draw)(tl); |
|
- | 96 | } |
|
- | 97 | ||
92 | 98 | ||
93 | ///ïåðåìåùàåì óçåë ââåðõ |
99 | ///ïåðåìåùàåì óçåë ââåðõ |
94 | extern void (*tl_node_move_up)(treelist *) __attribute__((__stdcall__)); |
100 | extern void (*tl_node_move_up)(treelist *) __attribute__((__stdcall__)); |
95 | 101 | ||
96 | ///ïåðåìåùàåì óçåë âíèç |
102 | ///ïåðåìåùàåì óçåë âíèç |
97 | extern void (*tl_node_move_down)(treelist *) __attribute__((__stdcall__)); |
103 | extern void (*tl_node_move_down)(treelist *) __attribute__((__stdcall__)); |
98 | 104 | ||
99 | extern void (*tl_data_init_asm)(treelist *) __attribute__((__stdcall__)); |
105 | extern void (*tl_data_init_asm)(treelist *) __attribute__((__stdcall__)); |
100 | ///âûäåëåíèå ïàìÿòè äëÿ ñòðóêòóð ñïèñêà è îñíîâíîé èíôîðìàöèè (êîíñòðóêòîð) |
106 | ///âûäåëåíèå ïàìÿòè äëÿ ñòðóêòóð ñïèñêà è îñíîâíîé èíôîðìàöèè (êîíñòðóêòîð) |
101 | static inline void treelist_data_init(treelist *tl) |
107 | static inline void treelist_data_init(treelist *tl) |
102 | { |
108 | { |
103 | __asm__ __volatile__ ( |
109 | __asm__ __volatile__ ( |
104 | "push %%edi \n\t":::); |
110 | "push %%edi \n\t":::); |
105 | 111 | ||
106 | (*tl_data_init_asm)(tl); |
112 | (*tl_data_init_asm)(tl); |
107 | 113 | ||
108 | __asm__ __volatile__ ( |
114 | __asm__ __volatile__ ( |
109 | "pop %%edi \n\t":::); |
115 | "pop %%edi \n\t":::); |
110 | } |
116 | } |
111 | 117 | ||
112 | extern void (*tl_data_clear_asm)(treelist *) __attribute__((__stdcall__)); |
118 | extern void (*tl_data_clear_asm)(treelist *) __attribute__((__stdcall__)); |
113 | ///î÷èñòêà ïàìÿòè ýëåìåíòà (äåñòðóêòîð) |
119 | ///î÷èñòêà ïàìÿòè ýëåìåíòà (äåñòðóêòîð) |
114 | static inline void treelist_data_clear(treelist *tl) |
120 | static inline void treelist_data_clear(treelist *tl) |
115 | { |
121 | { |
116 | __asm__ __volatile__ ( |
122 | __asm__ __volatile__ ( |
117 | "push %%edi \n\t":::); |
123 | "push %%edi \n\t":::); |
118 | 124 | ||
119 | (*tl_data_clear_asm)(tl); |
125 | (*tl_data_clear_asm)(tl); |
120 | 126 | ||
121 | __asm__ __volatile__ ( |
127 | __asm__ __volatile__ ( |
122 | "pop %%edi \n\t":::); |
128 | "pop %%edi \n\t":::); |
- | 129 | free(tl->p_scroll); |
|
123 | } |
130 | } |
124 | 131 | ||
125 | extern void (*tl_info_clear_asm)(treelist *) __attribute__((__stdcall__)); |
132 | extern void (*tl_info_clear_asm)(treelist *) __attribute__((__stdcall__)); |
126 | ///î÷èñòêà ñïèñêà (èíôîðìàöèè) |
133 | ///î÷èñòêà ñïèñêà (èíôîðìàöèè) |
127 | static inline void treelist_info_clear(treelist *tl) |
134 | static inline void treelist_info_clear(treelist *tl) |
128 | { |
135 | { |
129 | __asm__ __volatile__ ( |
136 | __asm__ __volatile__ ( |
130 | "push %%edi \n\t":::); |
137 | "push %%edi \n\t":::); |
131 | 138 | ||
132 | (*tl_info_clear_asm)(tl); |
139 | (*tl_info_clear_asm)(tl); |
133 | 140 | ||
134 | __asm__ __volatile__ ( |
141 | __asm__ __volatile__ ( |
135 | "pop %%edi \n\t":::); |
142 | "pop %%edi \n\t":::); |
136 | } |
143 | } |
137 | 144 | ||
138 | extern void (*tl_key_asm)(treelist *) __attribute__((__stdcall__)); |
145 | extern void (*tl_key_asm)(treelist *) __attribute__((__stdcall__)); |
139 | ///ðåàêöèÿ íà êëàâèàòóðó |
146 | ///ðåàêöèÿ íà êëàâèàòóðó |
140 | static inline void treelist_key(treelist *tl) |
147 | __attribute__((__stdcall__)) static inline void treelist_key(treelist *tl, oskey_t code) |
141 | { |
148 | { |
142 | __asm__ __volatile__ ( |
149 | __asm__ __volatile__ ( |
143 | "push %%ebx \n\t" |
150 | "push %2\n\t" |
144 | "push %%edi \n\t":::); |
151 | "call *%1 \n\t"::"a"(code.val), "m"(tl_key_asm), "m"(tl):); // indirect call with asterisk * |
145 | 152 | ||
146 | (*tl_key_asm)(tl); |
- | |
147 | - | ||
148 | __asm__ __volatile__ ( |
- | |
149 | "pop %%edi \n\t" |
- | |
150 | "pop %%ebx \n\t":::); |
153 | // (*tl_key_asm)(tl); |
151 | } |
154 | } |
152 | 155 | ||
153 | extern void (*tl_info_undo_asm)(treelist *) __attribute__((__stdcall__)); |
156 | extern void (*tl_info_undo_asm)(treelist *) __attribute__((__stdcall__)); |
154 | ///îòìåíà äåéñòâèÿ |
157 | ///îòìåíà äåéñòâèÿ |
155 | static inline void treelist_undo(treelist *tl) |
158 | static inline void treelist_undo(treelist *tl) |
156 | { |
159 | { |
157 | __asm__ __volatile__ ( |
160 | __asm__ __volatile__ ( |
158 | "push %%edi \n\t":::); |
161 | "push %%edi \n\t":::); |
159 | 162 | ||
160 | (*tl_info_undo_asm)(tl); |
163 | (*tl_info_undo_asm)(tl); |
161 | 164 | ||
162 | __asm__ __volatile__ ( |
165 | __asm__ __volatile__ ( |
163 | "pop %%edi \n\t":::); |
166 | "pop %%edi \n\t":::); |
164 | } |
167 | } |
165 | 168 | ||
166 | extern void (*tl_info_redo_asm)(treelist *) __attribute__((__stdcall__)); |
169 | extern void (*tl_info_redo_asm)(treelist *) __attribute__((__stdcall__)); |
167 | ///ïîâòîð äåéñòâèÿ |
170 | ///ïîâòîð äåéñòâèÿ |
168 | static inline void treelist_redo(treelist *tl) |
171 | static inline void treelist_redo(treelist *tl) |
169 | { |
172 | { |
170 | __asm__ __volatile__ ( |
173 | __asm__ __volatile__ ( |
171 | "push %%edi \n\t":::); |
174 | "push %%edi \n\t":::); |
172 | 175 | ||
173 | (*tl_info_redo_asm)(tl); |
176 | (*tl_info_redo_asm)(tl); |
174 | 177 | ||
175 | __asm__ __volatile__ ( |
178 | __asm__ __volatile__ ( |
176 | "pop %%edi \n\t":::); |
179 | "pop %%edi \n\t":::); |
177 | } |
180 | } |
178 | 181 | ||
179 | extern void (*tl_node_add_asm)(treelist *, uint32_t n_opt, void *n_info) __attribute__((__stdcall__)); |
182 | extern void (*tl_node_add_asm)(treelist *, uint32_t n_opt, void *n_info) __attribute__((__stdcall__)); |
180 | ///äîáàâèòü óçåë |
183 | ///äîáàâèòü óçåë |
181 | ///input: |
184 | ///input: |
182 | /// tlist - óêàçàòåëü íà ñòðóêòóðó ëèñòà |
185 | /// tlist - óêàçàòåëü íà ñòðóêòóðó ëèñòà |
183 | /// n_opt - îïöèè äîáàâëåíèÿ |
186 | /// n_opt - îïöèè äîáàâëåíèÿ |
184 | /// n_info - óêàçàòåëü íà äîáàâëÿåìûå äàííûå |
187 | /// n_info - óêàçàòåëü íà äîáàâëÿåìûå äàííûå |
185 | static inline void treelist_node_add(treelist *tl, void *n_info, uint16_t type, uint8_t clos, uint8_t lev) |
188 | static inline void treelist_node_add(treelist *tl, void *n_info, uint16_t type, uint8_t clos, uint8_t lev) |
186 | { |
189 | { |
187 | __asm__ __volatile__ ( |
190 | __asm__ __volatile__ ( |
188 | "push %%ebx \n\t" |
191 | "push %%ebx \n\t" |
189 | "push %%edi \n\t":::); |
192 | "push %%edi \n\t":::); |
190 | 193 | ||
191 | uint32_t n_opt = (type << 16) | (clos << 8) | lev; |
194 | uint32_t n_opt = (type << 16) | (clos << 8) | lev; |
192 | (*tl_node_add_asm)(tl, n_opt, n_info); |
195 | (*tl_node_add_asm)(tl, n_opt, n_info); |
193 | 196 | ||
194 | __asm__ __volatile__ ( |
197 | __asm__ __volatile__ ( |
195 | "pop %%edi \n\t" |
198 | "pop %%edi \n\t" |
196 | "pop %%ebx \n\t":::); |
199 | "pop %%ebx \n\t":::); |
197 | } |
200 | } |
198 | 201 | ||
199 | extern void (*tl_node_set_data_asm)(treelist *, void *n_info) __attribute__((__stdcall__)); |
202 | extern void (*tl_node_set_data_asm)(treelist *, void *n_info) __attribute__((__stdcall__)); |
200 | ///çàïèñàòü â òåêóùèé óçåë |
203 | ///çàïèñàòü â òåêóùèé óçåë |
201 | ///input: |
204 | ///input: |
202 | /// tlist - óêàçàòåëü íà ñòðóêòóðó ëèñòà |
205 | /// tlist - óêàçàòåëü íà ñòðóêòóðó ëèñòà |
203 | /// n_info - óêàçàòåëü íà äàííûå |
206 | /// n_info - óêàçàòåëü íà äàííûå |
204 | static inline void treelist_node_setdata(treelist *tl, void *n_info) |
207 | static inline void treelist_node_setdata(treelist *tl, void *n_info) |
205 | { |
208 | { |
206 | __asm__ __volatile__ ( |
209 | __asm__ __volatile__ ( |
207 | "push %%esi \n\t" |
210 | "push %%esi \n\t" |
208 | "push %%edi \n\t":::); |
211 | "push %%edi \n\t":::); |
209 | 212 | ||
210 | (*tl_node_set_data_asm)(tl, n_info); |
213 | (*tl_node_set_data_asm)(tl, n_info); |
211 | 214 | ||
212 | __asm__ __volatile__ ( |
215 | __asm__ __volatile__ ( |
213 | "pop %%edi \n\t" |
216 | "pop %%edi \n\t" |
214 | "pop %%esi \n\t":::); |
217 | "pop %%esi \n\t":::); |
215 | } |
218 | } |
216 | 219 | ||
217 | extern void* (*tl_node_get_data_asm)(treelist *) __attribute__((__stdcall__)); |
220 | extern void* (*tl_node_get_data_asm)(treelist *) __attribute__((__stdcall__)); |
218 | ///âçÿòü óêàçàòåëü íà äàííûå óçëà ïîä êóðñîðîì |
221 | ///âçÿòü óêàçàòåëü íà äàííûå óçëà ïîä êóðñîðîì |
219 | static inline void* treelist_getdata(treelist *tl) |
222 | static inline void* treelist_getdata(treelist *tl) |
220 | { |
223 | { |
221 | __asm__ __volatile__ ( |
224 | __asm__ __volatile__ ( |
222 | "push %%edi \n\t":::); |
225 | "push %%edi \n\t":::); |
223 | 226 | ||
224 | void *res = |
227 | void *res = |
225 | (*tl_node_get_data_asm)(tl); |
228 | (*tl_node_get_data_asm)(tl); |
226 | 229 | ||
227 | __asm__ __volatile__ ( |
230 | __asm__ __volatile__ ( |
228 | "pop %%edi \n\t":::); |
231 | "pop %%edi \n\t":::); |
229 | return res; |
232 | return res; |
230 | } |
233 | } |
231 | 234 | ||
232 | extern void (*tl_node_delete_asm)(treelist *) __attribute__((__stdcall__)); |
235 | extern void (*tl_node_delete_asm)(treelist *) __attribute__((__stdcall__)); |
233 | ///óäàëèòü óçåë ïîä êóðñîðîì |
236 | ///óäàëèòü óçåë ïîä êóðñîðîì |
234 | static inline void treelist_node_delete(treelist *tl) |
237 | static inline void treelist_node_delete(treelist *tl) |
235 | { |
238 | { |
236 | __asm__ __volatile__ ( |
239 | __asm__ __volatile__ ( |
237 | "push %%edi \n\t":::); |
240 | "push %%edi \n\t":::); |
238 | 241 | ||
239 | (*tl_node_delete_asm)(tl); |
242 | (*tl_node_delete_asm)(tl); |
240 | 243 | ||
241 | __asm__ __volatile__ ( |
244 | __asm__ __volatile__ ( |
242 | "pop %%edi \n\t":::); |
245 | "pop %%edi \n\t":::); |
243 | } |
246 | } |
244 | 247 | ||
245 | extern void (*tl_cur_beg_asm)(treelist *) __attribute__((__stdcall__)); |
248 | extern void (*tl_cur_beg_asm)(treelist *) __attribute__((__stdcall__)); |
246 | ///ïîñòàâèòü êóðñîð íà ïåðâûé óçåë |
249 | ///ïîñòàâèòü êóðñîð íà ïåðâûé óçåë |
247 | static inline void treelist_cursor_begin(treelist *tl) |
250 | static inline void treelist_cursor_begin(treelist *tl) |
248 | { |
251 | { |
249 | __asm__ __volatile__ ( |
252 | __asm__ __volatile__ ( |
250 | "push %%edi \n\t":::); |
253 | "push %%edi \n\t":::); |
251 | 254 | ||
252 | (*tl_cur_beg_asm)(tl); |
255 | (*tl_cur_beg_asm)(tl); |
253 | 256 | ||
254 | __asm__ __volatile__ ( |
257 | __asm__ __volatile__ ( |
255 | "pop %%edi \n\t":::); |
258 | "pop %%edi \n\t":::); |
256 | } |
259 | } |
257 | 260 | ||
258 | extern void (*tl_cur_next_asm)(treelist *) __attribute__((__stdcall__)); |
261 | extern void (*tl_cur_next_asm)(treelist *) __attribute__((__stdcall__)); |
259 | ///ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ íèæå |
262 | ///ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ íèæå |
260 | static inline void treelist_cursor_next(treelist *tl) |
263 | static inline void treelist_cursor_next(treelist *tl) |
261 | { |
264 | { |
262 | __asm__ __volatile__ ( |
265 | __asm__ __volatile__ ( |
263 | "push %%ebx \n\t" |
266 | "push %%ebx \n\t" |
264 | "push %%esi \n\t" |
267 | "push %%esi \n\t" |
265 | "push %%edi \n\t":::); |
268 | "push %%edi \n\t":::); |
266 | 269 | ||
267 | (*tl_cur_next_asm)(tl); |
270 | (*tl_cur_next_asm)(tl); |
268 | 271 | ||
269 | __asm__ __volatile__ ( |
272 | __asm__ __volatile__ ( |
270 | "pop %%edi \n\t" |
273 | "pop %%edi \n\t" |
271 | "pop %%esi \n\t" |
274 | "pop %%esi \n\t" |
272 | "pop %%ebx \n\t":::); |
275 | "pop %%ebx \n\t":::); |
273 | } |
276 | } |
274 | 277 | ||
275 | extern void (*tl_cur_perv_asm)(treelist *) __attribute__((__stdcall__)); |
278 | extern void (*tl_cur_perv_asm)(treelist *) __attribute__((__stdcall__)); |
276 | ///ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ âûøå |
279 | ///ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ âûøå |
277 | static inline void treelist_cursor_prev(treelist *tl) |
280 | static inline void treelist_cursor_prev(treelist *tl) |
278 | { |
281 | { |
279 | __asm__ __volatile__ ( |
282 | __asm__ __volatile__ ( |
280 | "push %%ebx \n\t" |
283 | "push %%ebx \n\t" |
281 | "push %%esi \n\t" |
284 | "push %%esi \n\t" |
282 | "push %%edi \n\t":::); |
285 | "push %%edi \n\t":::); |
283 | 286 | ||
284 | (*tl_cur_perv_asm)(tl); |
287 | (*tl_cur_perv_asm)(tl); |
285 | 288 | ||
286 | __asm__ __volatile__ ( |
289 | __asm__ __volatile__ ( |
287 | "pop %%edi \n\t" |
290 | "pop %%edi \n\t" |
288 | "pop %%esi \n\t" |
291 | "pop %%esi \n\t" |
289 | "pop %%ebx \n\t":::); |
292 | "pop %%ebx \n\t":::); |
290 | } |
293 | } |
291 | 294 | ||
292 | extern void (*tl_node_close_open_asm)(treelist *) __attribute__((__stdcall__)); |
295 | extern void (*tl_node_close_open_asm)(treelist *) __attribute__((__stdcall__)); |
293 | ///îòêðûòü/çàêðûòü óçåë (ðàáîòàåò ñ óçëàìè êîòîðûå èìåþò äî÷åðíèå óçëû) |
296 | ///îòêðûòü/çàêðûòü óçåë (ðàáîòàåò ñ óçëàìè êîòîðûå èìåþò äî÷åðíèå óçëû) |
294 | static inline void treelist_close_open(treelist *tl) |
297 | static inline void treelist_close_open(treelist *tl) |
295 | { |
298 | { |
296 | __asm__ __volatile__ ( |
299 | __asm__ __volatile__ ( |
297 | "push %%edi \n\t":::); |
300 | "push %%edi \n\t":::); |
298 | 301 | ||
299 | (*tl_node_close_open_asm)(tl); |
302 | (*tl_node_close_open_asm)(tl); |
300 | 303 | ||
301 | __asm__ __volatile__ ( |
304 | __asm__ __volatile__ ( |
302 | "pop %%edi \n\t":::); |
305 | "pop %%edi \n\t":::); |
303 | } |
306 | } |
304 | 307 | ||
305 | extern void (*tl_node_lev_inc_asm)(treelist *) __attribute__((__stdcall__)); |
308 | extern void (*tl_node_lev_inc_asm)(treelist *) __attribute__((__stdcall__)); |
306 | ///óâåëè÷èòü óðîâåíü |
309 | ///óâåëè÷èòü óðîâåíü |
307 | static inline void treelist_level_inc(treelist *tl) |
310 | static inline void treelist_level_inc(treelist *tl) |
308 | { |
311 | { |
309 | __asm__ __volatile__ ( |
312 | __asm__ __volatile__ ( |
310 | "push %%edi \n\t":::); |
313 | "push %%edi \n\t":::); |
311 | 314 | ||
312 | (*tl_node_lev_inc_asm)(tl); |
315 | (*tl_node_lev_inc_asm)(tl); |
313 | 316 | ||
314 | __asm__ __volatile__ ( |
317 | __asm__ __volatile__ ( |
315 | "pop %%edi \n\t":::); |
318 | "pop %%edi \n\t":::); |
316 | } |
319 | } |
317 | 320 | ||
318 | extern void (*tl_node_lev_dec_asm)(treelist *) __attribute__((__stdcall__)); |
321 | extern void (*tl_node_lev_dec_asm)(treelist *) __attribute__((__stdcall__)); |
319 | ///óìåíüøèòü óðîâåíü |
322 | ///óìåíüøèòü óðîâåíü |
320 | static inline void treelist_level_dec(treelist *tl) |
323 | static inline void treelist_level_dec(treelist *tl) |
321 | { |
324 | { |
322 | __asm__ __volatile__ ( |
325 | __asm__ __volatile__ ( |
323 | "push %%edi \n\t":::); |
326 | "push %%edi \n\t":::); |
324 | 327 | ||
325 | (*tl_node_lev_dec_asm)(tl); |
328 | (*tl_node_lev_dec_asm)(tl); |
326 | 329 | ||
327 | __asm__ __volatile__ ( |
330 | __asm__ __volatile__ ( |
328 | "pop %%edi \n\t":::); |
331 | "pop %%edi \n\t":::); |
329 | } |
332 | } |
330 | 333 | ||
331 | extern treelist_node* (*tl_node_poi_get_info_asm)(treelist *, int node_ind) __attribute__((__stdcall__)); |
334 | extern treelist_node* (*tl_node_poi_get_info_asm)(treelist *, int node_ind) __attribute__((__stdcall__)); |
332 | ///âçÿòü óêàçàòåëü íà ñòðóêòóðó óçëà â óêàçàííîé ïîçèöèè |
335 | ///âçÿòü óêàçàòåëü íà ñòðóêòóðó óçëà â óêàçàííîé ïîçèöèè |
333 | ///input: |
336 | ///input: |
334 | /// tlist - pointer to 'TreeList' struct |
337 | /// tlist - pointer to 'TreeList' struct |
335 | /// node_ind - node index |
338 | /// node_ind - node index |
336 | ///output - pointer to node info or NULL |
339 | ///output - pointer to node info or NULL |
337 | static inline treelist_node* treelist_getnode(treelist *tl, int node_ind) |
340 | static inline treelist_node* treelist_getnode(treelist *tl, int node_ind) |
338 | { |
341 | { |
339 | __asm__ __volatile__ ( |
342 | __asm__ __volatile__ ( |
340 | "push %%ebx \n\t" |
343 | "push %%ebx \n\t" |
341 | "push %%edi \n\t":::); |
344 | "push %%edi \n\t":::); |
342 | 345 | ||
343 | treelist_node *ret = |
346 | treelist_node *ret = |
344 | (*tl_node_poi_get_info_asm)(tl, node_ind); |
347 | (*tl_node_poi_get_info_asm)(tl, node_ind); |
345 | 348 | ||
346 | __asm__ __volatile__ ( |
349 | __asm__ __volatile__ ( |
347 | "pop %%edi \n\t" |
350 | "pop %%edi \n\t" |
348 | "pop %%ebx \n\t":::); |
351 | "pop %%ebx \n\t":::); |
349 | return ret; |
352 | return ret; |
350 | } |
353 | } |
351 | 354 | ||
352 | extern treelist_node* (*tl_node_poi_get_next_info_asm)(treelist *, treelist_node*) __attribute__((__stdcall__)); |
355 | extern treelist_node* (*tl_node_poi_get_next_info_asm)(treelist *, treelist_node*) __attribute__((__stdcall__)); |
353 | ///âçÿòü óêàçàòåëü íà ñëåäóùóþ ñòðóêòóðó óçëà |
356 | ///âçÿòü óêàçàòåëü íà ñëåäóùóþ ñòðóêòóðó óçëà |
354 | ///input: |
357 | ///input: |
355 | /// tlist - pointer to 'TreeList' struct |
358 | /// tlist - pointer to 'TreeList' struct |
356 | /// node_p - node param struct |
359 | /// node_p - node param struct |
357 | ///output - pointer to next node struct or NULL |
360 | ///output - pointer to next node struct or NULL |
358 | static inline treelist_node* treelist_getnode_next(treelist *tl, treelist_node* node) |
361 | static inline treelist_node* treelist_getnode_next(treelist *tl, treelist_node* node) |
359 | { |
362 | { |
360 | __asm__ __volatile__ ( |
363 | __asm__ __volatile__ ( |
361 | "push %%ebx \n\t" |
364 | "push %%ebx \n\t" |
362 | "push %%edi \n\t":::); |
365 | "push %%edi \n\t":::); |
363 | 366 | ||
364 | treelist_node *ret = |
367 | treelist_node *ret = |
365 | (*tl_node_poi_get_next_info_asm)(tl, node); |
368 | (*tl_node_poi_get_next_info_asm)(tl, node); |
366 | 369 | ||
367 | __asm__ __volatile__ ( |
370 | __asm__ __volatile__ ( |
368 | "pop %%edi \n\t" |
371 | "pop %%edi \n\t" |
369 | "pop %%ebx \n\t":::); |
372 | "pop %%ebx \n\t":::); |
370 | return ret; |
373 | return ret; |
371 | } |
374 | } |
372 | 375 | ||
373 | extern void* (*_tl_node_poi_get_data_asm)(treelist *, treelist_node*) __attribute__((__stdcall__)); |
376 | extern void* (*_tl_node_poi_get_data_asm)(treelist *, treelist_node*) __attribute__((__stdcall__)); |
374 | ///;âçÿòü óêàçàòåëü íà äàííûå óçëà |
377 | ///;âçÿòü óêàçàòåëü íà äàííûå óçëà |
375 | ///input: |
378 | ///input: |
376 | /// tlist - pointer to 'TreeList' struct |
379 | /// tlist - pointer to 'TreeList' struct |
377 | /// node_p - node param struct |
380 | /// node_p - node param struct |
378 | ///output - pointer |
381 | ///output - pointer |
379 | static inline void* treelist_getnode_data(treelist *tl, treelist_node *node) |
382 | static inline void* treelist_getnode_data(treelist *tl, treelist_node *node) |
380 | { |
383 | { |
381 | __asm__ __volatile__ ( |
384 | __asm__ __volatile__ ( |
382 | "push %%edi \n\t":::); |
385 | "push %%edi \n\t":::); |
383 | 386 | ||
384 | void *ret = |
387 | void *ret = |
385 | (*_tl_node_poi_get_data_asm)(tl, node); |
388 | (*_tl_node_poi_get_data_asm)(tl, node); |
386 | 389 | ||
387 | __asm__ __volatile__ ( |
390 | __asm__ __volatile__ ( |
388 | "pop %%edi \n\t":::); |
391 | "pop %%edi \n\t":::); |
389 | return ret; |
392 | return ret; |
390 | } |
393 | } |
391 | 394 | ||
392 | extern int (*tl_save_mem_asm)(treelist *, int opt, void *h_mem, int mem_size) __attribute__((__stdcall__)); |
395 | extern int (*tl_save_mem_asm)(treelist *, int opt, void *h_mem, int mem_size) __attribute__((__stdcall__)); |
393 | /// tlist - pointer to 'TreeList' struct |
396 | /// tlist - pointer to 'TreeList' struct |
394 | /// opt - options: 0 - first element, 1 - add next element |
397 | /// opt - options: 0 - first element, 1 - add next element |
395 | /// h_mem - pointer to memory |
398 | /// h_mem - pointer to memory |
396 | /// mem_size - memory size |
399 | /// mem_size - memory size |
397 | ///output - error code |
400 | ///output - error code |
398 | static inline int treelist_save2mem(treelist *tl, int opt, void *h_mem, int mem_size) |
401 | static inline int treelist_save2mem(treelist *tl, int opt, void *h_mem, int mem_size) |
399 | { |
402 | { |
400 | __asm__ __volatile__ ( |
403 | __asm__ __volatile__ ( |
401 | "push %%ebx \n\t" |
404 | "push %%ebx \n\t" |
402 | "push %%esi \n\t" |
405 | "push %%esi \n\t" |
403 | "push %%edi \n\t":::); |
406 | "push %%edi \n\t":::); |
404 | 407 | ||
405 | int ret = |
408 | int ret = |
406 | (*tl_save_mem_asm)(tl, opt, h_mem, mem_size); |
409 | (*tl_save_mem_asm)(tl, opt, h_mem, mem_size); |
407 | 410 | ||
408 | __asm__ __volatile__ ( |
411 | __asm__ __volatile__ ( |
409 | "pop %%edi \n\t" |
412 | "pop %%edi \n\t" |
410 | "pop %%esi \n\t" |
413 | "pop %%esi \n\t" |
411 | "pop %%ebx \n\t":::); |
414 | "pop %%ebx \n\t":::); |
412 | return ret; |
415 | return ret; |
413 | } |
416 | } |
414 | 417 | ||
415 | extern int (*_tl_load_mem_asm)(treelist *, int opt, void *h_mem, int mem_size) __attribute__((__stdcall__)); |
418 | extern int (*_tl_load_mem_asm)(treelist *, int opt, void *h_mem, int mem_size) __attribute__((__stdcall__)); |
416 | /**input: |
419 | /**input: |
417 | ; tlist - pointer to 'TreeList' struct |
420 | ; tlist - pointer to 'TreeList' struct |
418 | ; opt - options: element index + (2*(add mode)+(init mode)) shl 16, tl_load_mode_add equ 0x20000 ;îïöèÿ ñ÷èòûâàíèÿ â ðåæèìå äîáàâëåíèÿ èíôîðìàöèè |
421 | ; opt - options: element index + (2*(add mode)+(init mode)) shl 16, tl_load_mode_add equ 0x20000 ;îïöèÿ ñ÷èòûâàíèÿ â ðåæèìå äîáàâëåíèÿ èíôîðìàöèè |
419 | ; h_mem - pointer to memory |
422 | ; h_mem - pointer to memory |
420 | ; mem_size - memory size |
423 | ; mem_size - memory size |
421 | ; ðàçìåð ïàìÿòè, ïîêà íå èñïîëüçóåòñÿ (íàçíà÷àëñÿ äëÿ êîíòðîëÿ) |
424 | ; ðàçìåð ïàìÿòè, ïîêà íå èñïîëüçóåòñÿ (íàçíà÷àëñÿ äëÿ êîíòðîëÿ) |
422 | ; äëÿ åãî èñïîëüçîâàíèÿ íóæíî äîðàáîòàòü ôóíêöèþ |
425 | ; äëÿ åãî èñïîëüçîâàíèÿ íóæíî äîðàáîòàòü ôóíêöèþ |
423 | ;output: |
426 | ;output: |
424 | ; eax - error code |
427 | ; eax - error code |
425 | ;memory header format: |
428 | ;memory header format: |
426 | ; +0 - (4) 'tree' |
429 | ; +0 - (4) 'tree' |
427 | ; +4 - (2) info size |
430 | ; +4 - (2) info size |
428 | ; +6 - (4) count nodes |
431 | ; +6 - (4) count nodes |
429 | ; +10 - (4) tlist style |
432 | ; +10 - (4) tlist style |
430 | ; +14 - (4) cursor pos |
433 | ; +14 - (4) cursor pos |
431 | ; +18 - (2) info capt offs |
434 | ; +18 - (2) info capt offs |
432 | ; +20 - (2) info capt len |
435 | ; +20 - (2) info capt len |
433 | ; +22 - (4) scroll pos |
436 | ; +22 - (4) scroll pos |
434 | ;memory data format: |
437 | ;memory data format: |
435 | ; +26 - (info size + 8) * count nodes */ |
438 | ; +26 - (info size + 8) * count nodes */ |
436 | static inline int treelist_load4mem(treelist *tl, int opt, void *h_mem, int mem_size) |
439 | static inline int treelist_load4mem(treelist *tl, int opt, void *h_mem, int mem_size) |
437 | { |
440 | { |
438 | __asm__ __volatile__ ( |
441 | __asm__ __volatile__ ( |
439 | "push %%ebx \n\t" |
442 | "push %%ebx \n\t" |
440 | "push %%esi \n\t" |
443 | "push %%esi \n\t" |
441 | "push %%edi \n\t":::); |
444 | "push %%edi \n\t":::); |
442 | 445 | ||
443 | int ret = |
446 | int ret = |
444 | (*_tl_load_mem_asm)(tl, opt, h_mem, mem_size); |
447 | (*_tl_load_mem_asm)(tl, opt, h_mem, mem_size); |
445 | 448 | ||
446 | __asm__ __volatile__ ( |
449 | __asm__ __volatile__ ( |
447 | "pop %%edi \n\t" |
450 | "pop %%edi \n\t" |
448 | "pop %%esi \n\t" |
451 | "pop %%esi \n\t" |
449 | "pop %%ebx \n\t":::); |
452 | "pop %%ebx \n\t":::); |
450 | return ret; |
453 | return ret; |
451 | } |
454 | } |
452 | 455 | ||
453 | extern int (*tl_get_mem_size_asm)(treelist *, void *h_mem) __attribute__((__stdcall__)); |
456 | extern int (*tl_get_mem_size_asm)(treelist *, void *h_mem) __attribute__((__stdcall__)); |
454 | /// ;áåðåò ðàçìåð ïàìÿòè çàíÿòîé ôóíêöèåé tl_save_mem ïðè ñîõðàíåíèè ýëåìåíòîâ |
457 | /// ;áåðåò ðàçìåð ïàìÿòè çàíÿòîé ôóíêöèåé tl_save_mem ïðè ñîõðàíåíèè ýëåìåíòîâ |
455 | /// tlist - pointer to 'TreeList' struct |
458 | /// tlist - pointer to 'TreeList' struct |
456 | /// h_mem - pointer to saved memory |
459 | /// h_mem - pointer to saved memory |
457 | static inline int treelist_get_memsize(treelist *tl, void *h_mem) |
460 | static inline int treelist_get_memsize(treelist *tl, void *h_mem) |
458 | { |
461 | { |
459 | __asm__ __volatile__ ( |
462 | __asm__ __volatile__ ( |
460 | "push %%ebx \n\t" |
463 | "push %%ebx \n\t" |
461 | "push %%edi \n\t":::); |
464 | "push %%edi \n\t":::); |
462 | 465 | ||
463 | int ret = |
466 | int ret = |
464 | (*tl_get_mem_size_asm)(tl, h_mem); |
467 | (*tl_get_mem_size_asm)(tl, h_mem); |
465 | 468 | ||
466 | __asm__ __volatile__ ( |
469 | __asm__ __volatile__ ( |
467 | "pop %%edi \n\t" |
470 | "pop %%edi \n\t" |
468 | "pop %%ebx \n\t":::); |
471 | "pop %%ebx \n\t":::); |
469 | return ret; |
472 | return ret; |
470 | } |
473 | } |
471 | 474 | ||
472 | #endif //KOLIBRI_TREELIST_H><>><> |
475 | #endif //KOLIBRI_TREELIST_H><>><> |