Rev 6612 | Rev 7577 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6589 | siemargl | 1 | #ifndef KOLIBRI_EDITOR_H |
2 | #define KOLIBRI_EDITOR_H |
||
3 | |||
4 | // (количество символов в новом документе + 2) |
||
5 | #define TE_MAXCHARS 100002 |
||
6 | // максимальный размер файла синтаксиса |
||
7 | #define TE_MAX_SYNTAX_FILESIZE 410000 |
||
8 | // buffer for copy|paste |
||
9 | #define TE_BUF_SIZE 4096 |
||
10 | typedef void (*editor_callback)(void); |
||
11 | |||
12 | struct __attribute__ ((__packed__)) editor_symbol { |
||
13 | uint8_t c; // +0 символ |
||
14 | uint8_t col; // +1 цвет |
||
6615 | siemargl | 15 | uint32_t prev; // +2 индекс предыдущего |
16 | uint32_t next; // +6 указатели (индекс следующего) |
||
6589 | siemargl | 17 | uint32_t tc; // +10 врем. создания |
18 | uint32_t td; // +14 врем. удаления |
||
19 | }; |
||
20 | |||
21 | /// структура текстового редактора |
||
22 | typedef struct __attribute__ ((__packed__)) { |
||
23 | uint32_t x_pos; //0 |
||
24 | uint32_t y_pos; //50 |
||
25 | uint32_t width; //440 |
||
26 | uint32_t hight; //150 |
||
6612 | siemargl | 27 | uint32_t w_pane; //30 ширина панели в окне, width of left pane with line numbers |
28 | uint32_t h_pane; //25 высота панели в окне, hight of top pane with Rows, Cols Undo info |
||
6589 | siemargl | 29 | uint32_t width_sym; //9 ширина символа (знакоместа) в окне |
30 | uint32_t hight_sym; //16 высота символа (знакоместа) в окне |
||
31 | uint8_t drag_m; // выделение от мыши |
||
32 | uint8_t drag_k; // выделение от клавиатуры |
||
33 | uint32_t sel_x0; // структура выделения |
||
34 | uint32_t sel_y0; |
||
35 | uint32_t sel_x1; |
||
36 | uint32_t sel_y1; |
||
37 | uint32_t seln_x0; //дополнительная структура выделения |
||
38 | uint32_t seln_y0; |
||
39 | uint32_t seln_x1; |
||
40 | uint32_t seln_y1; |
||
41 | struct editor_symbol *tex; // text memory pointer |
||
6615 | siemargl | 42 | struct editor_symbol *tex_1; // указатель за последним существующим символом (конец файла) |
43 | struct editor_symbol *tex_end;// text end memory pointer (указатель за концом выделенного буфера для текста) |
||
6589 | siemargl | 44 | uint32_t cur_x; //координата x курсора |
45 | uint32_t cur_y; //координата y курсора |
||
46 | uint32_t max_chars; // TE_MAXCHARS ;+86 максимальное число символов в одном документе |
||
47 | uint32_t count_colors_text; // 1 ;+90 количество цветов текста |
||
48 | uint32_t count_key_words; //+94 колличество ключевых слов |
||
49 | color_t color_cursor; // 0x808080 ;+98 цвет курсора |
||
50 | color_t color_wnd_capt; // 0x80 ;+102 цвет полей вокруг окна |
||
51 | color_t color_wnd_work; // 0x0 ;+106 цвет фона окна |
||
52 | color_t color_wnd_bord; //0xd0d0d0 ;+110 цвет текста на полях |
||
53 | color_t color_select; // 0x208080 ;+114 цвет выделения |
||
54 | color_t color_cur_text; // 0xff0000 ;+118 цвет символа под курсором |
||
55 | color_t color_wnd_text; // 0xffff00 ;+122 цвет текста в окне |
||
56 | char *syntax_file; // указатель на начало файла синтаксиса |
||
57 | uint32_t syntax_file_size; // TE_MAX_SYNTAX_FILESIZE ;+130 максимальный размер файла синтаксиса |
||
58 | void *text_colors; // указатель на массив цветов текста |
||
59 | char *help_text_f1; // указатель на текст справки (по нажатии F1) |
||
60 | int help_id; // -1 ;+142 идентификатор для справки |
||
61 | void *key_words_data; // указатель на структуры ключевых слов TexColViv |
||
62 | uint32_t tim_ch; // количество изменений в файле |
||
63 | uint32_t tim_undo; // количество отмененных действий |
||
64 | uint32_t tim_ls; // время последнего сохранения |
||
65 | uint32_t tim_co; // время последней цветовой разметки |
||
66 | void *el_focus; // указатель на переменную элемента в фокусе pointer to pointer** |
||
67 | uint8_t err_save; // ошибка сохранения файла |
||
68 | uint8_t panel_id; // номер открытой панели |
||
69 | uint8_t key_new; // символ, который будет добавлятся с клавиатуры |
||
70 | uint8_t symbol_new_line; // ascii 20 символ завершения строки |
||
71 | scrollbar *scr_w; // вертикальный скроллинг != NULL |
||
72 | scrollbar *scr_h; // горизонтальный скроллинг != NULL |
||
73 | char *arr_key_pos;// указатель на массив позиций ключевых слов |
||
74 | char *buffer; // указатель на буфер копирования/вставки != NULL, also size |
||
75 | char *buffer_find;// указатель на буфер для поиска (sized 302) |
||
76 | uint8_t cur_ins; // 1 режим работы курсора (обычный или замена) |
||
77 | uint8_t mode_color; // 1 режим выделения слов цветом (0-выкл. 1-вкл.) |
||
78 | uint8_t mode_invis; // 0 режим показа непечатаемых символов |
||
79 | uint8_t gp_opt; // 0 опции возвращаемые функцией ted_get_pos_by_cursor |
||
80 | editor_callback fun_on_key_ctrl_o; // указатель на функцию вызываемую при нажатии Ctrl+O (открытие файла), can be NULL |
||
81 | editor_callback fun_on_key_ctrl_f; // ... Ctrl+F (вызова/скрытия панели поиска) |
||
82 | editor_callback fun_on_key_ctrl_n; // ... Ctrl+N (создание нового документа) |
||
83 | editor_callback fun_on_key_ctrl_s; // ... Ctrl+S |
||
84 | uint32_t buffer_size;// BUF_SIZE размер буфера копирования/вставки |
||
85 | editor_callback fun_find_err; // указатель на функцию вызываемую если поиск закончился неудачно |
||
86 | editor_callback fun_init_synt_err; // unused указатель на функцию вызываемую при ошибочном открытии файла синтаксиса |
||
87 | editor_callback fun_draw_panel_buttons; // указатель на функцию рисования панели с кнопками |
||
88 | editor_callback fun_draw_panel_find; // указатель на функцию рисования панели поиска |
||
89 | editor_callback fun_draw_panel_syntax; // указатель на функцию рисования панели синтаксиса |
||
90 | editor_callback fun_save_err; // указатель на функцию вызываемую если сохранение файла закончилось неудачно |
||
91 | uint32_t increase_size; //200 число символов на которые будет увечиваться память при нехватке |
||
92 | void *ptr_free_symb; // используется внутри элемента для ускорения вставки текста |
||
93 | uint32_t font_size; // ;+250 множитель для размера шрифта // binary OR mask for ECX SysFn4 |
||
94 | } editor; |
||
95 | |||
96 | struct __attribute__ ((__packed__)) editor_color_item |
||
97 | { |
||
98 | char word[40]; // слово для подсветки |
||
99 | uint32_t f1_offset; // смещение в таблице F1 подсказок |
||
100 | uint8_t flags; // флаги используемые при выделении |
||
101 | uint8_t endc; // символ конца выделения (используется при flags&4) |
||
102 | uint8_t escc; // экранирующий символ (используется при flags&4) ascii(34) примеры экранирования \r \n \t |
||
103 | uint8_t color; // цвет по таблице цветов |
||
104 | }; |
||
105 | |||
106 | struct editor_syntax_file |
||
107 | { |
||
108 | uint32_t count_colors_text; // кол-во цветов текста dd (text-color_wnd_text)/4 |
||
109 | uint32_t count_key_words; // кол-во ключевых слов dd (f1-text)/48 |
||
110 | color_t color_cursor; // dd 0xf1fcd0 |
||
111 | color_t color_wnd_capt; // dd 0x080808 |
||
112 | color_t color_wnd_work; // dd 0x1C1C1C |
||
113 | color_t color_wnd_bord; // dd 0xc0c0c0 |
||
114 | color_t color_select; // dd 0x3E3D32 |
||
115 | color_t color_cur_text; // dd 0x808080 |
||
116 | color_t color_wnd_text[]; // таблица цветов размером count_colors_text |
||
117 | // editor_color_item[]; // таблица ключевых подсвеченных слов размером count_key_words |
||
118 | }; |
||
119 | |||
120 | |||
121 | static struct editor_syntax_file default_syntax = { |
||
122 | 10, //count_colors_text |
||
6601 | siemargl | 123 | 1, // count_key_words dd (f1-text)/48, minimum 1 |
6589 | siemargl | 124 | 0xf1fcd0, //color_cursor dd 0xf1fcd0 |
125 | 0x080808, //color_wnd_capt dd 0x080808 |
||
126 | 0x1C1C1C, //color_wnd_work dd 0x1C1C1C |
||
127 | 0xc0c0c0, //color_wnd_bord dd 0xc0c0c0 |
||
128 | 0x3E3D32, //color_select dd 0x3E3D32 |
||
129 | 0x808080, //color_cur_text dd 0x808080 |
||
130 | {0xD0D0D0, 0xffff00, 0x00ff00, 0x00ffff, 0x808080, 0xff40ff, 0x4080ff, 0xff0000, 0x8080ff, 0x00ccff} |
||
131 | }; |
||
132 | // next structure must follow syntax definition, at least has 1 element !!! |
||
133 | static struct editor_color_item word1 = { |
||
134 | "siemargl", 1, 0, 0, 1 // test word colored as 1st in table |
||
135 | }; |
||
136 | // next structure preferably follow syntax definition, at least has 1 element !!! |
||
137 | static char f1_table[] = { |
||
138 | "\0" |
||
139 | "First\0" |
||
140 | "Last\0" |
||
141 | }; |
||
142 | |||
143 | |||
144 | extern void (*ted_draw)(editor *) __attribute__((__stdcall__)); |
||
145 | extern void (*ted_init_scroll_bars)(editor *, int opt) __attribute__((__stdcall__)); |
||
146 | /// opt bits = 1 - менять цвет скроллингов, 2 - изменились размеры окна, 4 - изменились размеры документа |
||
147 | extern void (*ted_init_syntax_file)(editor *) __attribute__((__stdcall__)); |
||
148 | extern void (*ted_mouse)(editor *) __attribute__((__stdcall__)); |
||
149 | extern void (*ted_text_add)(editor *, char *text, int textlen, int opt) __attribute__((__stdcall__)); |
||
150 | /// add text to cursor pos |
||
151 | /// opt == ted_opt_ed_change_time, ted_opt_ed_move_cursor |
||
152 | ///ted_opt_ed_move_cursor equ 1 ;двигать курсор после добавления текста |
||
153 | ///ted_opt_ed_change_time equ 2 ;добавлять изменения при редактировании текста |
||
154 | extern void (*ted_but_select_word)(editor *) __attribute__((__stdcall__)); |
||
155 | /// select word under cursor |
||
156 | extern void (*ted_but_copy)(editor *) __attribute__((__stdcall__)); |
||
157 | extern void (*ted_but_paste)(editor *) __attribute__((__stdcall__)); |
||
158 | |||
159 | extern void (*ted_but_find_next)(editor *) __attribute__((__stdcall__)); |
||
160 | ///move cursor to |
||
161 | |||
162 | |||
163 | |||
6615 | siemargl | 164 | extern void (*ted_but_sumb_upper)(editor *) __attribute__((__stdcall__)); |
6589 | siemargl | 165 | |
6615 | siemargl | 166 | extern void (*ted_but_sumb_lover)(editor *) __attribute__((__stdcall__)); |
6589 | siemargl | 167 | |
6615 | siemargl | 168 | extern void (*ted_but_convert_by_table)(editor *, char* table) __attribute__((__stdcall__)); |
6589 | siemargl | 169 | |
6601 | siemargl | 170 | /// return 1 if need to be saved (has changes), 0 otherwise |
6615 | siemargl | 171 | extern int (*ted_can_save)(editor *) __attribute__((__stdcall__)); |
6589 | siemargl | 172 | |
173 | /// all==1 - clear all memory |
||
6615 | siemargl | 174 | extern void (*ted_clear)(editor *, int all) __attribute__((__stdcall__)); |
6589 | siemargl | 175 | |
6615 | siemargl | 176 | extern void (*ted_delete)(editor *) __attribute__((__stdcall__)); |
6589 | siemargl | 177 | static inline void editor_delete(editor *ed) |
178 | /// frees all memory (destroy) |
||
179 | { |
||
6615 | siemargl | 180 | (*ted_delete)(ed); |
6589 | siemargl | 181 | free(ed->scr_w); |
182 | free(ed->scr_h); |
||
183 | free(ed->buffer); |
||
184 | free(ed->buffer_find); |
||
185 | } |
||
186 | |||
187 | /// allocate memory |
||
6615 | siemargl | 188 | extern void (*ted_init)(editor *) __attribute__((__stdcall__)); |
6589 | siemargl | 189 | |
6615 | siemargl | 190 | /// return 1 if have selection |
6589 | siemargl | 191 | extern int (*ted_is_select)(editor *) __attribute__((__stdcall__)); |
192 | |||
193 | enum control_keys { |
||
194 | KM_SHIFT = 0x00010000, |
||
195 | KM_CTRL = 0x00020000, |
||
196 | KM_ALT = 0x00040000, |
||
197 | KM_NUMLOCK = 0x00080000 |
||
198 | }; |
||
199 | |||
200 | extern void (*ted_key_asm)(editor *, char* table, int control) __attribute__((__stdcall__)); |
||
6612 | siemargl | 201 | static inline __attribute__((__stdcall__)) void editor_keyboard(editor *ed, char* table, enum control_keys control, int ch) |
6589 | siemargl | 202 | /// control is KM_SHIFT, KM_ALT, KM_CTRL, KM_NUMLOCK, |
203 | /// ch = GET_KEY |
||
204 | /// table = SF_SYSTEM_GET,SSF_KEYBOARD_LAYOUT |
||
205 | { |
||
206 | __asm__ __volatile__ ( |
||
6612 | siemargl | 207 | "push %4\n\t" |
208 | "push %3\n\t" |
||
209 | "push %2\n\t" |
||
210 | "call *%1 \n\t"::"a"(ch), "m"(ted_key_asm), "m"(ed), "m"(table), "m"(control):); |
||
211 | /* |
||
212 | __asm__ __volatile__ ( |
||
6589 | siemargl | 213 | "nop \n\t"::"a"(ch):); |
214 | (*ted_key_asm)(ed, table, control); |
||
6612 | siemargl | 215 | */ |
6589 | siemargl | 216 | } |
217 | |||
218 | extern void (*ted_open_file_asm)(editor *, struct fs_dirinfo*, char *fname) __attribute__((__stdcall__)); |
||
219 | static inline int editor_openfile(editor *ed, char *fname, int *readbytes) |
||
220 | /// returns errcode as SysFn70 |
||
221 | { |
||
222 | int ret; |
||
223 | struct fs_dirinfo di; |
||
224 | __asm__ __volatile__ ( |
||
6601 | siemargl | 225 | "push %%edi \n\t":::); |
6589 | siemargl | 226 | |
227 | (*ted_open_file_asm)(ed, &di, fname); |
||
228 | |||
229 | __asm__ __volatile__ ( |
||
6601 | siemargl | 230 | "pop %%edi \n\t":"=b"(*readbytes), "=a"(ret)::); |
6589 | siemargl | 231 | return ret; |
232 | } |
||
233 | |||
234 | extern void (*ted_save_file_asm)(editor *, struct fs_dirinfo*, char *fname) __attribute__((__stdcall__)); |
||
235 | static inline int editor_savefile(editor *ed, char *fname) |
||
236 | /// returns errcode, calls fun_save_err() if exists |
||
237 | { |
||
238 | struct fs_dirinfo di; |
||
239 | |||
240 | (*ted_save_file_asm)(ed, &di, fname); |
||
241 | |||
242 | return ed->err_save; |
||
243 | } |
||
244 | |||
245 | extern void (*ted_but_cut)(editor *) __attribute__((__stdcall__)); |
||
246 | |||
247 | extern void (*ted_but_undo)(editor *) __attribute__((__stdcall__)); |
||
248 | |||
249 | extern void (*ted_but_redo)(editor *) __attribute__((__stdcall__)); |
||
250 | |||
251 | extern void (*ted_but_reverse)(editor *) __attribute__((__stdcall__)); |
||
252 | |||
253 | extern void (*ted_text_colored_asm)() __attribute__((__stdcall__)); |
||
254 | static inline void editor_text_colored(editor *ed) |
||
255 | { |
||
256 | __asm__ __volatile__ ( |
||
6615 | siemargl | 257 | "call *%0 \n\t"::"m"(ted_text_colored_asm), "D"(ed):); |
6589 | siemargl | 258 | |
259 | } |
||
260 | |||
261 | static inline |
||
262 | uint32_t get_control_keys(void) |
||
263 | { |
||
264 | uint32_t ctrl; |
||
265 | |||
266 | __asm__ __volatile__( |
||
267 | "int $0x40 \n\t" |
||
268 | :"=a"(ctrl) |
||
269 | :"a"(66),"b"(3)); |
||
270 | |||
271 | return ctrl; |
||
272 | }; |
||
273 | |||
274 | static inline |
||
275 | int get_keyboard_layout(int opt, char* buf) |
||
276 | /// 128 byte buffer |
||
277 | /// opt: 1 - normal, 2 - shifted, 3 - alted, or 9 - return language |
||
278 | { |
||
279 | uint32_t lang; |
||
280 | |||
281 | __asm__ __volatile__( |
||
282 | "int $0x40 \n\t" |
||
283 | :"=a"(lang) |
||
284 | :"a"(26),"b"(2), "c"(opt), "d"(buf)); |
||
285 | |||
286 | return lang; |
||
287 | }; |
||
288 | |||
6612 | siemargl | 289 | __attribute__((__stdcall__)) |
290 | static void editor_key(editor* ed, oskey_t key) |
||
6589 | siemargl | 291 | // callback for gui |
292 | { |
||
6612 | siemargl | 293 | //if(ed->el_focus != ed) return; // need to check not to lose keyb buffer |
294 | |||
6589 | siemargl | 295 | uint32_t control = get_control_keys(); |
296 | enum control_keys ed_ctrl = 0; |
||
297 | int ly_opt = 1; |
||
298 | if (control & 3) { ed_ctrl |= KM_SHIFT; ly_opt = 2; } |
||
299 | if (control & 0xC) ed_ctrl |= KM_CTRL; |
||
300 | if (control & 0x30){ ed_ctrl |= KM_ALT; ly_opt = 3; } |
||
301 | if (control & 0x80) ed_ctrl |= KM_NUMLOCK; |
||
302 | |||
303 | char conv_table[128]; |
||
304 | get_keyboard_layout(ly_opt, conv_table); |
||
305 | |||
6612 | siemargl | 306 | editor_keyboard(ed, conv_table, ed_ctrl, key.val); |
6589 | siemargl | 307 | } |
308 | |||
6601 | siemargl | 309 | static inline void gui_add_editor(kolibri_window *wnd, editor* e) |
6589 | siemargl | 310 | { |
311 | kolibri_window_add_element(wnd, KOLIBRI_EDITOR, e); |
||
312 | } |
||
313 | |||
6612 | siemargl | 314 | static inline editor* kolibri_new_editor(uint32_t x_w, uint32_t y_h, uint32_t font, uint32_t max_chars, void *editor_interlock) |
6589 | siemargl | 315 | /// font - 0b10SSS 8x16 size multiply (SSS+1), 0xSSS - 6x9 multiply (SSS+1) |
316 | |||
317 | { |
||
318 | editor *ed = (editor *)calloc(1, sizeof(editor)); |
||
319 | ed->x_pos = x_w >> 16; |
||
320 | ed->width = x_w & 0xFFFF; |
||
321 | ed->y_pos = y_h >> 16; |
||
322 | ed->hight = y_h & 0xFFFF; |
||
323 | |||
6612 | siemargl | 324 | ed->w_pane = 30; |
325 | ed->h_pane = 20; |
||
6589 | siemargl | 326 | // font |
327 | if (font == 0) font = 0x10; // default 16 = 8x16 |
||
328 | int font_multipl = (font & 7) + 1; |
||
329 | ed->font_size = font << 24; |
||
330 | if (font & 0x10) // 8x16 |
||
331 | { |
||
332 | ed->width_sym = 8 * font_multipl; |
||
333 | ed->hight_sym = 16 * font_multipl; |
||
334 | } else // 6x9 |
||
335 | { |
||
336 | ed->width_sym = 6 * font_multipl; |
||
337 | ed->hight_sym = 9 * font_multipl; |
||
338 | } |
||
339 | // memory sizing for text & syntax |
||
340 | ed->max_chars = max_chars; |
||
341 | ed->increase_size = max_chars / 2; |
||
342 | ed->syntax_file_size = sizeof (default_syntax); |
||
343 | |||
344 | /* // loaded auto from syntax |
||
345 | ed->color_cursor = 0x808080; |
||
346 | ed->color_wnd_capt = 0x80; |
||
347 | ed->color_wnd_bord = 0xd0d0d0; |
||
348 | ed->color_select = 0x208080; |
||
349 | ed->color_cur_text = 0xff0000; |
||
350 | ed->color_wnd_text = 0xffff00; |
||
351 | */ |
||
352 | ed->symbol_new_line = 20; // ascii(20) |
||
353 | |||
6612 | siemargl | 354 | ed->scr_w = kolibri_new_scrollbar_def(X_Y(0, 16), X_Y(0, 0), 100, 30, 0); // cur_area will be inited ltr, max & pos undef |
355 | ed->scr_h = kolibri_new_scrollbar_def(X_Y(0, 0), X_Y(0, 16), 100, 30, 0); // cur_area will be inited ltr, max & pos undef |
||
6589 | siemargl | 356 | |
357 | ed->buffer_size = TE_BUF_SIZE; |
||
358 | ed->buffer = malloc(TE_BUF_SIZE); |
||
359 | ed->buffer_find = malloc(TE_BUF_SIZE / 8); //where to store text to search |
||
360 | |||
361 | ed->cur_ins = 1; // insert mode default |
||
362 | ed->mode_color = 1; // can select text |
||
363 | ed->mode_invis = 1; // show nonprinted symbols |
||
364 | |||
6612 | siemargl | 365 | ed->el_focus = editor_interlock; |
366 | |||
6615 | siemargl | 367 | (*ted_init)(ed); // memory allocation, cleaning |
6589 | siemargl | 368 | ed->syntax_file = (char*)&default_syntax; |
369 | (*ted_init_syntax_file)(ed); // load colors and syntax highlight |
||
370 | ed->help_text_f1 = f1_table; // override if not aligned immediately after syntax words |
||
371 | ed->key_words_data = &word1; |
||
372 | |||
373 | return ed; |
||
374 | } |
||
375 | |||
6615 | siemargl | 376 | /// return 1 if symbol is not visible (deleted or undo-ed) |
377 | static inline int editor_symbol_not_vis(editor* ed, struct editor_symbol* sym) |
||
378 | { |
||
379 | return (sym->td && sym->td + ed->tim_undo <= ed->tim_ch) || (sym->tc > ed->tim_ch - ed->tim_undo); |
||
380 | } |
||
6589 | siemargl | 381 | |
6615 | siemargl | 382 | /// returns next good symbol by index |
383 | static inline |
||
384 | uint32_t editor_iterat_next(editor* ed, uint32_t idx) |
||
385 | { |
||
386 | uint32_t i; |
||
387 | if (ed->tim_undo) |
||
388 | { |
||
389 | for (i = ed->tex[idx].next; i != 0 && (ed->tex[i].c == '\n' || editor_symbol_not_vis(ed, ed->tex + i)); i = ed->tex[i].next); |
||
390 | } else |
||
391 | { |
||
392 | for (i = ed->tex[idx].next; i != 0 && (ed->tex[i].c == '\n' || ed->tex[i].td); i = ed->tex[i].next); |
||
393 | } |
||
394 | return i; |
||
395 | } |
||
396 | |||
397 | // returns malloc'ed mem |
||
398 | static inline |
||
399 | char* editor_get_text(editor* ed) |
||
400 | { |
||
401 | char *buf = malloc(ed->max_chars), *pc = buf; |
||
402 | if (!pc) return NULL; |
||
403 | |||
404 | int i; |
||
405 | // *pc++ = ed->tex[0].c; |
||
406 | for (i = ed->tex[0].next; i; i = editor_iterat_next(ed, i)) *pc++ = ed->tex[i].c; |
||
407 | *pc++ = '\0'; |
||
408 | |||
409 | return buf; |
||
410 | } |
||
411 | |||
412 | /* |
||
413 | char* editor_get_text20(editor* ed) |
||
414 | { |
||
415 | char *buf = malloc(ed->max_chars), *pc = buf; |
||
416 | if (!pc) return NULL; |
||
417 | |||
418 | int i = ed->tex[0].next, c = 0; |
||
419 | for (; i > 0 && c < 30; c++, i = ed->tex[i].next) *pc++ = ed->tex[i].c; |
||
420 | *pc++ = '\0'; |
||
421 | |||
422 | return buf; |
||
423 | } |
||
424 | */ |
||
6589 | siemargl | 425 | #endif // KOLIBRI_EDITOR_H>=>><> |