Subversion Repositories Kolibri OS

Rev

Rev 7576 | Rev 7579 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ; макрос для системной библиотеки box_lib.obj
  2. ; элемент TextEditor для Kolibri OS
  3. ; файл последний раз изменялся 21.10.2018 IgorA
  4. ; на код применена GPL2 лицензия
  5.  
  6. ;input:
  7. ; edi = pointer to tedit struct
  8. ; reg = index
  9. ;output:
  10. ; reg = pointer to 'tex' struct
  11. macro ConvertIndexToPointer reg {
  12.         imul reg,sizeof.symbol
  13.         add reg,ted_tex
  14. }
  15.  
  16. ;--- out_reg = ted_key_words_data[ind_reg].Text[0] ---
  17. macro ColToIndexOffset ind_reg,out_reg {
  18.         mov out_reg,ind_reg
  19.         imul out_reg,sizeof.TexColViv
  20.         add out_reg,ted_key_words_data
  21. }
  22.  
  23. TED_PANEL_NULL  equ 0 ;нет открытой панели
  24. TED_PANEL_FIND  equ 1 ;панель поиска
  25. TED_PANEL_SYNTAX equ 2 ;панель выбора файлов подсветки
  26. TED_PANEL_REPLACE equ 3 ;панель замены
  27. TED_PANEL_WIDTH equ 150 ;ширина панели
  28.  
  29. TED_LINES_IN_NEW_FILE equ 30 ;число строк в новом файле
  30. MAX_COLOR_WORD_LEN equ 40
  31. ;------------------------------------------------------------------------------
  32. struct TexSelect
  33.         x0 dd ?
  34.         y0 dd ?
  35.         x1 dd ?
  36.         y1 dd ?
  37. ends
  38.  
  39. struct TexColViv
  40.         Text  rb MAX_COLOR_WORD_LEN ; слово для подсветки
  41.         f1    dd 0 ; справка по слову
  42.         flags db ? ; f1+4 флаги используемые при выделении
  43.         endc  db ? ; f1+5 символ конца выделения (используется при flags&4)
  44.         escc  db ? ; f1+6 экранирующий символ (используется при flags&4)
  45.         color db ? ; f1+7 номер цвета
  46. ends
  47.  
  48. struct symbol
  49.         c db ?    ;  +0 символ
  50.         col db ?  ;  +1 цвет
  51.         perv dd ? ;  +2
  52.         next dd ? ;  +6 указатели
  53.         tc dd ?   ; +10 врем. создания
  54.         td dd ?   ; +14 врем. удаления
  55. ends
  56. ;------------------------------------------------------------------------------
  57.  
  58. ted_symbol_space db 32 ;ascii код пробела, иногда бывает нужен в коде
  59. ted_symbol_tab db 26 ;ascii код стрелки вправо, используется для рисования табуляции в режиме показа невидимых символов
  60.  
  61. if lang eq ru
  62.  
  63. txtRow db 'Строка',0
  64. txtCol db 'Знак',0
  65. txtOtm db 'Отмены',0
  66. txtBuf db 'Буфер:',0
  67.  
  68. else
  69.  
  70. txtRow db 'Rows',0
  71. txtCol db 'Cols',0
  72. txtOtm db 'Undo',0
  73. txtBuf db 'Buffer:',0
  74.  
  75. end if
  76.  
  77. ;EvChar - таблица для фильтрования добавляемых символов, что-бы не попали лишние знаки
  78. align 16
  79. EvChar db 0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0
  80.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  81.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  82.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  83.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  84.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  85.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  86.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
  87.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  88.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  89.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  90.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  91.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  92.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  93.     db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  94.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  95.  
  96. KM_SHIFT equ 0x00010000
  97. KM_CTRL equ 0x00020000
  98. KM_ALT equ 0x00040000
  99. KM_NUMLOCK equ 0x00080000
  100.  
  101. ; KEY CODES
  102. KEY_F1 equ 0x0000003B
  103. KEY_F2 equ 0x0000003C
  104. KEY_F3 equ 0x0000003D
  105.  
  106.  
  107.  
  108. align 16
  109. proc ted_init uses eax ecx edi, edit:dword
  110.         mov edi,[edit]
  111.  
  112.         mov ecx,sizeof.symbol
  113.         imul ecx,ted_max_chars
  114.         invoke mem.alloc,ecx ;выделяем память
  115.         mov ted_tex,eax
  116.         mov ted_tex_1,eax
  117.         add ted_tex_1,sizeof.symbol
  118.         add eax,ecx
  119.         mov ted_tex_end,eax
  120.  
  121.         stdcall ted_clear, edi,1
  122.  
  123. ;-------------------------------------------------
  124.         mov ecx,1024 ;1024 - для массива ted_arr_key_pos
  125.         add ecx,ted_syntax_file_size
  126.         invoke mem.alloc,ecx
  127.         mov ted_arr_key_pos,eax
  128.         add eax,1024
  129.         mov ted_syntax_file,eax
  130.  
  131.         stdcall ted_init_scroll_bars,edi,3
  132.         ret
  133. endp
  134.  
  135. MIN_W_SCRL_ARE equ 3 ;минимальная отображаемая область для верт. скроллинга
  136. MIN_H_SCRL_ARE equ 3 ;минимальная отображаемая область для гориз. скроллинга
  137. ;input:
  138. ; opt = 1 - менять цвет скроллингов, 2 - изменились размеры окна,
  139. ;  4 - изменились размеры документа
  140. align 16
  141. proc ted_init_scroll_bars, edit:dword, opt:dword
  142.         pushad
  143.         mov edi,[edit]
  144.         mov esi,ted_scr_w
  145.         mov ebx,ted_scr_h
  146.         bt dword[opt],0
  147.         jae @f
  148.                 mov ecx,ted_color_wnd_work
  149.                 mov dword[esi+sb_offs_bckg_col],ecx
  150.                 mov dword[ebx+sb_offs_bckg_col],ecx
  151.                 mov ecx,ted_color_wnd_capt
  152.                 mov dword[esi+sb_offs_frnt_col],ecx
  153.                 mov dword[ebx+sb_offs_frnt_col],ecx
  154.                 mov ecx,ted_color_wnd_bord
  155.                 mov dword[esi+sb_offs_line_col],ecx
  156.                 mov dword[ebx+sb_offs_line_col],ecx
  157.         @@:
  158.         bt dword[opt],2 ; изменились размеры документа ?
  159.         jae .doc_resize
  160.                 call ted_get_num_lines
  161.                 cmp eax,TED_LINES_IN_NEW_FILE
  162.                 jge @f
  163.                         mov eax,TED_LINES_IN_NEW_FILE
  164.                 @@:
  165.                 mov dword[esi+sb_offs_max_area],eax
  166.         .doc_resize:
  167.         bt dword[opt],1 ; изменились размеры окна ?
  168.         jae .no_size
  169.                         mov edx,ted_wnd_l
  170.                         add edx,ted_rec_l
  171.                         mov word[ebx+sb_offs_start_x],dx ;выставляем левый отступ гориз. скроллинга
  172.                         mov eax,ted_wnd_h ;calculate lines in page
  173.                         mov edx,ted_wnd_t
  174.                         add edx,eax
  175.                         mov word[ebx+sb_offs_start_y],dx ;выставляем верхний отступ гориз. скроллинга
  176.                 sub eax,ted_rec_t
  177.                 xor edx,edx
  178.                 mov ecx,ted_rec_h
  179.                 div ecx
  180.                 cmp eax,MIN_W_SCRL_ARE
  181.                 jg @f
  182.                         mov eax,MIN_W_SCRL_ARE
  183.                 @@:
  184.                 mov dword[esi+sb_offs_cur_area],eax
  185.  
  186.                 mov eax,ted_wnd_w ;calculate cols in page
  187.                         mov edx,ted_wnd_l ;левый отступ окна
  188.                         add edx,eax ;добавляем ширину окна
  189.                         mov word[esi+sb_offs_start_x],dx ;выставляем левый отступ верт. скроллинга
  190.                         mov edx,ted_wnd_t
  191.                         mov word[esi+sb_offs_start_y],dx ;выставляем верхний отступ верт. скроллинга
  192.                         mov edx,ted_wnd_h
  193.                         mov word[esi+sb_offs_size_y],dx ;выставляем высоту верт. скроллинга
  194.                 sub eax,ted_rec_l
  195.                         mov word[ebx+sb_offs_size_x],ax ;выставляем ширину гориз. скроллинга
  196.                 xor edx,edx
  197.                 mov ecx,ted_rec_w
  198.                 div ecx
  199.                 cmp eax,MIN_H_SCRL_ARE
  200.                 jg @f
  201.                         mov eax,MIN_H_SCRL_ARE
  202.                 @@:
  203.                 dec eax
  204.                 mov dword[ebx+sb_offs_cur_area],eax ;устанавливаем число символов, которые влазят в экран для гориз. скроллинга
  205.         .no_size:
  206.         popad
  207.         ret
  208. endp
  209.  
  210. align 16
  211. proc ted_delete uses edi, edit:dword
  212.         mov edi,[edit]
  213.         invoke mem.free,ted_tex
  214.         invoke mem.free,ted_arr_key_pos ;ted_syntax_file
  215.         ret
  216. endp
  217.  
  218.  
  219. ;input:
  220. ; eax = key kodes
  221. align 16
  222. proc ted_key, edit:dword, table:dword, control:dword
  223.         pushad
  224.         mov edi,[edit]
  225.         mov esi,ted_el_focus
  226.         cmp dword[esi],edi
  227.         jne .end_key_fun ;элемент не в фокусе выходим из функции
  228.         mov esi,dword[control]
  229.  
  230.         cmp ah,KEY_F1 ;[F1]
  231.         jne @f
  232.                 stdcall ted_show_help_f1,edi
  233.                 jmp .end_key_fun
  234.         @@:
  235.         cmp ah,KEY_F3 ;[F3]
  236.         jne @f
  237.                 stdcall ted_but_find,edi,0
  238.                 jmp .end_key_fun
  239.         @@:
  240.  
  241.         test esi,KM_CTRL ;Ctrl+...
  242.         jz .key_Ctrl
  243.                 ; *** вызов внешних функций которые требуют окна открытия/сохранения/поиска/...
  244.                 cmp ah,24 ;Ctrl+O
  245.                 jne @f
  246.                         cmp ted_fun_on_key_ctrl_o,0
  247.                         je .end_key_fun
  248.                                 call ted_fun_on_key_ctrl_o
  249.                 @@:
  250.                 cmp ah,31 ;Ctrl+S
  251.                 jne .end_ctrl_s
  252.                         cmp ted_fun_on_key_ctrl_s,0
  253.                         je .end_key_fun
  254.                                 xor eax,eax
  255.                                 test esi,KM_SHIFT
  256.                                 jz @f
  257.                                         inc eax
  258.                                 @@:                            
  259.                                 call ted_fun_on_key_ctrl_s
  260.                                 jmp .end_key_fun
  261.                 .end_ctrl_s:
  262.                 cmp ah,33 ;Ctrl+F
  263.                 jne @f
  264.                 cmp ted_panel_id,TED_PANEL_FIND
  265.                 je @f
  266.                         cmp ted_fun_on_key_ctrl_f,0
  267.                         je .end_key_fun
  268.                                 call ted_fun_on_key_ctrl_f
  269.                 @@:
  270.                 cmp ah,49 ;Ctrl+N
  271.                 jne @f
  272.                         cmp ted_fun_on_key_ctrl_n,0
  273.                         je .end_key_fun
  274.                                 call ted_fun_on_key_ctrl_n
  275.                 @@:
  276.                 ; *** вызов внутренних функций
  277.                 cmp ah,30 ;Ctrl+A
  278.                 jne @f
  279.                         call ted_sel_all
  280.                 @@:
  281.                 cmp ah,44 ;Ctrl+Z
  282.                 jne @f
  283.                         stdcall ted_but_undo,edi
  284.                 @@:
  285.                 cmp ah,45 ;Ctrl+X
  286.                 jne @f
  287.                         stdcall ted_but_cut,edi
  288.                 @@:
  289.                 cmp ah,46 ;Ctrl+C
  290.                 jne @f
  291.                         stdcall ted_but_copy,edi
  292.                 @@:
  293.                 cmp ah,47 ;Ctrl+V
  294.                 jne @f
  295.                         stdcall ted_but_paste,edi
  296.                 @@:
  297.                 cmp ah,199 ;Ctrl+Home
  298.                 jne @f
  299.                         call ted_key_ctrl_home
  300.                 @@:
  301.                 cmp ah,207 ;Ctrl+End
  302.                 jne @f
  303.                         call ted_key_ctrl_end
  304.                 @@:
  305.                 jmp .end_key_fun
  306.         .key_Ctrl:
  307.  
  308.         test esi,KM_SHIFT ;Shift+...
  309.         jz .key_Shift
  310.                 cmp ah,72 ;Shift+Up
  311.                 jne @f
  312.                         call ted_sel_key_up
  313.                 @@:
  314.                 cmp ah,75 ;Shift+Left
  315.                 jne @f
  316.                         call ted_sel_key_left
  317.                 @@:
  318.                 cmp ah,77 ;Shift+Right
  319.                 jne @f
  320.                         call ted_sel_key_right
  321.                 @@:
  322.                 cmp ah,80 ;Shift+Down
  323.                 jne @f
  324.                         call ted_sel_key_down
  325.                 @@:
  326.                 ;mov ted_drag_k,1 ;начинаем выделение от клавиатуры
  327.                 jmp .key_MoveCur
  328.         .key_Shift:
  329. ;-------------------------------------------------
  330.         cmp ah,72 ;178 ;Up
  331.         jne @f
  332.                 call ted_draw_cursor_sumb
  333.                 call ted_cur_move_up
  334.                 cmp dl,8
  335.                 jne .no_red_0
  336.                         call ted_scroll_set_redraw
  337.                         stdcall ted_draw,edi
  338.                         jmp @f
  339.                 .no_red_0:
  340.                 call ted_draw_main_cursor
  341.                 mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  342.         @@:
  343.         cmp ah,80 ;177 ;Down
  344.         jne @f
  345.                 call ted_draw_cursor_sumb
  346.                 call ted_cur_move_down
  347.                 cmp dl,8
  348.                 jne .no_red_1
  349.                         call ted_scroll_set_redraw
  350.                         stdcall ted_draw,edi
  351.                         jmp @f
  352.                 .no_red_1:
  353.                 call ted_draw_main_cursor
  354.                 mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  355.         @@:
  356.         cmp ah,75 ;176 ;Left
  357.         jne @f
  358.                 call ted_draw_cursor_sumb
  359.                 call ted_cur_move_left
  360.                 cmp dl,8
  361.                 jne .no_red_2
  362.                         call ted_scroll_set_redraw
  363.                         stdcall ted_draw,edi
  364.                         jmp @f
  365.                 .no_red_2:
  366.                 call ted_draw_main_cursor
  367.                 mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  368.         @@:
  369.         cmp ah,77 ;179 ;Right
  370.         jne @f
  371.                 call ted_draw_cursor_sumb
  372.                 call ted_cur_move_right
  373.                 cmp dl,8
  374.                 jne .no_red_3
  375.                         call ted_scroll_set_redraw
  376.                         stdcall ted_draw,edi
  377.                         jmp @f
  378.                 .no_red_3:
  379.                 call ted_draw_main_cursor
  380.                 mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  381.         @@:
  382.         cmp ah,71 ;180 ;Home
  383.         jne @f
  384.                 call ted_draw_cursor_sumb
  385.                 call ted_cur_move_x_first_char
  386.                 cmp dl,8
  387.                 jne .no_red_4
  388.                         call ted_scroll_set_redraw
  389.                         stdcall ted_draw,edi
  390.                         jmp @f
  391.                 .no_red_4:
  392.                 call ted_draw_main_cursor
  393.                 mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  394.         @@:
  395.         cmp ah,79 ;181 ;End
  396.         jne @f
  397.                 call ted_draw_cursor_sumb
  398.                 call ted_cur_move_x_last_char
  399.                 cmp dl,8
  400.                 jne .no_red_5
  401.                         call ted_scroll_set_redraw
  402.                         stdcall ted_draw,edi
  403.                         jmp @f
  404.                 .no_red_5:
  405.                 call ted_draw_main_cursor
  406.                 mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  407.         @@:
  408.         cmp ah,73 ;184 ;PageUp
  409.         jne @f
  410.                 call ted_cur_move_page_up
  411.                 cmp dl,0
  412.                 je @f
  413.                 call ted_scroll_set_redraw
  414.                 stdcall ted_draw,edi
  415.         @@:
  416.         cmp ah,81 ;183 ;PageDown
  417.         jne @f
  418.                 call ted_cur_move_page_down
  419.                 cmp dl,0
  420.                 je @f
  421.                 call ted_scroll_set_redraw
  422.                 stdcall ted_draw,edi
  423.                 mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  424.         @@:
  425. ;-------------------------------------------------
  426.         .key_MoveCur:
  427.  
  428.         ;ниже пропускаются служебные клавиши, которые могут давать мусорные символы в окно
  429.         cmp ah,42 ;[L Shift] когда нажат без других кнопок
  430.         je .end_key_fun
  431.         cmp ah,54 ;[R Shift] когда нажат без других кнопок
  432.         je .end_key_fun
  433.         cmp ah,58 ;[Caps Lock]
  434.         je .end_key_fun
  435.         cmp ah,69 ;[Pause Break]
  436.         je .end_key_fun
  437.         cmp ah,120 ;[Fn]
  438.         je .end_key_fun
  439.         cmp ah,0x80 ;if key up
  440.         ja .end_key_fun
  441.  
  442.         cmp dword[table],0
  443.         je @f
  444.                 stdcall KeyConvertToASCII, dword[table]
  445.         @@:
  446.  
  447.         ;mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  448.  
  449.         lea edx,[EvChar] ;берем адрес таблицы с допустимыми символами
  450.         add dl,ah
  451.         jae @f
  452.                 add edx,0x100 ;если было переполнение при добавлении кода символа
  453.         @@:
  454.         cmp byte[edx],1
  455.         jne @f
  456.                 mov ted_key_new,ah
  457.                 call ted_set_undo
  458.                 mov edx,ted_opt_ed_change_time+ted_opt_ed_move_cursor
  459.                 stdcall ted_sel_text_del,edx
  460.                 cmp al,1
  461.                 jne .del
  462.                         mov edx,ted_opt_ed_move_cursor
  463.                 .del:
  464.                 cmp ted_cur_ins,1
  465.                 je .no_ins_mod
  466.                         stdcall ted_text_del,edi,ted_opt_ed_change_time
  467.                         mov edx,ted_opt_ed_move_cursor
  468.                 .no_ins_mod:
  469.                 mov ecx,edi
  470.                 add ecx,ted_offs_key_new
  471.                 stdcall ted_text_add,edi,ecx,1,edx ;добавляем символ введенный с клавиатуры
  472.                 cmp ted_key_new,13
  473.                 jne .dr_m_win
  474.                         ;если вставили символ новой строки
  475.                         mov ecx,ted_scr_w
  476.                         inc dword[ecx+sb_offs_max_area] ;увеличиваем размер вертикального скроллинга
  477.                         mov edx,ted_cur_y
  478.                         cmp edx,[ecx+sb_offs_cur_area]
  479.                         jl .no_change
  480.                                 dec ted_cur_y ;курсор оставляем на месте
  481.                                 inc dword[ecx+sb_offs_position] ;сдвигаем ползунок
  482.                         .no_change:
  483.                         stdcall ted_draw,edi
  484.                         jmp .dr_cur_l
  485.                 .dr_m_win:
  486.                         stdcall ted_draw_cur_line,edi
  487.                 .dr_cur_l:
  488.                 cmp ted_fun_draw_panel_buttons,0
  489.                 je @f
  490.                         call ted_fun_draw_panel_buttons
  491.         @@:
  492.  
  493.         cmp ah,8 ;[<-]
  494.         jne @f
  495.                 call ted_set_undo
  496.                 stdcall ted_sel_text_del,ted_opt_ed_change_time
  497.                 cmp al,1
  498.                 je .del_one_b
  499.                         stdcall ted_text_del,edi,ted_opt_ed_change_time+ted_opt_ed_move_cursor
  500.                 .del_one_b:
  501.                 stdcall ted_draw,edi
  502.                 cmp ted_fun_draw_panel_buttons,0
  503.                 je .end_key_fun
  504.                         call ted_fun_draw_panel_buttons
  505.                 jmp .end_key_fun
  506. align 4
  507.         @@:
  508.  
  509.         cmp ah,182 ;Delete
  510.         jne @f
  511.                 call ted_set_undo
  512.                 stdcall ted_sel_text_del,ted_opt_ed_change_time
  513.                 cmp al,1
  514.                 je .del_one_d
  515.                         stdcall ted_text_del,edi,ted_opt_ed_change_time
  516.                 .del_one_d:
  517.                 stdcall ted_draw,edi
  518.                 cmp ted_fun_draw_panel_buttons,0
  519.                 je .end_key_fun
  520.                         call ted_fun_draw_panel_buttons
  521.                 jmp .end_key_fun
  522.         @@:
  523.  
  524.         cmp ah,185 ;Ins
  525.         jne @f
  526.                 call ted_draw_cursor_sumb
  527.                 xor ted_cur_ins,1
  528.                 call ted_draw_main_cursor
  529.         @@:
  530.  
  531.         .end_key_fun:
  532.         popad
  533.         ret
  534. endp
  535.  
  536. ;output:
  537. ; al = 1 - can save
  538. align 16
  539. proc ted_can_save uses ecx edi, edit:dword
  540.         mov edi,[edit]
  541.  
  542.         mov ecx,ted_tim_ch
  543.         sub ecx,ted_tim_undo
  544.         mov al,1
  545.         cmp ted_tim_ls,ecx
  546.         jne @f
  547.                 dec al
  548.         @@:
  549.         ret
  550. endp
  551.  
  552. ;input:
  553. ; edi = pointer to tedit struct
  554. ;output:
  555. ; al = 1 - selected
  556. align 16
  557. proc ted_is_select uses ebx
  558.         xor al,al
  559.         cmp ted_drag_m,1
  560.         je @f
  561.                 inc al
  562.                 mov ebx,ted_sel_x0
  563.                 cmp ebx,ted_sel_x1
  564.                 jne @f
  565.                 mov ebx,ted_sel_y0
  566.                 cmp ebx,ted_sel_y1
  567.                 jne @f
  568.                 xor al,al
  569.         @@:
  570.         ret
  571. endp
  572.  
  573. ;input:
  574. ; edi = pointer to tedit struct
  575. align 16
  576. proc ted_sel_normalize uses ecx esi
  577.         push edi
  578.                 mov esi,edi
  579.                 add esi,ted_offs_sel
  580.                 add edi,ted_offs_seln
  581.                 mov ecx,sizeof.TexSelect/4
  582.                 rep movsd
  583.         pop edi
  584.  
  585.         jmp @f
  586.                 .swp_f:
  587.                 mov ecx,ted_seln_x0
  588.                 m2m ted_seln_x0,ted_seln_x1
  589.                 mov ted_seln_x1,ecx
  590.  
  591.                 mov ecx,ted_seln_y0
  592.                 cmp ecx,ted_seln_y1 ;(sel_y0>sel_y1)
  593.                 jle .end_f
  594.                 m2m ted_seln_y0,ted_seln_y1
  595.                 mov ted_seln_y1,ecx
  596.  
  597.                 jmp .end_f
  598. align 4
  599.         @@:
  600.  
  601.         mov ecx,ted_seln_y0
  602.         cmp ecx,ted_seln_y1 ;(sel_y0>sel_y1)
  603.         jg .swp_f
  604.  
  605.         cmp ecx,ted_seln_y1 ;(sel_y0==sel_y1)
  606.         jne .end_f
  607.                 mov ecx,ted_seln_x0
  608.                 cmp ecx,ted_seln_x1 ;(sel_x0>sel_x1)
  609.                 jg .swp_f
  610.  
  611.         .end_f:
  612.         ret
  613. endp
  614.  
  615. ;input:
  616. ; edi = pointer to tedit struct
  617. ;description:
  618. ; Функция вызываемая при начале выделения
  619. align 16
  620. proc ted_sel_start uses eax ecx
  621.         mov eax,ted_scr_h
  622.         mov ecx,ted_cur_x
  623.         add ecx,[eax+sb_offs_position]
  624.         mov ted_sel_x0,ecx
  625.         mov ted_sel_x1,ecx
  626.  
  627.         mov eax,ted_scr_w
  628.         mov ecx,ted_cur_y
  629.         add ecx,[eax+sb_offs_position]
  630.         mov ted_sel_y0,ecx
  631.         mov ted_sel_y1,ecx
  632.         ret
  633. endp
  634.  
  635. ;input:
  636. ; edi = pointer to tedit struct
  637. ;description:
  638. ; Функция вызываемая при перемещении выделения
  639. align 16
  640. proc ted_sel_move
  641.         push eax ecx
  642.                 mov ecx,ted_cur_x
  643.                 mov eax,ted_scr_h
  644.                 add ecx,[eax+sb_offs_position]
  645.                 mov ted_sel_x1,ecx
  646.  
  647.                 mov eax,ted_scr_w
  648.                 mov ecx,ted_cur_y
  649.                 add ecx,[eax+sb_offs_position]
  650.                 mov ted_sel_y1,ecx
  651.         pop ecx eax
  652.         cmp ted_fun_draw_panel_buttons,0 ;redraw toolbar (need to button Copy)
  653.         je @f
  654.                 call ted_fun_draw_panel_buttons
  655.         @@:
  656.         ret
  657. endp
  658.  
  659. ;input:
  660. ; edi = pointer to tedit struct
  661. ;description:
  662. ; Функция вызываемая при выделении всего документа
  663. align 16
  664. proc ted_sel_all
  665.         push eax
  666.                 xor eax,eax
  667.                 mov ted_sel_x0,eax
  668.                 mov ted_sel_y0,eax
  669.  
  670.                 mov ted_sel_x1,eax ;???
  671.                 call ted_get_num_lines
  672.                 mov ted_sel_y1,eax
  673.         pop eax
  674.         stdcall ted_draw,edi
  675.         cmp ted_fun_draw_panel_buttons,0 ;redraw toolbar (need to button Copy)
  676.         je @f
  677.                 call ted_fun_draw_panel_buttons
  678.         @@:
  679.         ret
  680. endp
  681.  
  682. ;input:
  683. ; cl_al_mem = 1 - clear all memory
  684. align 16
  685. proc ted_clear uses ecx edi, edit:dword, cl_al_mem:dword
  686.         mov edi,[edit]
  687.  
  688.         mov ted_cur_x,0
  689.         mov ted_cur_y,0
  690.         mov ted_tim_ch,0
  691.         mov ted_tim_ls,0
  692.         mov ted_tim_co,0
  693.         mov ted_tim_undo,0
  694.         mov ted_help_id,-1
  695.         mov ecx,sizeof.symbol
  696.         shl ecx,1
  697.         add ecx,ted_tex
  698.         mov ted_ptr_free_symb,ecx
  699.  
  700.         mov ecx,ted_scr_w
  701.         mov dword[ecx+sb_offs_position],0
  702.         mov dword[ecx+sb_offs_max_area],100 ;число строк видимых в новом документе
  703.         mov dword[ecx+sb_offs_redraw],1
  704.         mov ecx,ted_scr_h
  705.         mov dword[ecx+sb_offs_position],0
  706.         mov dword[ecx+sb_offs_max_area],100 ;число символов видимых в новом документе
  707.  
  708.         mov ted_sel_x0,0
  709.         mov ted_sel_y0,0
  710.         mov ted_sel_x1,0
  711.         mov ted_sel_y1,0
  712.  
  713.         cmp dword[cl_al_mem],0
  714.         je .exit
  715.  
  716.         push edx
  717.         mov ecx,sizeof.symbol
  718.         imul ecx,ted_max_chars
  719.         mov edx,ted_tex
  720.         @@:
  721.                 mov byte [edx],0
  722.                 inc edx
  723.         loop @b
  724.         mov edx,ted_tex
  725.         mov dword [edx+6],1
  726.         pop edx
  727.  
  728.         .exit:
  729.         ret
  730. endp
  731.  
  732.  
  733. align 16
  734. proc ted_init_syntax_file, edit:dword
  735.         pushad
  736.         mov edi,[edit]
  737.  
  738.         mov ecx,0x100
  739.         mov edx,ted_arr_key_pos
  740.         @@:
  741.                 mov dword[edx],-1
  742.                 add edx,4
  743.         loop @b
  744.  
  745.         ;init: ted_colors_text_count, ted_key_words_count, ...
  746.         mov ted_colors_text_count,1
  747.         mov ted_key_words_count,0
  748.         mov ted_help_text_f1,0
  749.         mov ted_help_id,-1 ;идентификатор слова для справки
  750.  
  751.         mov eax,edi ;сохраняем значение edi
  752.         mov esi,ted_syntax_file
  753.         add edi,ted_offs_count_colors
  754.         mov ecx,9
  755.         rep movsd
  756.         mov edi,eax ;востанавливаем значение edi
  757.  
  758.         mov eax,ted_syntax_file
  759.         add eax,32
  760.         mov ted_text_colors,eax
  761.  
  762.         mov eax,ted_colors_text_count ;init: count_colors_text (offset to key words)
  763.         lea eax,[4*eax+32]
  764.         add eax,ted_syntax_file
  765.         mov ted_key_words_data,eax
  766.  
  767.         mov ecx,ted_key_words_count ;init: ted_arr_key_pos (first key positions)
  768.         xor eax,eax
  769.         @@:
  770.                 ColToIndexOffset eax,edx
  771.                 movzx ebx,byte[edx]
  772.                 mov esi,ted_arr_key_pos
  773.                 lea esi,[esi+4*ebx]
  774.                 cmp dword[esi],-1
  775.                 jne .no_ch_key
  776.                         mov [esi],eax
  777.                 .no_ch_key:
  778.                 inc eax
  779.         loop @b
  780.  
  781.         ;init: ted_help_text_f1
  782.         mov ecx,ted_key_words_count ;количество ключевых слов
  783.         imul ecx,sizeof.TexColViv   ;размер структуры с 1-м кл. сл.
  784.         add ecx,ted_key_words_data  ;начало файла с кл. сл.
  785.         mov ted_help_text_f1,ecx    ;метка в памяти, где начинется текст со справкой
  786.  
  787.         stdcall ted_init_scroll_bars,edi,1 ;меняем цвета скроллингов
  788.         .no_colors:
  789.         popad
  790.         ret
  791. endp
  792.  
  793. ;input:
  794. ; ebx = file size
  795. ; edi = pointer to tedit struct
  796. ;description:
  797. ; Функция вызывается при открытии файла
  798. align 16
  799. proc ted_on_open_file
  800.         push eax ;destination
  801.         push ecx ;for cycle
  802.         push edx ;source
  803.         push esi
  804.  
  805.         stdcall ted_clear,edi,0 ;чистим не всю память, потому что ниже будем ее заполнять новыми даными
  806.  
  807.         ;когда символ завершения строки только 10 (без 13)
  808.         mov edx,ted_tex
  809.         mov ecx,ebx
  810.         @@:
  811.                 cmp byte[edx],13
  812.                 je .no_10 ;если найден символ 13, то 10-е игнорируем
  813.                 inc edx
  814.                 loop @b
  815.         mov edx,ted_tex
  816.         mov ecx,ebx
  817.         .s_10:
  818.                 cmp byte[edx],10
  819.                 jne @f
  820.                         mov byte[edx],13 ;меняем 10-й символ конца строки
  821.                 @@:
  822.                 inc edx
  823.                 loop .s_10
  824.         .no_10:
  825.  
  826.         ;переводим открытый файл внутрь элемента t_edit
  827.         mov eax,ebx
  828.         mov ecx,ebx
  829.         add eax,2
  830.         ConvertIndexToPointer eax
  831.         mov edx,ted_tex
  832.         add edx,ebx
  833.         push ebx
  834.         @@:
  835.                 mov ebx,[edx]
  836.                 mov byte [eax],bl
  837.                 mov dword [eax+2],ecx
  838.                 inc dword [eax+2]
  839.                 mov dword [eax+6],ecx
  840.                 add dword [eax+6],3
  841.                 ;mov byte[eax+1],0 ;col=0
  842.                 mov dword [eax+10],-1 ;tc=-1
  843.                 mov dword [eax+14],0 ;td=0
  844.  
  845.                 cmp ecx,0
  846.                 je @f
  847.                 dec ecx
  848.                 dec edx
  849.                 sub eax,sizeof.symbol
  850.                 jmp @b
  851.         @@:
  852.         pop ebx
  853.         add eax,2
  854.         mov dword [eax],0 ; first sumbol 'perv=0'
  855.  
  856.         mov edx,ted_tex ; настройки начального служебного символа
  857.         ; begining sumbol 'perv=0' 'next=2'
  858.         mov dword [edx+2],0
  859.         mov dword [edx+6],2
  860.  
  861.         add edx,sizeof.symbol ; настройки конечного служебного символа
  862.         mov dword [edx+6],0 ; last sumbol 'next=0'
  863.         mov dword [edx+2],ebx ; last sumbol 'perv=last'
  864.         inc dword [edx+2]
  865.         mov dword [edx+10],0 ; ставим время создания равное 0, что бы символ правильно обрабатывался при открытии файлов больших 28 байт
  866.  
  867.         mov edx,ebx
  868.         inc edx ;2 = rezerv sumbols
  869.         imul edx,sizeof.symbol
  870.         add edx,ted_tex
  871.         mov dword [edx+6],1 ; last sumbol 'next=1'
  872.  
  873.         @@: ;clear memory, need if before was open big file
  874.                 add edx,sizeof.symbol
  875.                 cmp edx,ted_tex_end
  876.                 jge @f
  877.                         mov dword[edx+10],0
  878.                         mov dword[edx+14],0
  879.                 jmp @b
  880.         @@:
  881.  
  882.         call ted_get_num_lines
  883.         cmp eax,TED_LINES_IN_NEW_FILE
  884.         jge @f
  885.                 mov eax,TED_LINES_IN_NEW_FILE
  886.         @@:
  887.         mov esi,ted_scr_w
  888.         mov dword[esi+sb_offs_max_area],eax
  889.         pop esi edx ecx eax
  890.  
  891.         call ted_text_colored
  892.         stdcall ted_draw,edi
  893.         cmp ted_fun_draw_panel_buttons,0
  894.         je @f
  895.                 call ted_fun_draw_panel_buttons
  896.         @@:
  897.         ret
  898. endp
  899.  
  900. ;input:
  901. ; edx = pointer to symbol struct
  902. ; edi = pointer to tedit struct
  903. ;output:
  904. ; edx = pointer to 'perv' visible symbol struct
  905. align 16
  906. ted_iterat_perv:
  907.         cmp ted_tim_undo,0
  908.         je .else
  909.         push ebx
  910.         @@:
  911.                 mov edx,[edx+2]
  912.                 or edx,edx
  913.                 jz @f
  914.                 imul edx,sizeof.symbol
  915.                 add edx,ted_tex
  916.                 call ted_symbol_not_vis
  917.                 cmp bl,1
  918.                 je @b
  919.                 cmp byte[edx],10 ;пропуск символа с кодом 10
  920.                 je @b
  921.         pop ebx
  922.         ret
  923.         @@:
  924.         mov edx,ted_tex ;начало файла
  925.         pop ebx
  926.         ret
  927.         .else:
  928.                 mov edx,[edx+2]
  929.                 or edx,edx
  930.                 jz @f
  931.                 imul edx,sizeof.symbol
  932.                 add edx,ted_tex
  933.                 cmp dword [edx+14],0
  934.                 jne .else
  935.                 cmp byte[edx],10 ;пропуск символа с кодом 10
  936.                 je .else
  937.         ret
  938.         @@:
  939.         mov edx,ted_tex ;начало файла
  940.         ret
  941.  
  942.  
  943. ;input:
  944. ; edx = pointer to symbol struct
  945. ; edi = pointer to tedit struct
  946. ;output:
  947. ; edx = pointer to 'next' visible symbol struct
  948. align 16
  949. ted_iterat_next:
  950.         cmp ted_tim_undo,0
  951.         je .else
  952.         push ebx
  953.         @@:
  954.                 mov edx,[edx+6]
  955.                 cmp edx,1
  956.                 jle @f
  957.                 imul edx,sizeof.symbol
  958.                 add edx,ted_tex
  959.  
  960.                 call ted_symbol_not_vis
  961.                 cmp bl,1
  962.                 je @b
  963.                 cmp byte[edx],10 ;пропуск символа с кодом 10
  964.                 je @b
  965.         pop ebx
  966.         ret
  967.         @@:
  968.         mov edx,ted_tex_1 ;конец файла
  969.         pop ebx
  970.         ret
  971.         .else:
  972.                 mov edx,[edx+6]
  973.                 cmp edx,1
  974.                 jle @f
  975.                 imul edx,sizeof.symbol
  976.                 add edx,ted_tex
  977.  
  978.                 cmp dword [edx+14],0
  979.                 jne .else
  980.                 cmp byte[edx],10 ;пропуск символа с кодом 10
  981.                 je .else
  982.         ret
  983.         @@:
  984.         mov edx,ted_tex_1 ;конец файла
  985.         ret
  986.  
  987. ;input:
  988. ; bl = symbol end of select
  989. ; bh = экранирующий символ (= 0 если нет проверки на них)
  990. ; edx = pointer to symbol struct
  991. ; edi = pointer to tedit struct
  992. ;description:
  993. ; найти следующую позицию указанного символа
  994. align 16
  995. ted_iterat_next_pos_char:
  996.         push ax
  997.         mov al,1 ;предыдущий символ, служит для сравнения с символом bh
  998.         @@:
  999.                 cmp bl,byte[edx]
  1000.                 je .found
  1001.                 .no_found:
  1002.                 cmp edx,ted_tex_1
  1003.                 jle @f
  1004.                         mov al,byte[edx]
  1005.                         call ted_iterat_next
  1006.                         jmp @b
  1007.         .found:
  1008.                 cmp bh,al
  1009.                 je .no_found
  1010.         @@:
  1011.         call ted_iterat_next
  1012.         pop ax
  1013.         ret
  1014.  
  1015. ;input:
  1016. ; edx = pointer to symbol struct
  1017. ; edi = pointer to tedit struct
  1018. align 16
  1019. ted_iterat_perv_color_tag:
  1020.         @@:
  1021.                 cmp byte[edx+1],0
  1022.                 jne @f
  1023.                 call ted_iterat_perv
  1024.                 cmp edx,ted_tex_1
  1025.                 jle @f
  1026.                 jmp @b
  1027. align 4
  1028.         @@:
  1029.         ret
  1030.  
  1031. ;input:
  1032. ; edx = pointer to symbol struct
  1033. ; edi = pointer to tedit struct
  1034. align 16
  1035. ted_iterat_next_color_tag:
  1036.         @@:
  1037.                 call ted_iterat_next
  1038.                 cmp byte[edx+1],0
  1039.                 jne @f
  1040.                 cmp edx,ted_tex_1
  1041.                 jle @f
  1042.                 jmp @b
  1043. align 4
  1044.         @@:
  1045.         ret
  1046.  
  1047. ;input:
  1048. ; edx = pointer to symbol struct
  1049. ; edi = pointer to tedit struct
  1050. ;output:
  1051. ; bl = 1 if sumbol not visible
  1052. ; (tex[i].td+ted_tim_undo<=ted_tim_ch && tex[i].td) || (tex[i].tc>ted_tim_ch-ted_tim_undo)
  1053. align 16
  1054. ted_symbol_not_vis:
  1055.         push eax
  1056.  
  1057.         xor bl,bl
  1058.  
  1059.         cmp dword [edx+14],0
  1060.         je @f
  1061.         mov eax,[edx+14] ;eax=tex[i].td
  1062.         add eax,ted_tim_undo
  1063.         cmp eax,ted_tim_ch
  1064.         jg @f
  1065.                 mov bl,1
  1066.                 pop eax
  1067.                 ret
  1068.         @@:
  1069.  
  1070.         mov eax,ted_tim_ch
  1071.         sub eax,ted_tim_undo
  1072.         cmp [edx+10],eax
  1073.         jle @f
  1074.                 or bl,1
  1075.         @@:
  1076.  
  1077.         pop eax
  1078.         ret
  1079.  
  1080. ;input:
  1081. ; text - pointer to text string
  1082. ; add_opt - options
  1083. align 16
  1084. proc ted_text_add, edit:dword, text:dword, t_len:dword, add_opt:dword
  1085.         locals
  1086.                 new_spc dd ? ;count new spaces
  1087.                 new_lin dd ? ;count new lines
  1088.         endl
  1089. ;использование регистров внутри функции:
  1090. ;eax - позиция для вставки текста
  1091. ;ebx - для временных нужд, длинна вставляемого текста
  1092. ;ecx - для временных нужд
  1093. ;edx - указатель на структуру символа
  1094.         pushad
  1095.         cmp dword[t_len],1 ;проверяем длинну добвляемого текста
  1096.         jl .no_add ;когда длинна <1 прыгаем на конец функции, во избежание глюков
  1097.  
  1098.         mov edi,[edit]
  1099.         mov esi,[text]
  1100.  
  1101.         call ted_get_pos_by_cursor
  1102.         call ted_get_text_perv_pos
  1103.         call ted_get_text_arr_index ;eax=po_t
  1104.  
  1105.         mov dword[new_spc],0
  1106.         cmp ted_gp_opt,2
  1107.         je @f
  1108.                 push eax ;c_sp=cur[cn].x+Scroller->XPos-StrLen(cur[cn].y+Scroller->YPos);
  1109.                         mov eax,ted_scr_h
  1110.                         mov eax,[eax+sb_offs_position]
  1111.                         add eax,ted_cur_x ;eax - номер символа
  1112.                         mov [new_spc],eax
  1113.  
  1114.                         mov eax,ted_scr_w
  1115.                         mov eax,[eax+sb_offs_position]
  1116.                         add eax,ted_cur_y ;eax - номер строки
  1117.                         call ted_strlen ;ebx = line len
  1118.                         sub [new_spc],ebx ;от позиции курсора отнимаем длинну строки, узнаем колличество добавляемых пробелов
  1119.                 pop eax
  1120.         @@:
  1121.  
  1122.         mov ebx,[t_len]
  1123.  
  1124.         mov dword[new_lin],0
  1125.         cmp ted_gp_opt,0
  1126.         jne @f
  1127.                 push eax
  1128.                         mov eax,ted_scr_w
  1129.                         mov eax,[eax+sb_offs_position]
  1130.                         add eax,ted_cur_y
  1131.                         inc eax
  1132.                         mov [new_lin],eax
  1133.  
  1134.                         call ted_get_num_lines
  1135.                         sub [new_lin],eax
  1136.                         ;увеличиваем линии в скроллинге на число добавленных дополнительных строк
  1137.                         mov ecx,ted_scr_w
  1138.                         add [ecx+sb_offs_max_area],eax ;увеличиваем размер вертикального скроллинга
  1139.                 pop eax
  1140.         @@:
  1141.  
  1142.         mov edx,ted_ptr_free_symb
  1143.         .beg_cycle: ;for(i=...;i<ted_max_chars;i++)
  1144.                 cmp dword [edx+10],0 ;if(!tex[i].tc && !tex[i].td)
  1145.                 jne .u1f
  1146.                 cmp dword [edx+14],0
  1147.                 jne .u1f
  1148.                         test dword[add_opt],ted_opt_ed_change_time ;if(n_tim) ted_tim_ch++;
  1149.                         jz .no_tim
  1150.                                 inc ted_tim_ch
  1151.                         .no_tim:
  1152.                         test dword[add_opt],ted_opt_ed_move_cursor
  1153.                         jz .no_cur_mov
  1154.                         cmp dword[new_lin],0 ;если есть добавочные строки, то курсор еще не двигаем
  1155.                         jg .no_cur_mov
  1156.                         cmp dword[new_spc],0 ;если нет добавочных пробелов, то курсор тоже не двигаем
  1157.                         jg .no_cur_mov
  1158.                                 inc ted_cur_x ;move cursor
  1159.                                 ;call ted_go_to_pos
  1160.                                 cmp byte [esi],13
  1161.                                 jne .no_cur_mov
  1162.                                         mov ted_cur_x,0
  1163.                                         inc ted_cur_y
  1164.                                         ;увеличиваем линии в скроллинге на число добавленных в тексте строк
  1165.                                         mov ecx,ted_scr_w
  1166.                                         inc dword[ecx+sb_offs_max_area] ;увеличиваем размер вертикального скроллинга
  1167.                         .no_cur_mov:
  1168.  
  1169.                         ; *** вставка текущего символа из строки ***
  1170.                         mov ecx,ted_opt_ed_change_time
  1171.                         not ecx
  1172.                         and dword[add_opt],ecx ;n_tim=false;
  1173.  
  1174.                         mov cl,byte [esi] ;tex[i].c=ta[ns];
  1175.                         mov byte [edx],cl
  1176.                         m2m dword [edx+10],ted_tim_ch ;tex[i].tc=ted_tim_ch;
  1177.                         mov [edx+2],eax ;tex[i].perv=po_t;
  1178.  
  1179.                         mov ecx,eax
  1180.                         imul ecx,sizeof.symbol
  1181.                         add ecx,ted_tex ; *** ecx = tex[po_t] ***
  1182.                         add ecx,6   ; *** ecx = tex[po_t].next ***
  1183.                         m2m dword [edx+6],dword [ecx] ;tex[i].next=tex[po_t].next;
  1184.  
  1185.                         call ted_get_text_arr_index ;*** eax = i ***
  1186.                         mov [ecx],eax ;tex[po_t].next=i; // ссылки перенаправляем
  1187.                         mov ecx,[edx+6] ; *** ecx = tex[i].next ***
  1188.                         imul ecx,sizeof.symbol
  1189.                         add ecx,ted_tex ; *** ecx = tex[tex[i].next] ***
  1190.                         mov [ecx+2],eax ;tex[tex[i].next].perv=i;
  1191.  
  1192.                         ; *** вставка дополнительных строк и пробелов
  1193.                         ; если курсор во время вставки находился за текстом ***
  1194.                         cmp dword[new_lin],0 ;add lines or text
  1195.                         jle .spc_add
  1196.                                 dec dword[new_lin]
  1197.                                 mov byte [edx],13
  1198.                                 jmp .u1f
  1199.                         .spc_add:
  1200.                         cmp dword[new_spc],0 ;add spaces or text
  1201.                         jle .tex_add
  1202.                                 dec dword[new_spc]
  1203.                                 mov byte [edx],' '
  1204.                                 jmp .u1f
  1205.                         .tex_add:
  1206.                         inc esi ; переход к следующему вставляемому символу
  1207.                         dec ebx
  1208.                 .u1f:
  1209.                 add edx,sizeof.symbol
  1210.                 cmp edx,ted_tex_end
  1211.                 jge @f ;out of memory
  1212.                 cmp ebx,0
  1213.                 jne .beg_cycle
  1214.                 mov ted_ptr_free_symb,edx ;меняем указатель на свободный символ, для более быстрого поиска памяти
  1215.                 jmp .add_all
  1216.         @@:
  1217.         cmp ted_increase_size,0
  1218.         je .add_all
  1219.                 call ted_memory_increase
  1220.                 cmp ebx,0
  1221.                 jne .beg_cycle
  1222.         .add_all: ;все символы добавлены
  1223.  
  1224.         call ted_text_colored
  1225.         .no_add:
  1226.         popad
  1227.         ret
  1228. endp
  1229.  
  1230. ;input:
  1231. ;  edx = pointer to sumbol, when insert
  1232. ;  edi = pointer to tedit struct
  1233. ;output:
  1234. ;  edx = new pointer to sumbol, when insert
  1235. align 16
  1236. proc ted_memory_increase
  1237.         cmp ted_increase_size,0
  1238.         je @f
  1239.                 push eax ebx ecx
  1240.                 mov ecx,ted_increase_size
  1241.                 add ecx,ted_max_chars
  1242.                 mov ted_max_chars,ecx
  1243.                 imul ecx,sizeof.symbol
  1244.                 invoke mem.realloc, ted_tex,ecx
  1245.                 mov ebx,ted_tex
  1246.                 mov ted_tex,eax
  1247.                 mov ted_tex_1,eax
  1248.                 add ted_tex_1,sizeof.symbol
  1249.                         sub edx,ebx
  1250.                         add edx,eax
  1251.                         mov ted_ptr_free_symb,edx
  1252.                 add eax,ecx
  1253.                 mov ted_tex_end,eax
  1254.                 pop ecx ebx eax
  1255.         @@:
  1256.         ret
  1257. endp
  1258.  
  1259. ;input:
  1260. ;  ecx = position to free insert cell
  1261. ;  edx = pointer to sumbol, when insert
  1262. ;  esi = added symbol
  1263. ;  edi = pointer to tedit struct
  1264. ;output:
  1265. ;  ecx = position to inserted cell
  1266. align 16
  1267. ted_char_add:
  1268.         .loop_b:
  1269.                 cmp ecx,ted_tex_end
  1270.                 jge .end_f
  1271.                 cmp dword[ecx+10],0
  1272.                 jne @f
  1273.                         cmp dword[ecx+14],0
  1274.                         je .loop_e
  1275.                 @@:
  1276.                 add ecx,sizeof.symbol
  1277.                 jmp .loop_b
  1278. align 4
  1279.         .loop_e:
  1280.  
  1281.         push eax ebx
  1282.         mov eax,ted_tim_ch
  1283.         mov dword[ecx+10],eax
  1284.         mov ax,si
  1285.         mov byte[ecx],al
  1286.  
  1287.         call ted_get_text_arr_index ; *** eax=pos ***
  1288.         mov [ecx+2],eax ;tex[i].perv=pos;
  1289.         m2m dword[ecx+6],dword[edx+6] ;tex[i].next=tex[pos].next;
  1290.  
  1291.         push edx
  1292.                 mov edx,ecx
  1293.                 call ted_get_text_arr_index ; *** eax=i ***
  1294.         pop edx
  1295.  
  1296.         mov [edx+6],eax ;tex[pos].next=i; // ссылки перенаправляем
  1297.         mov ebx,[ecx+6]
  1298.         ConvertIndexToPointer ebx
  1299.         mov [ebx+2],eax ;tex[tex[i].next].perv=i; // ...
  1300.         pop ebx eax
  1301.  
  1302.         .end_f:
  1303.         call ted_text_colored
  1304.         ret
  1305.  
  1306. ;description:
  1307. ; функция для смены кодировок
  1308. ;input:
  1309. ; table - таблица для перекодировки
  1310. align 16
  1311. proc ted_but_convert_by_table uses eax edx edi esi, edit:dword, table:dword
  1312.         mov edi,[edit]
  1313.         mov esi,[table]
  1314.         mov edx,ted_tex
  1315.         .cycle:
  1316.                 ;переходим на следующий символ
  1317.                 mov edx,[edx+6]
  1318.                 cmp edx,1
  1319.                 jle .end_text
  1320.                 imul edx,sizeof.symbol
  1321.                 add edx,ted_tex
  1322.  
  1323.                 movzx eax,byte[edx]
  1324.                 add eax,esi
  1325.                 mov al,byte[eax]
  1326.                 cmp al,0
  1327.                 je @f
  1328.                         mov byte[edx],al ;меняем кодировку символа
  1329.                 @@:
  1330.                 jmp .cycle
  1331.         .end_text:
  1332.         ;cmp esi,0
  1333.         ;je @f
  1334.                 stdcall ted_draw,edi ;обновляем окно
  1335.         ;@@:
  1336.         ret
  1337. endp
  1338.  
  1339. ;input:
  1340. ; edi = pointer to tedit struct
  1341. ;output:
  1342. ; esi = count converted symbols
  1343. ;description:
  1344. ; Функция используется для смены регистра выбранных символов
  1345. align 16
  1346. proc ted_convert_sel_text, conv_fun:dword
  1347.         locals
  1348.                 conv_cou dd ?
  1349.         endl
  1350.         mov dword[conv_cou],0
  1351.         pushad
  1352.  
  1353.         call ted_is_select
  1354.         or al,al
  1355.         jz .end_f
  1356.                 call ted_set_undo
  1357.                 call ted_sel_normalize
  1358.  
  1359.                 mov esi,ted_seln_x0
  1360.                 mov ecx,ted_seln_y0
  1361.                 call ted_get_pos_by_coords
  1362.                 mov eax,edx
  1363.                 mov esi,ted_seln_x1
  1364.                 mov ecx,ted_seln_y1
  1365.                 call ted_get_pos_by_coords
  1366.                 ;call ted_get_text_perv_pos
  1367.                 mov ebx,edx
  1368.  
  1369.                 cmp eax,ebx
  1370.                 je .end_f
  1371.  
  1372.                 inc ted_tim_ch
  1373.                 mov edx,eax ;i=p0;
  1374.                 mov ecx,ted_ptr_free_symb
  1375.                 @@:
  1376.                 push eax
  1377.                 mov al,byte[edx]
  1378.                 call dword[conv_fun] ;преобразование символа
  1379.                 mov esi,eax
  1380.                 cmp byte[edx],al
  1381.                 pop eax
  1382.                 je .no_change
  1383.                         m2m dword [edx+14],ted_tim_ch
  1384.                         call ted_char_add ;b_pos=ted_char_add(tex[i].c^32,i,false,b_pos);
  1385.                         call ted_get_text_next_pos ;go to added symbol
  1386.                         inc dword[conv_cou]
  1387.                 .no_change:
  1388.  
  1389.                 call ted_iterat_next
  1390.                 cmp edx,ted_tex
  1391.                 je @f
  1392.                 cmp edx,ebx
  1393.                 jne @b
  1394.                 @@:
  1395.                 cmp dword[conv_cou],0
  1396.                 jne @f
  1397.                         dec ted_tim_ch
  1398.                 @@:
  1399.         .end_f:
  1400.         popad
  1401.         mov esi,dword[conv_cou]
  1402.         ret
  1403. endp
  1404.  
  1405. ;output:
  1406. ; bl = 0 - no delete
  1407. ; bl = 1 - delete
  1408. align 16
  1409. proc ted_text_del uses ecx edx edi, edit:dword, del_opt:dword
  1410.         mov edi,[edit]
  1411.         mov ebx,[del_opt]
  1412.  
  1413.         xor cl,cl
  1414.         test ebx,ted_opt_ed_move_cursor
  1415.         jz @f
  1416.                 call ted_cur_move_left
  1417.                 cmp dl,0
  1418.                 je .no_del
  1419.         @@:
  1420.         call ted_get_pos_by_cursor
  1421.         cmp ted_gp_opt,1
  1422.         je .no_del
  1423.                 test ebx,ted_opt_ed_change_time
  1424.                 jz @f
  1425.                         inc ted_tim_ch
  1426.                 @@:
  1427.                 m2m dword[edx+14], ted_tim_ch
  1428.                 mov cl,1
  1429.         .no_del:
  1430.         mov bl,cl
  1431.         ret
  1432. endp
  1433.  
  1434. ;input:
  1435. ; edi = pointer to tedit struct
  1436. ;output:
  1437. ; al = 1 if delete
  1438. ;description:
  1439. ; Функция удаляет выделенный текст
  1440. align 16
  1441. proc ted_sel_text_del uses ebx ecx edx esi, del_opt:dword
  1442.         call ted_is_select
  1443.         or al,al
  1444.         jz .end_f
  1445.                 call ted_sel_normalize
  1446.  
  1447.                 mov esi,ted_seln_x1
  1448.                 mov ecx,ted_seln_y1
  1449.                 call ted_get_pos_by_coords
  1450.                 mov ebx,edx
  1451.  
  1452.                 mov esi,ted_seln_x0
  1453.                 mov ecx,ted_seln_y0
  1454.                 call ted_get_pos_by_coords
  1455.  
  1456.                 test dword[del_opt],ted_opt_ed_change_time
  1457.                 jz @f
  1458.                         inc ted_tim_ch
  1459.                 @@:
  1460.                 cmp edx,ted_tex
  1461.                 je @f
  1462.                 cmp edx,ebx ;if(i==te)break;
  1463.                 je @f
  1464.                         m2m dword[edx+14],ted_tim_ch
  1465.                         mov esi,ted_opt_ed_change_time
  1466.                         not esi
  1467.                         and dword[del_opt],esi ;n_tim=false;
  1468.                         call ted_iterat_next
  1469.                         jmp @b
  1470. align 4
  1471.                 @@:
  1472.                 test dword[del_opt],ted_opt_ed_change_time
  1473.                 jz @f
  1474.                         dec ted_tim_ch
  1475.                         xor al,al
  1476.                 @@:
  1477.                 test dword[del_opt],ted_opt_ed_change_time
  1478.                 jnz @f
  1479.                         mov ecx,ted_seln_x0
  1480.                         mov edx,ted_seln_y0
  1481.                         call ted_go_to_pos
  1482.                         mov ted_sel_x0,0
  1483.                         mov ted_sel_y0,0
  1484.                         mov ted_sel_x1,0
  1485.                         mov ted_sel_y1,0
  1486.                 @@:
  1487.         .end_f:
  1488.         ret
  1489. endp
  1490.  
  1491.  
  1492. ;input:
  1493. ; eax = pointer to begin select
  1494. ; ebx = pointer to end select
  1495. ; edi = pointer to tedit struct
  1496. align 16
  1497. ted_revers:
  1498.         cmp eax,ebx
  1499.         jne @f
  1500.                 ret
  1501.         @@:
  1502.  
  1503.         push ecx edx
  1504.  
  1505.         mov edx,ted_tex_1
  1506.         cmp edx,ebx ;if(p1==1)p1=tex[1].perv;
  1507.         jne @f
  1508.                 call ted_get_text_perv_pos
  1509.                 mov ebx,edx
  1510.         @@:
  1511.  
  1512.         push esi
  1513.                 mov edx,[eax+2] ; *** edx = tex[p0].perv ***
  1514.                 ConvertIndexToPointer edx
  1515.                 add edx,6
  1516.                 mov ecx,[edx] ;tmp = tex[tex[p0].perv].next;
  1517.  
  1518.                 mov esi,[ebx+6] ; *** esi = tex[p1].next ***
  1519.                 ConvertIndexToPointer esi
  1520.                 add esi,2
  1521.                 m2m dword[edx],dword[esi] ;tex[tex[p0].perv].next = tex[tex[p1].next].perv;
  1522.  
  1523.                 mov [esi],ecx ;tex[tex[p1].next].perv = tmp;
  1524.         pop esi
  1525.  
  1526.         mov ecx,[eax+2] ;tmp = tex[p0].perv;
  1527.         m2m dword[eax+2],dword[ebx+6] ;tex[p0].perv = tex[p1].next;
  1528.         mov [ebx+6],ecx ;tex[p1].next = tmp;
  1529.  
  1530.         mov edx,eax ;i=p0;
  1531.         @@:
  1532.                 mov ecx,[edx+6] ;tmp = tex[i].next;
  1533.                 m2m dword[edx+6],dword[edx+2] ;tex[i].next = tex[i].perv;
  1534.                 mov [edx+2],ecx ;tex[i].perv = tmp;
  1535.                 cmp edx,ebx ;if(i==p1)break;
  1536.                 je @f
  1537. ; ---
  1538. ;cmp edx,ted_tex
  1539. ;je @f
  1540. ; ---
  1541.                 mov edx,ecx ;i = tmp;
  1542.                 ConvertIndexToPointer edx
  1543.                 jmp @b
  1544.         @@:
  1545.         pop edx ecx
  1546.         call ted_text_colored
  1547.         ret
  1548.  
  1549.  
  1550. ;input:
  1551. ; edi = pointer to tedit struct
  1552. ;output:
  1553. ; dl = 0 not move
  1554. ; dl = 2 if move up
  1555. ; dl = 8 if scroll move up
  1556. align 16
  1557. ted_cur_move_up:
  1558.   cmp ted_cur_y,0
  1559.   je @f
  1560.     dec ted_cur_y
  1561.     mov dl,2
  1562.     ret
  1563.   @@:
  1564.   push eax
  1565.   mov eax,ted_scr_w
  1566.   cmp dword[eax+sb_offs_position],0
  1567.   je @f
  1568.     dec dword[eax+sb_offs_position]
  1569.     mov dl,8
  1570.     jmp .ret_f
  1571.   @@:
  1572.   mov dl,0
  1573.   .ret_f:
  1574.   pop eax
  1575.   ret
  1576.  
  1577. ;input:
  1578. ; edi = pointer to tedit struct
  1579. ;output:
  1580. ; dl = 0 not move
  1581. ; dl = 2 if move down
  1582. ; dl = 8 if scroll move down
  1583. align 16
  1584. ted_cur_move_down:
  1585.   push eax ebx
  1586.   mov ebx,ted_scr_w
  1587.   xor dl,dl
  1588.   mov eax,[ebx+sb_offs_cur_area]
  1589.   dec eax
  1590.   cmp ted_cur_y,eax
  1591.   jge @f
  1592.     inc ted_cur_y
  1593.     mov dl,2
  1594.     jmp .ret_f
  1595.   @@:
  1596.   mov eax,ted_cur_y
  1597.   add eax,[ebx+sb_offs_position]
  1598.   inc eax
  1599.   cmp [ebx+sb_offs_max_area],eax
  1600.   jle @f
  1601.     inc dword[ebx+sb_offs_position]
  1602.     mov dl,8
  1603.   @@:
  1604.   .ret_f:
  1605.   pop ebx eax
  1606.   ret
  1607.  
  1608.  
  1609. ;input:
  1610. ; edi = pointer to tedit struct
  1611. ;output:
  1612. ; dl = 0 not move
  1613. ; dl = 1 if move up
  1614. align 16
  1615. ted_cur_move_page_up:
  1616.         push eax ebx
  1617.         mov ebx,ted_scr_w
  1618.         mov eax,[ebx+sb_offs_cur_area]
  1619.         xor dl,dl
  1620.         cmp eax,[ebx+sb_offs_position]
  1621.         jg @f
  1622.                 sub [ebx+sb_offs_position],eax
  1623.                 mov dl,1
  1624.         @@:
  1625.         cmp dword[ebx+sb_offs_position],0
  1626.         je @f
  1627.         cmp dl,1
  1628.         je @f
  1629.                 mov dword[ebx+sb_offs_position],0
  1630.                 mov dl,1
  1631.         @@:
  1632.         pop ebx eax
  1633.         ret
  1634.  
  1635. ;input:
  1636. ; edi = pointer to tedit struct
  1637. align 16
  1638. ted_cur_move_page_down:
  1639.         push eax ebx ecx
  1640.         mov ecx,ted_scr_w
  1641.  
  1642.         xor dl,dl
  1643.         mov eax,[ecx+sb_offs_max_area]
  1644.         sub eax,[ecx+sb_offs_cur_area]
  1645.         cmp [ecx+sb_offs_position],eax
  1646.         jge @f
  1647.                 mov ebx,[ecx+sb_offs_cur_area]
  1648.                 add [ecx+sb_offs_position],ebx
  1649.                 mov dl,1
  1650.                 mov dword[ecx+sb_offs_redraw],1
  1651.                 cmp [ecx+sb_offs_position],eax
  1652.                 jle @f
  1653.                         mov [ecx+sb_offs_position],eax
  1654.         @@:
  1655.         pop ecx ebx eax
  1656.         ret
  1657.  
  1658. ;input:
  1659. ; edi = pointer to tedit struct
  1660. ;output:
  1661. ; dl = 0 not move
  1662. ; dl = 1 if move left
  1663. ; dl = 3 if move left and up
  1664. ; dl = 8 if scroll move up
  1665. align 16
  1666. ted_cur_move_left:
  1667.         cmp ted_cur_x,0
  1668.         je @f
  1669.                 dec ted_cur_x
  1670.                 mov dl,1
  1671.                 ret
  1672.         @@:
  1673.         push eax
  1674.         mov eax,ted_scr_h
  1675.         cmp dword[eax+sb_offs_position],0
  1676.         je @f
  1677.                 dec dword[eax+sb_offs_position]
  1678.                 mov dl,8
  1679.                 jmp .ret_f
  1680.         @@:
  1681.         cmp ted_cur_y,0
  1682.         jne @f
  1683.                 mov eax,ted_scr_w
  1684.                 mov dl,0
  1685.                 cmp dword[eax+sb_offs_position],0
  1686.                 je .ret_f
  1687.                         dec dword[eax+sb_offs_position]
  1688.                         call ted_scroll_set_redraw
  1689.                         call ted_cur_move_x_last_char
  1690.                         mov dl,8
  1691.                         jmp .ret_f
  1692.         @@:
  1693.         cmp ted_cur_y,0
  1694.         je @f
  1695.                 dec ted_cur_y
  1696.                 call ted_cur_move_x_last_char
  1697.                 cmp dl,8
  1698.                 je .ret_f
  1699.                 mov dl,3
  1700.                 jmp .ret_f
  1701.         @@:
  1702.         mov dl,0
  1703.         .ret_f:
  1704.         pop eax
  1705.         ret
  1706.  
  1707. ;input:
  1708. ; edi = pointer to tedit struct
  1709. align 16
  1710. ted_cur_move_right:
  1711.         push eax ebx
  1712.         mov eax,ted_scr_h
  1713.         xor dl,dl
  1714.         mov ebx,[eax+sb_offs_cur_area]
  1715.         cmp ted_cur_x,ebx
  1716.         jge @f
  1717.                 inc ted_cur_x
  1718.                 mov dl,1
  1719.                 jmp .ret_f
  1720.         @@:
  1721.                 inc dword[eax+sb_offs_position]
  1722.                 mov dl,8
  1723.         .ret_f:
  1724.         pop ebx eax
  1725.         ret
  1726.  
  1727. ;input:
  1728. ; edi = pointer to tedit struct
  1729. align 16
  1730. ted_cur_move_x_last_char:
  1731. ;[hScr.position]
  1732. ;[hScr.cur_area]
  1733. ;dl-???
  1734.   push eax ebx ecx
  1735.   mov eax,ted_cur_y
  1736.   mov ecx,ted_scr_w
  1737.   add eax,[ecx+sb_offs_position]
  1738.   call ted_strlen
  1739.   xor dl,dl
  1740.  
  1741.   mov ecx,ted_scr_h
  1742.   cmp ebx,[ecx+sb_offs_position]
  1743.   jge @f
  1744.     mov dl,8
  1745.     mov [ecx+sb_offs_position],ebx
  1746.   @@:
  1747.   sub ebx,[ecx+sb_offs_position]
  1748.  
  1749.   cmp ebx,[ecx+sb_offs_cur_area]
  1750.   jle @f ; b---[---]---e
  1751.     add [ecx+sb_offs_position],ebx
  1752.     mov ebx,[ecx+sb_offs_cur_area]
  1753.     sub [ecx+sb_offs_position],ebx
  1754.     mov dl,8
  1755.   @@:
  1756.   mov ted_cur_x,ebx
  1757.   pop ecx ebx eax
  1758.   ret
  1759.  
  1760. ;input:
  1761. ; edi = pointer to tedit struct
  1762. ;output:
  1763. ; dl = 0 not move
  1764. ; dl = 1 move cursor
  1765. ; dl = 8 move cursor and scroll
  1766. align 16
  1767. ted_cur_move_x_first_char:
  1768.         xor dl,dl
  1769.         cmp ted_cur_x,0
  1770.         je @f
  1771.                 mov ted_cur_x,0
  1772.                 mov dl,1
  1773.         @@:
  1774.         push eax
  1775.         mov eax,ted_scr_h
  1776.         cmp dword[eax+sb_offs_position],0
  1777.         je @f
  1778.                 mov dword[eax+sb_offs_position],0
  1779.                 mov dl,8
  1780.         @@:
  1781.         pop eax
  1782.         ret
  1783.  
  1784. ;input:
  1785. ; edx = pointer to symbol struct
  1786. ; edi = pointer to tedit struct
  1787. ;output:
  1788. ; eax = array index
  1789. align 16
  1790. ted_get_text_arr_index:
  1791.         push ecx edx
  1792.                 mov eax,edx
  1793.                 sub eax,ted_tex
  1794.                 xor edx,edx
  1795.                 mov ecx,sizeof.symbol
  1796.                 div ecx
  1797.         pop edx ecx
  1798.         ret
  1799.  
  1800. ;input:
  1801. ; edx = pointer to symbol struct
  1802. ; edi = pointer to tedit struct
  1803. ;output:
  1804. ; edx = pointer to 'perv' struct
  1805. align 16
  1806. ted_get_text_perv_pos:
  1807.         mov edx,[edx+2]
  1808.         imul edx,sizeof.symbol
  1809.         add edx,ted_tex
  1810.         ret
  1811.  
  1812. ;input:
  1813. ; edx = pointer to symbol struct
  1814. ;output:
  1815. ; edx = pointer to 'next' symbol struct
  1816. align 16
  1817. ted_get_text_next_pos:
  1818.         mov edx,[edx+6]
  1819.         imul edx,sizeof.symbol
  1820.         add edx,ted_tex
  1821.         ret
  1822.  
  1823. ;input:
  1824. ; edi = pointer to tedit struct
  1825. ;output:
  1826. ; edx = symbol under cursor
  1827. ; ted_gp_opt = 1,2
  1828. ; edx = tex[1].perv if error
  1829. ; ted_gp_opt = 0
  1830. align 16
  1831. ted_get_pos_by_cursor:
  1832.         push eax ecx esi
  1833.                 mov esi,ted_cur_x
  1834.                 mov eax,ted_scr_h
  1835.                 add esi,[eax+sb_offs_position]
  1836.                 mov ecx,ted_cur_y
  1837.                 mov eax,ted_scr_w
  1838.                 add ecx,[eax+sb_offs_position]
  1839.                 call ted_get_pos_by_coords
  1840.         pop esi ecx eax
  1841.         ret
  1842.  
  1843. ;input:
  1844. ; esi = XPos
  1845. ; ecx = YPos
  1846. ; edi = pointer to tedit struct
  1847. ;output:
  1848. ; edx = symbol under cursor
  1849. ; ted_gp_opt = 1 if found text line
  1850. ; ted_gp_opt = 2 if found text line and column
  1851. ; edx = tex[1] if error
  1852. ; ted_gp_opt = 0 if text no found
  1853. align 16
  1854. proc ted_get_pos_by_coords uses eax ebx
  1855.         xor eax,eax ;Row
  1856.         xor ebx,ebx ;Col
  1857.   mov ted_gp_opt,0
  1858.   mov edx,ted_tex
  1859.   @@:
  1860.     call ted_iterat_next
  1861.     cmp edx,ted_tex_1
  1862.     jle @f
  1863.     cmp ebx,esi
  1864.     jne .u1_0 ;Col <> ted_cur_x
  1865.       mov ted_gp_opt,1
  1866.       cmp eax,ecx
  1867.       jge @f ; Row >= ted_cur_y
  1868.     .u1_0:
  1869.     mov ted_gp_opt,0
  1870.     inc ebx
  1871.     cmp byte [edx],13
  1872.     jne @b
  1873.     cmp eax,ecx
  1874.     jge @f ; Row >= ted_cur_y
  1875.     inc eax
  1876.     xor ebx,ebx
  1877.     jmp @b
  1878.   @@:
  1879.   cmp eax,ecx
  1880.   jne @f ; Row = ted_cur_y
  1881.     inc ted_gp_opt
  1882.   @@:
  1883.   cmp ted_gp_opt,0
  1884.   jne @f
  1885.     mov edx,ted_tex_1
  1886.     ;call ted_get_text_perv_pos
  1887.   @@:
  1888.   ret
  1889. endp
  1890.  
  1891. ;input:
  1892. ; eax = Row
  1893. ; edi = pointer to tedit struct
  1894. ;output:
  1895. ; ebx = str len
  1896. align 16
  1897. ted_strlen:
  1898.   push edx ecx
  1899.   ;ecx = Row, from cycle
  1900.  
  1901.   xor ebx,ebx
  1902.   xor ecx,ecx
  1903.   mov edx,ted_tex
  1904.   @@:
  1905.     call ted_iterat_next
  1906.     cmp edx,ted_tex_1
  1907.     jle @f
  1908.     inc ebx
  1909.     cmp byte [edx],13
  1910.     jne @b
  1911.     dec ebx ;lenght minus 1 sumbol to paragraph
  1912.     cmp eax,ecx
  1913.     je @f
  1914.     xor ebx,ebx
  1915.     inc ecx
  1916.     jmp @b
  1917.   @@:
  1918.  
  1919.   cmp eax,ecx
  1920.   je @f
  1921.     xor ebx,ebx
  1922.   @@:
  1923.  
  1924.   pop ecx edx
  1925.   ret
  1926.  
  1927.  
  1928. ;input:
  1929. ; edx = symbol position
  1930. ; edi = pointer to tedit struct
  1931. ;output:
  1932. ; eax = number of line
  1933. ; ebx = symbol position in line
  1934. align 16
  1935. ted_get_text_coords:
  1936.   push edx
  1937.   xor eax,eax
  1938.   xor ebx,ebx
  1939.   @@:
  1940.     call ted_iterat_perv
  1941.  
  1942.     cmp eax,0
  1943.     jne .no_col_mov
  1944.     inc ebx
  1945.     .no_col_mov:
  1946.  
  1947.     cmp edx,ted_tex_1
  1948.     jle @f
  1949.     cmp byte [edx],13
  1950.     jne @b
  1951.     inc eax
  1952.     jmp @b
  1953.   @@:
  1954.   dec ebx
  1955.   pop edx
  1956.   ret
  1957.  
  1958. ;input:
  1959. ; edi = pointer to tedit struct
  1960. ;output:
  1961. ; eax = num lines
  1962. align 16
  1963. ted_get_num_lines:
  1964.         push edx
  1965.         mov eax,1
  1966.         mov edx,ted_tex
  1967.         @@:
  1968.                 call ted_iterat_next
  1969.                 cmp edx,ted_tex_1
  1970.                 jle @f
  1971.                 cmp byte [edx],13
  1972.                 jne @b
  1973.                 inc eax
  1974.                 jmp @b
  1975.         @@:
  1976. ;...
  1977. ;dec eax
  1978.         pop edx
  1979.         ret
  1980.  
  1981.  
  1982. ;input:
  1983. ; edi = pointer to tedit struct
  1984. ;description:
  1985. ; отменяет отмененные действия, перед изменением документа
  1986. align 16
  1987. proc ted_set_undo
  1988.         mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
  1989.         cmp ted_tim_undo,1
  1990.         jl .no_work
  1991.  
  1992.         push eax ebx edx
  1993.         mov edx,ted_tex
  1994.         call ted_get_text_next_pos ;long i=tex[0].next;
  1995.         mov eax,ted_tim_undo
  1996.         sub ted_tim_ch,eax ;ted_tim_ch-=ted_tim_undo;
  1997.         mov eax,ted_tim_ch
  1998.         cmp ted_tim_ls,eax ;if(ted_tim_ls>ted_tim_ch)
  1999.         jle @f
  2000.                 mov ted_tim_ls,0
  2001.         @@:
  2002.                 cmp edx,ted_tex_1
  2003.                 jle @f
  2004.  
  2005.                 ;if(tex[i].tc>ted_tim_ch){ // если создание символа было отменено
  2006.                 cmp [edx+symbol.tc],eax
  2007.                 jle .no_u1
  2008.                         mov dword [edx+symbol.tc],0
  2009.                         mov dword [edx+symbol.td],0
  2010.  
  2011.                         mov ebx,[edx+symbol.perv]
  2012.                         imul ebx,sizeof.symbol
  2013.                         add ebx,ted_tex ;ebx=tex[i].perv
  2014.                         m2m dword [ebx+symbol.next],dword [edx+symbol.next] ;tex[tex[i].perv].next=tex[i].next;
  2015.  
  2016.                         mov ebx,[edx+symbol.next]
  2017.                         imul ebx,sizeof.symbol
  2018.                         add ebx,ted_tex ;ebx=tex[i].next
  2019.                         m2m dword [ebx+symbol.perv],dword [edx+symbol.perv] ;tex[tex[i].next].perv=tex[i].perv;
  2020.  
  2021.                         cmp ted_ptr_free_symb,edx
  2022.                         jle .no_cor_free
  2023.                                 mov ted_ptr_free_symb,edx ;меняем указатель на свободный символ, для более быстрого поиска памяти
  2024.                         .no_cor_free:
  2025.                         mov edx,ebx ;оптимизируем по скорости (edx после вызова ted_get_text_next_pos будет равен ebx)
  2026.                         jmp @b
  2027.                 .no_u1:
  2028.  
  2029.                 ;else if(tex[i].td>ted_tim_ch) tex[i].td=0; // если удаление символа было отменено
  2030.                 cmp [edx+symbol.td],eax
  2031.                 jle .no_u2
  2032.                         mov dword [edx+symbol.td],0
  2033.                 .no_u2:
  2034.  
  2035.                 call ted_get_text_next_pos
  2036.                 jmp @b
  2037.         @@:
  2038.         mov ted_tim_undo,0
  2039.         mov eax,ted_tim_co
  2040.         cmp ted_tim_ch,eax
  2041.         jge @f
  2042.                 mov ted_tim_co,0
  2043.         @@:
  2044.         pop edx ebx eax
  2045.         .no_work:
  2046.         ret
  2047. endp
  2048.  
  2049. ;input:
  2050. ; ecx = Col
  2051. ; edx = Row
  2052. ; edi = pointer to tedit struct
  2053. ;output:
  2054. ; ecx = cursor x
  2055. ; edx = cursor y
  2056. align 16
  2057. ted_go_to_pos:
  2058.         push eax ebx
  2059.         mov eax,ted_scr_h
  2060.         sub ecx,[eax+sb_offs_position]
  2061.         cmp ecx,0 ;ted_cur_x < 0
  2062.         jge @f
  2063.                 add [eax+sb_offs_position],ecx ;прокрутка скроллинга влево
  2064.                 xor ecx,ecx
  2065.         @@:
  2066.         mov ebx,5 ;5 - желаемый отступ слева
  2067.         cmp ecx,ebx
  2068.         jge .end0
  2069.                 sub ebx,ecx ;ebx - на сколько символов нужно сдвинуть курсор
  2070.                 cmp [eax+sb_offs_position],ebx
  2071.                 jge @f
  2072.                         add ecx,[eax+sb_offs_position]
  2073.                         mov dword[eax+sb_offs_position],0
  2074.                         jmp .end0
  2075.                 @@:
  2076.                         sub [eax+sb_offs_position],ebx
  2077.                         add ecx,ebx
  2078.         .end0:
  2079.         cmp ecx,[eax+sb_offs_cur_area] ;ted_cur_x > [.cur_area]
  2080.         jl .end1
  2081.                 mov ebx,ecx
  2082.                 sub ebx,[eax+sb_offs_cur_area]
  2083.                 inc ebx
  2084.                 add [eax+sb_offs_position],ebx ;прокрутка скроллинга вправо
  2085.                 sub ecx,ebx
  2086.         .end1:
  2087.         mov ted_cur_x,ecx
  2088.  
  2089.         mov eax,ted_scr_w
  2090.         sub edx,[eax+sb_offs_position]
  2091.         cmp edx,0 ;ted_cur_y < 0
  2092.         jge @f
  2093.                 add [eax+sb_offs_position],edx ;прокрутка скроллинга вверх
  2094.                 xor edx,edx
  2095.                 jmp .end2
  2096.         @@:
  2097.         cmp edx,[eax+sb_offs_cur_area] ;ted_cur_y > [.cur_area]
  2098.         jl .end2
  2099.                 mov ebx,edx
  2100.                 sub ebx,[eax+sb_offs_cur_area]
  2101.                 inc ebx
  2102.                 add [eax+sb_offs_position],ebx ;прокрутка скроллинга вниз
  2103.                 sub edx,ebx
  2104.         .end2:
  2105.         mov ted_cur_y,edx
  2106.         pop ebx eax
  2107.         ret
  2108.  
  2109. ;input:
  2110. ; edi = pointer to tedit struct
  2111. align 16
  2112. ted_text_colored:
  2113.   push eax edx
  2114.   mov eax,ted_tim_ch
  2115.   sub eax,ted_tim_undo
  2116.   mov ted_tim_co,eax
  2117.   mov edx,ted_tex
  2118.   @@:
  2119.     call ted_iterat_next
  2120.     cmp edx,ted_tex_1
  2121.     jle @f
  2122.     mov byte[edx+1],0
  2123.     jmp @b
  2124.   @@:
  2125.  
  2126.   cmp ted_key_words_count,1
  2127.   jl .no_colors
  2128.   mov edx,ted_tex
  2129.   @@:
  2130.     call ted_text_find_sel_color
  2131.     cmp edx,ted_tex_1
  2132.     jle .no_colors
  2133.     jmp @b
  2134.   .no_colors:
  2135.   pop edx eax
  2136.   ret
  2137.  
  2138.  
  2139. ;input:
  2140. ; edx = pointer to start symbol
  2141. ; edi = pointer to tedit struct
  2142. ;output:
  2143. ; edx = pointer to next symbol
  2144. ;description:
  2145. ; Функция для поиска и выделения подсвеченых слов
  2146. align 16
  2147. proc ted_text_find_sel_color uses eax ebx ecx esi
  2148. locals
  2149.         begPos dd ? ;начальная позиция
  2150.         endPos dd ? ;конечная позиция
  2151.         find db ? ;найдено / не найдено
  2152.         f_color db ? ;индекс цвета найденого слова
  2153. endl
  2154. ;eax = word_n текущий номер (позиция) проверяемого слова в списке
  2155. ;ebx = для разных целей
  2156. ;ecx = l_pos последний номер (позиция) подходящего слова в списке
  2157. ;esi = для разных целей, номер проверяемого символа в слове
  2158.         mov dword[begPos],1
  2159.         mov dword[endPos],1
  2160.         mov byte[find],0
  2161.         mov byte[f_color],1
  2162.         @@:
  2163.                 call ted_iterat_next
  2164.                 cmp edx,ted_tex_1
  2165.                 jle @f
  2166.  
  2167.                 xor eax,eax
  2168.                 mov al,byte[edx]
  2169.                 shl ax,2 ;eax*=4
  2170.                 add eax,ted_arr_key_pos
  2171.                 mov eax,[eax]
  2172.                 cmp eax,0
  2173.                 jl @b ;if( (word_n=ted_arr_key_pos[(unsigned char)tex[i].c])>-1 ){
  2174.  
  2175.                 mov ecx,eax
  2176.                 ;while(l_pos<ted_key_words_count && Col[l_pos].Text[0]==Col[word_n].Text[0])
  2177.                 .wh_1b:
  2178.                         cmp ecx,ted_key_words_count
  2179.                         jge .wh_1e
  2180.                         ColToIndexOffset ecx,esi
  2181.                         mov bl,byte[esi]
  2182.                         ColToIndexOffset eax,esi
  2183.                         cmp bl,byte[esi]
  2184.                         jne .wh_1e
  2185.                                 inc ecx
  2186.                         jmp .wh_1b
  2187.                 .wh_1e:
  2188.  
  2189.                 mov [begPos],edx ;bP=i;
  2190.                 mov esi,1
  2191. align 4
  2192.                 .wh_2b: ;while(1){
  2193.                 call ted_iterat_next
  2194.  
  2195.                 ;while(l_pos>word_n && Col[l_pos-1].Text[pos]!=tex[i].c)
  2196.                 .wh_3b:
  2197.                         cmp ecx,eax
  2198.                         jle .wh_3e
  2199.                         dec ecx
  2200.                         ColToIndexOffset ecx,ebx
  2201.                         inc ecx
  2202.                         ;cmp byte[ebx+esi],byte[edx]
  2203.                         mov bl,byte[ebx+esi]
  2204.                         cmp bl,byte[edx]
  2205.                         je .wh_3e
  2206.                                 dec ecx
  2207.                         jmp .wh_3b
  2208.                 .wh_3e:
  2209.  
  2210.                 ColToIndexOffset eax,ebx
  2211.                 cmp byte[ebx+esi],0
  2212.                 jne .if_0 ;if(Col[word_n].Text[pos]==0){
  2213.                 mov [endPos],edx ;eP=i;
  2214.                 ColToIndexOffset eax,ebx
  2215.                 mov bl,[ebx+MAX_COLOR_WORD_LEN+7]
  2216.                 mov [f_color],bl ;f_color=Col[word_n].color;
  2217.  
  2218.                 mov byte[find],1
  2219.                 ColToIndexOffset eax,ebx ;... ebx = Col[word_n]
  2220.                 mov bl,[ebx+MAX_COLOR_WORD_LEN+4]
  2221.                 cmp bl,0 ;if(Col[word_n].wwo)
  2222.                 je .if_2n
  2223.                         push edx
  2224.                         mov edx,[begPos]
  2225.                         call ted_iterat_perv
  2226.  
  2227.                         btr bx,0 ;1-1
  2228.                         jae .if_3e ;if(Col[word_n].wwo&1)
  2229.                                 ;u1= !(isalnum(cont_s)||cont_s=='_')
  2230.                                 call isalnum
  2231.                                 jae .if_3e
  2232.                                         mov byte[find],0
  2233.                                         jmp .if_4e
  2234.                         .if_3e:
  2235.  
  2236.                         btr bx,3 ;4-1
  2237.                         jae .if_4e ;if(Col[word_n].wwo&8)
  2238.                                 ;u1= !isalpha(cont_s);
  2239.                                 call isalpha
  2240.                                 jae .if_4e
  2241.                                         mov byte[find],0
  2242.                         .if_4e:
  2243.  
  2244.                         mov edx,[endPos]
  2245.                         ;call ted_iterat_next
  2246.  
  2247.                         btr bx,1 ;2-1
  2248.                         jae .if_5e ;if(Col[word_n].wwo&2)
  2249.                                 ;u1= !(isalnum(cont_s)||cont_s=='_')
  2250.                                 call isalnum
  2251.                                 jae .if_5e
  2252.                                         mov byte[find],0
  2253.                                         jmp .if_6e
  2254.                         .if_5e:
  2255.  
  2256.                         btr bx,4 ;5-1
  2257.                         jae .if_6e ;if(Col[word_n].wwo&16)
  2258.                                 ;u1= !isalpha(cont_s);
  2259.                                 call isalpha
  2260.                                 jae .if_6e
  2261.                                         mov byte[find],0
  2262.                         .if_6e:
  2263.  
  2264.                         btr bx,2 ;3-1
  2265.                         jae .if_7e ;if(Col[word_n].wwo&4)
  2266.                                 ColToIndexOffset eax,ebx
  2267.                                 mov bx,word[ebx+MAX_COLOR_WORD_LEN+5]
  2268.                                 call ted_iterat_next_pos_char
  2269.                                 cmp edx,ted_tex_1
  2270.                                 jle .if_7e
  2271.                                         mov dword[endPos],edx
  2272.                         .if_7e:
  2273.  
  2274.                         pop edx
  2275.                 .if_2n:
  2276. ;if(i!=1){ // не конец документа
  2277. ;  cont_s=tex[eP].c;
  2278. ;  if(Col[word_n].wwo&2) u2= !(isalnum(cont_s)||cont_s=='_');  // не букв.-числ. символ
  2279. ;  if(u2 && Col[word_n].wwo&16) u2= !isalpha(cont_s); // не числ. символ
  2280. ;  if(Col[word_n].wwo&4) eP=ted_iterat_next_pos_char(eP,Col[word_n].endc);
  2281.  
  2282.                         cmp eax,ecx
  2283.                         je .wh_2e ;if(word_n==l_pos) break; // do double - если слово точно последнее
  2284.                 .if_0:
  2285.  
  2286.                 cmp edx,ted_tex_1
  2287.                 jle .wh_2e ;if(i==1) break;
  2288.  
  2289.                 ;while(l_pos>word_n && Col[word_n].Text[pos]!=tex[i].c)
  2290.                 .wh_4b:
  2291.                 cmp ecx,eax
  2292.                 jle .wh_4e
  2293.                         ColToIndexOffset eax,ebx
  2294.                         ;cmp byte[ebx+esi],byte[edx]
  2295.                         mov bl,byte[ebx+esi]
  2296.                         cmp bl,byte[edx]
  2297.                         je .wh_4e
  2298.                                 inc eax
  2299.                         jmp .wh_4b
  2300.                 .wh_4e:
  2301.  
  2302.                 cmp eax,ecx
  2303.                 je .wh_2e;if(word_n==l_pos) break;
  2304.                         inc esi ;pos++;
  2305.                         jmp .wh_2b
  2306.                 .wh_2e:
  2307.  
  2308.                 cmp byte[find],1 ;if(fnd)break;
  2309.                 je @f
  2310.                         mov edx,[begPos];i=bP;
  2311.                 jmp @b
  2312.         @@:
  2313.  
  2314.         cmp byte[find],1
  2315.         jne .if_1e ;if(fnd){ // выделение найденого текста
  2316.                 ;if(!mode_sf1 || (mode_sf1 && strlen(Col[word_n].f1->c_str())>0)){
  2317.                 mov eax,[begPos]
  2318.                 mov bl,[f_color]
  2319.                 mov [eax+1],bl ;tex[bP].col=f_color;
  2320.                 mov eax,[endPos]
  2321.                 mov byte[eax+1],0xff ;tex[eP].col=255;
  2322.                 ;return ItPoPerv(eP); // возвращаем позицию конца вхождения
  2323.                 mov edx,[endPos]
  2324.                 call ted_get_text_perv_pos
  2325.                 jmp @f
  2326.         .if_1e:
  2327.                 mov edx,ted_tex
  2328.         @@:
  2329.  
  2330.         ret
  2331. endp
  2332.  
  2333. ;input:
  2334. ; edx = pointer to char (byte)
  2335. ;output:
  2336. ; cf=1 if symbol is...
  2337. align 16
  2338. tab_all_num db 0,0,0,0,0,0,0xff,11b,11111110b,0xff,0xff,10000111b,11111110b,0xff,0xff,111b,0,0,0,0,0,0,0,0;,0,0,0,0,0,0,0,0 - tab_alpha_0,0,0,0,0,0,0,0
  2339. tab_alpha db 0,0,0,0,0,0,0,0,11111110b,0xff,0xff,10000111b,11111110b,0xff,0xff,111b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  2340.  
  2341. ;output:
  2342. ; cf=1 если в [edx] буква, цифра или '_'
  2343. align 16
  2344. isalnum:
  2345.         push eax ebx
  2346.         movzx eax,byte[edx] ;al=offset
  2347.         shr eax,3
  2348.         lea ebx,[tab_all_num]
  2349.         add ebx,eax
  2350.         movzx ax,byte[edx] ;al=bit
  2351.         and ax,111b
  2352.         bt word[ebx],ax
  2353.         pop ebx eax
  2354.         ret
  2355.  
  2356. ;output:
  2357. ; cf=1 если в [edx] буква или '_'
  2358. align 16
  2359. isalpha:
  2360.         push eax ebx
  2361.         movzx eax,byte[edx] ;al=offset
  2362.         shr eax,3
  2363.         lea ebx,[tab_alpha]
  2364.         add ebx,eax
  2365.         movzx ax,byte[edx] ;al=bit
  2366.         and ax,111b
  2367.         bt word[ebx],ax
  2368.         pop ebx eax
  2369.         ret
  2370.  
  2371. align 16
  2372. proc ted_show_help_f1 uses eax edx edi, edit:dword
  2373.         mov edi,[edit]
  2374.  
  2375.         call ted_get_pos_by_cursor
  2376.         push edx
  2377.                 call ted_iterat_next_color_tag
  2378.                 mov eax,edx
  2379.         pop edx
  2380.         call ted_iterat_perv_color_tag
  2381.  
  2382.         cmp eax,ted_tex
  2383.         jle @f
  2384.         cmp edx,ted_tex_1
  2385.         jle @f
  2386.                 stdcall ted_find_help_id,eax
  2387.         @@:
  2388.         ;call ted_draw_main_cursor
  2389.         call ted_draw_help_f1
  2390.         ret
  2391. endp
  2392.  
  2393. ;input:
  2394. ; edx = position begin 'symbol' struct
  2395. ; edi = pointer to tedit struct
  2396. ; end_pos = position end 'symbol' struct
  2397. align 16
  2398. proc ted_find_help_id, end_pos:dword
  2399. ; ecx = word_n
  2400. ; ebx = l_pos
  2401.   mov ted_help_id,-1
  2402.  
  2403.   push ebx ecx
  2404.     xor ebx,ebx
  2405.     mov bl,[edx]
  2406.     shl bx,2 ;ebx*=4
  2407.     add ebx,ted_arr_key_pos
  2408.     mov ecx,[ebx]
  2409.     cmp ecx,0
  2410.     jl .if_0e ;if( (word_n=ted_arr_key_pos[(unsigned char)tf[0]])>-1 ){
  2411.       push esi eax
  2412.       mov ebx,ecx ;l_pos=word_n;
  2413.       ColToIndexOffset ecx,esi
  2414.       push cx
  2415.       mov cl,[esi]
  2416.       @@:
  2417.         cmp ebx,ted_key_words_count ;while(l_pos<ted_key_words_count)
  2418.         jge @f
  2419.         ;ColToIndexOffset ecx,esi
  2420.         ColToIndexOffset ebx,eax
  2421.         cmp cl,[eax] ;&& Col[l_pos].Text[0]==Col[word_n].Text[0])
  2422.         jne @f
  2423.           inc ebx ;l_pos++;
  2424.           jmp @b
  2425.       @@:
  2426.       pop cx
  2427.       call ted_iterat_next ;pos=1;
  2428.       mov esi,1
  2429.       @@:
  2430.         push dx
  2431.         push word[edx]
  2432.         pop dx
  2433.           .wh_0b:
  2434.             cmp ebx,ecx ;while(l_pos>word_n
  2435.             jle .wh_0e
  2436.             dec ebx
  2437.             ColToIndexOffset ebx,eax
  2438.             inc ebx
  2439.             cmp byte[eax+esi],dl ;&& Col[l_pos-1].Text[pos]!=tf[i])
  2440.             je .wh_0e
  2441.               dec ebx ;l_pos--;
  2442.             jmp .wh_0b
  2443.           .wh_0e:
  2444.  
  2445.           .wh_1b:
  2446.             cmp ebx,ecx ;while(l_pos>word_n
  2447.             jle .wh_1e
  2448.             ColToIndexOffset ecx,eax
  2449.             cmp byte[eax+esi],dl
  2450.             je .wh_1e
  2451.               inc ecx ;word_n++;
  2452.             jmp .wh_1b
  2453.           .wh_1e:
  2454.         pop dx
  2455.  
  2456.         cmp ecx,ebx ;if(word_n==l_pos) break;
  2457.         je @f
  2458.         call ted_iterat_next ;pos++;
  2459.         cmp edx,[end_pos] ;for(...;i<strlen;...)
  2460.         je @f ;jge
  2461.         inc esi
  2462.         jmp @b
  2463.       @@:
  2464.       pop eax esi
  2465.  
  2466.       mov ted_help_id,ecx
  2467.       ;return word_n;
  2468.  
  2469.     .if_0e:
  2470.   pop ecx ebx
  2471.   ret
  2472. endp
  2473.  
  2474. ;output:
  2475. ; eax = код ошибки
  2476. ; ebx = колличество прочитанных байт
  2477. align 16
  2478. proc ted_open_file uses ecx edx edi, edit:dword, file:dword, f_name:dword ;функция открытия файла
  2479.         mov edi,[edit]
  2480.  
  2481.         ; *** проверяем размер памяти и если не хватает то увеличиваем ***
  2482.         ;пробуем получить информацию о файле
  2483.         mov ebx,[file]
  2484.         mov dword[ebx], SSF_GET_INFO
  2485.         mov dword[ebx+4], 0
  2486.         mov dword[ebx+8], 0
  2487.         mov dword[ebx+12], 0
  2488.         m2m dword[ebx+16], ted_tex
  2489.         mov  byte[ebx+20], 0
  2490.         push dword[f_name]
  2491.         pop dword[ebx+21]
  2492.         mcall SF_FILE
  2493.         or eax,eax
  2494.         jz .end_0
  2495.                 mov edx,ted_max_chars
  2496.                 cmp eax,2 ;функция не поддерживается для данной файловой системы
  2497.                 je @f
  2498.                 jmp .ret_f
  2499. align 4
  2500.         .end_0:
  2501.         ;проверяем хватит ли памяти для загрузки файла
  2502.         mov ecx,ted_max_chars
  2503.         sub ecx,2 ;ecx = максимальное число байт, для которых была выделена память
  2504.         mov edx,ted_tex
  2505.         mov edx,[edx+32] ;+32 = +0x20: qword: размер файла в байтах
  2506.         cmp edx,ecx
  2507.         jl @f
  2508.                 ;увеличиваем память если не хватило
  2509.                 mov ecx,edx ;память необходимая для открытия файла
  2510.                 add ecx,2  ;память для служебных начального и конечного символов
  2511.                 add ecx,ted_increase_size ;память для редактирования файла
  2512.                 mov ted_max_chars,ecx
  2513.                 imul ecx,sizeof.symbol
  2514.                 invoke mem.realloc, ted_tex,ecx
  2515.                 mov ted_tex,eax
  2516.                 mov ted_tex_1,eax
  2517.                 add ted_tex_1,sizeof.symbol
  2518.                 add eax,ecx
  2519.                 mov ted_tex_end,eax
  2520.                 mov ecx,ted_tex_1
  2521.                 add ecx,sizeof.symbol
  2522.                 mov ted_ptr_free_symb,ecx
  2523.         @@:
  2524.  
  2525.         ; *** пробуем открыть файл ***
  2526.         mov ebx,[file]
  2527.         mov dword[ebx], SSF_READ_FILE
  2528.         mov dword[ebx+4], 0
  2529.         mov dword[ebx+8], 0
  2530.         m2m dword[ebx+12], edx ;число байт, которые могут быть считаны с файла (не больше чем ted_max_chars)
  2531.         m2m dword[ebx+16], ted_tex
  2532.         mov  byte[ebx+20], 0
  2533.         push dword[f_name]
  2534.         pop dword[ebx+21]
  2535.         mcall SF_FILE
  2536.  
  2537.         or eax,eax
  2538.         jz @f
  2539.         cmp eax,6
  2540.         je @f
  2541.                 jmp .ret_f
  2542.         @@:
  2543.         cmp ebx,-1
  2544.         je .ret_f
  2545.                 ;if open file
  2546.                 call ted_on_open_file
  2547.         .ret_f:
  2548.         ret
  2549. endp
  2550.  
  2551. align 16
  2552. proc ted_but_select_word, edit:dword
  2553.         pushad
  2554.         mov edi,[edit]
  2555.  
  2556.         call ted_get_pos_by_cursor
  2557.         push edx
  2558.                 call ted_iterat_perv_color_tag
  2559.                 cmp edx,ted_tex_1
  2560.                 jle @f
  2561.                         call ted_get_text_coords
  2562.                         mov ted_sel_x0,ebx
  2563.                         mov ted_sel_y0,eax
  2564.                 @@:
  2565.         pop edx
  2566.         call ted_iterat_next_color_tag
  2567.         cmp edx,ted_tex_1
  2568.         jle @f
  2569.                 call ted_get_text_coords
  2570.                 mov ted_sel_x1,ebx
  2571.                 mov ted_sel_y1,eax
  2572.         @@:
  2573.  
  2574.         cmp ted_fun_draw_panel_buttons,0
  2575.         je @f
  2576.                 call ted_fun_draw_panel_buttons
  2577.         @@:
  2578.         stdcall ted_draw,edi
  2579.         popad
  2580.         ret
  2581. endp
  2582.  
  2583. ;output:
  2584. ; al = 1 if delete
  2585. align 16
  2586. proc ted_but_cut uses edi, edit:dword
  2587.         mov edi,[edit]
  2588.  
  2589.         stdcall ted_but_copy,edi
  2590.         call ted_set_undo
  2591.         stdcall ted_sel_text_del,ted_opt_ed_change_time
  2592.  
  2593.         cmp al,1
  2594.         jne @f
  2595.                 stdcall ted_draw,edi
  2596.                 cmp ted_fun_draw_panel_buttons,0
  2597.                 je @f
  2598.                         call ted_fun_draw_panel_buttons
  2599.         @@:
  2600.         ret
  2601. endp
  2602.  
  2603. align 16
  2604. proc ted_but_copy, edit:dword
  2605.         pushad
  2606.         mov edi,[edit]
  2607.  
  2608.         call ted_is_select
  2609.         or al,al
  2610.         jz .end_f ;if not selected text
  2611.         call ted_sel_normalize
  2612.  
  2613.         mov esi,ted_seln_x1
  2614.         mov ecx,ted_seln_y1
  2615.         call ted_get_pos_by_coords
  2616.         mov ebx,edx
  2617.         mov esi,ted_seln_x0
  2618.         mov ecx,ted_seln_y0
  2619.         call ted_get_pos_by_coords
  2620.         mov esi,ebx
  2621.  
  2622.         mov ecx,12 ;system buffer header size
  2623.         mov ebx,ted_buffer
  2624.         mov dword[ebx+4],0 ;text data
  2625.         mov dword[ebx+8],1 ;code 866
  2626.         add ebx,ecx
  2627.         @@:
  2628.                 cmp edx,ted_tex_1 ;end of file
  2629.                 jle @f
  2630.                 cmp edx,esi ;end of select
  2631.                 je @f
  2632.                 inc ecx
  2633.                 cmp ecx,ted_buffer_size ;owerflow bufer
  2634.                 je @f
  2635.  
  2636.                 mov al,byte[edx]
  2637.                 mov byte[ebx],al
  2638.                 inc ebx
  2639.                 cmp al,13
  2640.                 jne .no_13
  2641.                         mov byte[ebx],10 ;делаем конец строки в буфере 13,10 для совместимости с другими программами
  2642.                         inc ebx
  2643.                         inc ecx
  2644.                 .no_13:
  2645.                
  2646.                 call ted_iterat_next
  2647.                 jmp @b
  2648.         @@:
  2649.         mov byte[ebx],0
  2650.  
  2651.         cmp ecx,12
  2652.         je .end_f
  2653.                 mov ebx,ted_buffer
  2654.                 mov [ebx],ecx
  2655.                 mcall SF_CLIPBOARD,SSF_WRITE_CB,ecx,ted_buffer
  2656.                 call ted_draw_buffer
  2657.                 cmp ted_fun_draw_panel_buttons,0
  2658.                 je .end_f
  2659.                         call ted_fun_draw_panel_buttons
  2660.         .end_f:
  2661.         popad
  2662.         ret
  2663. endp
  2664.  
  2665.  
  2666. align 16
  2667. proc ted_but_paste, edit:dword
  2668.         pushad
  2669.         mov edi,[edit]
  2670.  
  2671.         mcall SF_CLIPBOARD,SSF_GET_SLOT_COUNT
  2672.         cmp eax,1
  2673.         jl .no_buf_r
  2674.  
  2675.         mov esi,eax
  2676.         .cycle: ;обратный цикл по слотам
  2677.         dec esi ;номер текущего, проверяемого слота
  2678.         mcall SF_CLIPBOARD,SSF_READ_CB,esi
  2679.         cmp eax,1
  2680.         je .no_buf_r
  2681.         cmp eax,-1
  2682.         je .no_buf_r
  2683.                 mov ecx,[eax]
  2684.                 cmp ecx,1 ;size
  2685.                 jl .no_buf_r
  2686.                 cmp dword[eax+4],0 ;text
  2687.                 je @f
  2688.                         cmp esi,1
  2689.                         jge .cycle ;если в буфере не текст, а слотов в буфере несколько, пробуем перейти к верхнему слоту
  2690.                         jmp .no_buf_r
  2691.                 @@:
  2692.                 cmp dword[eax+8],1 ;866
  2693.                 je @f
  2694.                         cmp esi,1
  2695.                         jge .cycle ;если в буфере текст не в кодировке 866 ... пробуем перейти к верхнему слоту
  2696.                         jmp .no_buf_r
  2697.                 @@:
  2698.                 ;копирование текста из системного буфера во внутренний
  2699.                 cmp ecx,ted_buffer_size
  2700.                 jle @f
  2701.                         mov ecx,ted_buffer_size
  2702.                 @@:
  2703.                 mov edi,ted_buffer
  2704.                 mov esi,eax
  2705.                 add     esi,4 ;12
  2706.                 mov dword[edi],ecx
  2707.                 add edi,4 ;12
  2708.                 sub ecx,4 ;12
  2709.                 rep movsb
  2710.                 mov edi,[edit]
  2711.  
  2712.                 mov esi,eax
  2713.                 add     esi,12
  2714.                 jmp .buf_r
  2715.         .no_buf_r:
  2716.                
  2717.         ;если не удалось прочитать данные из системного буфера, попадаем сюда
  2718.         mov esi,ted_buffer
  2719.         cmp dword[esi],1 ;проверяем есть ли данные во внутреннем буфере
  2720.         jl .no_paste ;если вообще ничего не удалось прочитать идем на выход
  2721.         add esi,12 ;system buffer header size
  2722.         .buf_r:
  2723.        
  2724.         mov edx,esi
  2725.         call tl_strlen
  2726.         cmp eax,1
  2727.         jl .no_paste
  2728.                 mov esi,eax
  2729.                 call ted_set_undo
  2730.                 mov ebx,ted_opt_ed_change_time+ted_opt_ed_move_cursor
  2731.                 stdcall ted_sel_text_del,ebx
  2732.                 cmp al,1
  2733.                 jne .del
  2734.                         mov ebx,ted_opt_ed_move_cursor
  2735.                 .del:
  2736.                 stdcall ted_text_add,edi,edx,esi,ebx
  2737.                 stdcall ted_draw,