Subversion Repositories Kolibri OS

Rev

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