Subversion Repositories Kolibri OS

Rev

Rev 6589 | Rev 6612 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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