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