Subversion Repositories Kolibri OS

Rev

Rev 1449 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1338 IgorA 1
struct f70
2
  func_n dd ?
3
  param1 dd ?
4
  param2 dd ?
5
  param3 dd ?
6
  param4 dd ?
7
  rezerv db ?
8
  name dd ?
9
ends
10
 
11
struct TexColViv
12
  Text rb MAX_COLOR_WORD_LEN; // слово
13
  f1 dd 0
14
  wwo db ? ; whole words only
15
  endc db ? ; символ конца выделения (wwo&4)
16
  color db ? ; номер цвета
17
ends
18
 
19
struct symbol
20
  c db ?    ;  +0 символ
21
  col db ?  ;  +1 цвет
22
  perv dd ? ;  +2
23
  next dd ? ;  +6 указатели
24
  tc dd ?   ; +10 врем. создания
25
  td dd ?   ; +14 врем. удаления
26
ends
27
 
28
 
1456 IgorA 29
hed db 'TextEditor 22.04.10',0 ;подпись окна
1449 IgorA 30
sc system_colors
31
 
1338 IgorA 32
fn_icon db 'te_icon.bmp',0
33
bmp_icon dd 0
34
run_file_70 f70
35
 
36
 
37
;input:
1456 IgorA 38
; edi = pointer to tedit struct
1338 IgorA 39
; reg = index
40
;output:
41
; reg = pointer to 'tex' struct
42
macro ConvertIndexToPointer reg {
43
  imul reg,sizeof.symbol
1456 IgorA 44
  add reg,ted_tex
1338 IgorA 45
}
46
 
1456 IgorA 47
align 4
48
proc ted_init, edit:dword
49
  push eax ecx edi
50
  mov edi,dword[edit]
1338 IgorA 51
 
1456 IgorA 52
  mov ecx,sizeof.symbol*maxChars
53
  call mem_Alloc ;выделяем память
54
  mov ted_tex,eax
55
  mov ted_tex_1,eax
56
  add ted_tex_1,sizeof.symbol
57
  mov ted_tex_end,eax
58
  add ted_tex_end,sizeof.symbol*maxChars
59
 
60
  stdcall ted_clear, edi,1
61
 
62
;-------------------------------------------------
63
  mov ecx,maxColWords*sizeof.TexColViv+40
64
  ;add ecx,40
65
  call mem_Alloc
66
  mov ted_syntax_file,eax
67
  mov ted_syntax_file_end,eax
68
  add ted_syntax_file_end,ecx
69
 
70
  pop edi ecx eax
71
  ret
72
endp
73
 
74
align 4
75
proc ted_delete, edit:dword
76
  push ecx edi
77
  mov edi,dword[edit]
78
 
79
  mov ecx,ted_tex
80
  call mem_Free
81
  mov ecx,ted_syntax_file
82
  call mem_Free
83
 
84
  pop edi ecx
85
  ret
86
endp
87
 
88
 
89
;input:
90
; eax = key kodes
91
; ebx = key control
92
align 4
93
proc ted_key, edit:dword, table:dword
94
  pushad
95
  mov edi,dword[edit]
96
 
97
  cmp ah,KEY_F1 ;[F1]
98
  jne @f
99
    stdcall ted_show_help_f1,edi
100
    jmp .end_key_fun
101
  @@:
102
  cmp ah,KEY_F3 ;[F3]
103
  jne @f
104
    stdcall but_FindText,edi
105
    jmp .end_key_fun
106
  @@:
107
 
108
  test ebx,KM_CTRL ;Ctrl+...
109
  jz .key_Ctrl
110
 
111
    cmp ah,24 ;Ctrl+O
112
    jne @f
113
      call but_OpenFile
114
    @@:
115
    cmp ah,33 ;Ctrl+F
116
    jne @f
117
    cmp ted_panel_id,TE_PANEL_FIND
118
    je @f
119
      stdcall but_find,edi
120
    @@:
121
    cmp ah,44 ;Ctrl+Z
122
	jne @f
123
      stdcall ted_but_undo,edi
124
	@@:
125
    cmp ah,46 ;Ctrl+C
126
    jne @f
127
      stdcall ted_but_copy,edi
128
    @@:
129
    cmp ah,47 ;Ctrl+V
130
    jne @f
131
      stdcall ted_but_paste,edi
132
    @@:
133
    cmp ah,49 ;Ctrl+N
134
    jne @f
135
      call but_NewFile
136
    @@:
137
    cmp ah,199 ;Ctrl+Home
138
    jne @f
139
      call but_CtrlHome
140
    @@:
141
    ;jmp .end_key_fun
142
  .key_Ctrl:
143
 
144
  test ebx,KM_SHIFT ;Shift+...
145
  jz .key_Shift
146
    cmp ah,72 ;Shift+Up
147
    jne @f
148
      stdcall ted_sel_key_up,edi
149
    @@:
150
    cmp ah,75 ;Shift+Left
151
    jne @f
152
      stdcall ted_sel_key_left,edi
153
    @@:
154
    cmp ah,77 ;Shift+Right
155
    jne @f
156
      stdcall ted_sel_key_right,edi
157
    @@:
158
    cmp ah,80 ;Shift+Down
159
    jne @f
160
      stdcall ted_sel_key_down,edi
161
    @@:
162
    ;mov ted_drag_k,1 ;начинаем выделение от клавиатуры
163
    jmp .key_MoveCur
164
  .key_Shift:
165
;-------------------------------------------------
166
  cmp ah,72 ;178 ;Up
167
  jne @f
168
    stdcall draw_cursor_sumb,edi
169
    call CurMoveUp
170
    cmp dl,8
171
    jne .no_red_0
172
      call OnInitialUpdate
173
      stdcall draw_main_win,edi
174
      jmp @f
175
    .no_red_0:
176
    stdcall draw_main_cursor,edi
177
    mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
178
  @@:
179
  cmp ah,80 ;177 ;Down
180
  jne @f
181
    stdcall draw_cursor_sumb,edi
182
    call CurMoveDown
183
    cmp dl,8
184
    jne .no_red_1
185
      call OnInitialUpdate
186
      stdcall draw_main_win,edi
187
      jmp @f
188
    .no_red_1:
189
    stdcall draw_main_cursor,edi
190
    mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
191
  @@:
192
  cmp ah,75 ;176 ;Left
193
  jne @f
194
    stdcall draw_cursor_sumb,edi
195
    call CurMoveLeft
196
    cmp dl,8
197
    jne .no_red_2
198
      call OnInitialUpdate
199
      stdcall draw_main_win,edi
200
      jmp @f
201
    .no_red_2:
202
    stdcall draw_main_cursor,edi
203
    mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
204
  @@:
205
  cmp ah,77 ;179 ;Right
206
  jne @f
207
    stdcall draw_cursor_sumb,edi
208
    call CurMoveRight
209
    cmp dl,8
210
    jne .no_red_3
211
      call OnInitialUpdate
212
      stdcall draw_main_win,edi
213
      jmp @f
214
    .no_red_3:
215
    stdcall draw_main_cursor,edi
216
    mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
217
  @@:
218
  cmp ah,71 ;180 ;Home
219
  jne @f
220
    stdcall draw_cursor_sumb,edi
221
    call CurMoveX_FirstChar
222
    cmp dl,8
223
    jne .no_red_4
224
      call OnInitialUpdate
225
      stdcall draw_main_win,edi
226
      jmp @f
227
    .no_red_4:
228
    stdcall draw_main_cursor,edi
229
    mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
230
  @@:
231
  cmp ah,79 ;181 ;End
232
  jne @f
233
    stdcall draw_cursor_sumb,edi
234
    call CurMoveX_LastChar
235
    cmp dl,8
236
    jne .no_red_5
237
      call OnInitialUpdate
238
      stdcall draw_main_win,edi
239
      jmp @f
240
    .no_red_5:
241
    stdcall draw_main_cursor,edi
242
    mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
243
  @@:
244
  cmp ah,73 ;184 ;PageUp
245
  jne @f
246
    call CurMovePageUp
247
    cmp dl,0
248
    je @f
249
    call OnInitialUpdate
250
    stdcall draw_main_win,edi
251
  @@:
252
  cmp ah,81 ;183 ;PageDown
253
  jne @f
254
    call CurMovePageDown
255
    cmp dl,0
256
    je @f
257
    call OnInitialUpdate
258
    stdcall draw_main_win,edi
259
    mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
260
  @@:
261
;-------------------------------------------------
262
;    cmp ebx,0
263
;    jne .end_key_fun
264
  .key_MoveCur:
265
 
266
  cmp ah,69 ;[Pause Break]
267
  je .end_key_fun
268
  cmp ah,120 ;[Fn]
269
  je .end_key_fun
270
  cmp ah,0x80 ;if key up
271
  ja .end_key_fun
272
 
273
  cmp dword[table],0
274
  je @f
275
    stdcall KeyConvertToASCII, dword[table]
276
  @@:
277
 
278
  ;mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
279
 
280
  xor edx,edx
281
  mov dl,ah
282
  add edx,EvChar ;add char to text
283
  cmp byte [edx],1
284
  jne @f
285
    mov ted_key_new,ah
286
    stdcall ted_set_undo,edi
287
    mov edx,ted_opt_ed_change_time+ted_opt_ed_move_cursor
288
    stdcall SelTextDel,edx
289
    cmp al,1
290
    jne .del
291
      mov edx,ted_opt_ed_move_cursor
292
    .del:
293
    cmp ted_cur_ins,1
294
    je .no_ins_mod
295
      stdcall TextDel,edi,ted_opt_ed_change_time
296
	  mov edx,ted_opt_ed_move_cursor
297
    .no_ins_mod:
298
	mov ecx,edi
299
	add ecx,ted_offs_key_new
300
    stdcall ted_text_add,edi,ecx,1,edx ;добавляем символ введенный с клавиатуры
301
    call draw_but_toolbar
302
    cmp ted_key_new,13
303
    jne .dr_m_win
304
      stdcall draw_main_win,edi
305
      jmp .dr_cur_l
306
    .dr_m_win:
307
      stdcall draw_cur_line,edi
308
    .dr_cur_l:
309
  @@:
310
 
311
  cmp ah,8 ;[<-]
312
  jne @f
313
    stdcall ted_set_undo,edi
314
    stdcall SelTextDel,ted_opt_ed_change_time
315
    cmp al,1
316
    je .del_one_b
317
      stdcall TextDel,edi,ted_opt_ed_change_time+ted_opt_ed_move_cursor
318
    .del_one_b:
319
    call draw_but_toolbar
320
    stdcall draw_main_win,edi
321
    jmp .end_key_fun
322
  @@:
323
 
324
  cmp ah,182 ;Delete
325
  jne @f
326
    stdcall ted_set_undo,edi
327
    stdcall SelTextDel,ted_opt_ed_change_time
328
    cmp al,1
329
    je .del_one_d
330
      stdcall TextDel,edi,ted_opt_ed_change_time
331
    .del_one_d:
332
    call draw_but_toolbar
333
    stdcall draw_main_win,edi
334
    jmp .end_key_fun
335
  @@:
336
 
337
  cmp ah,185 ;Ins
338
  jne @f
339
    stdcall draw_cursor_sumb,edi
340
    xor ted_cur_ins,1
341
    stdcall draw_main_cursor,edi
342
  @@:
343
 
344
  .end_key_fun:
345
  popad
346
  ret
347
endp
348
 
1338 IgorA 349
;output:
350
; al = 1 - can save
1456 IgorA 351
align 4
352
proc ted_can_save, edit:dword
353
  push ecx edi
354
  mov edi,dword[edit]
355
 
356
  mov ecx,ted_tim_ch
357
  sub ecx,ted_tim_undo
1338 IgorA 358
  mov al,1
1456 IgorA 359
  cmp ted_tim_ls,ecx
1338 IgorA 360
  jne @f
361
    dec al
362
  @@:
1456 IgorA 363
  pop edi ecx
1338 IgorA 364
  ret
1456 IgorA 365
endp
1338 IgorA 366
 
367
;output:
368
; al = 1 - selected
1456 IgorA 369
align 4
1449 IgorA 370
proc IsSel, edit:dword
371
  push ebx edi
372
  mov edi,dword[edit]
1338 IgorA 373
  xor al,al
1449 IgorA 374
  cmp ted_drag_m,1
1338 IgorA 375
  je @f
376
    mov al,1
1456 IgorA 377
    mov ebx,ted_sel_x0
378
    cmp ebx,ted_sel_x1
1338 IgorA 379
    jne @f
1456 IgorA 380
    mov ebx,ted_sel_y0
381
    cmp ebx,ted_sel_y1
1338 IgorA 382
    jne @f
383
    xor al,al
384
  @@:
1449 IgorA 385
  pop edi ebx
1338 IgorA 386
  ret
1449 IgorA 387
endp
1338 IgorA 388
 
1456 IgorA 389
align 4
390
proc SelNormalize, edit:dword
1338 IgorA 391
  push ecx esi edi
1456 IgorA 392
    mov edi,dword[edit]
393
    mov esi,edi
394
    add esi,ted_offs_sel
395
    add edi,ted_offs_seln
1338 IgorA 396
    mov ecx,sizeof.TexSelect
397
    rep movsb
398
 
1456 IgorA 399
	mov edi,dword[edit]
400
 
1338 IgorA 401
    jmp @f
402
    .swp_f:
1456 IgorA 403
      mov ecx,ted_seln_x0
404
      m2m ted_seln_x0,ted_seln_x1
405
      mov ted_seln_x1,ecx
1338 IgorA 406
 
1456 IgorA 407
      mov ecx,ted_seln_y0
408
      cmp ecx,ted_seln_y1 ;(sel_y0>sel_y1)
1338 IgorA 409
      jle .end_f
1456 IgorA 410
      m2m ted_seln_y0,ted_seln_y1
411
      mov ted_seln_y1,ecx
1338 IgorA 412
 
413
    jmp .end_f
414
    @@:
415
 
1456 IgorA 416
    mov ecx,ted_seln_y0
417
    cmp ecx,ted_seln_y1 ;(sel_y0>sel_y1)
1338 IgorA 418
    jg .swp_f
419
 
1456 IgorA 420
    cmp ecx,ted_seln_y1 ;(sel_y0==sel_y1)
1338 IgorA 421
    jne .end_f
1456 IgorA 422
      mov ecx,ted_seln_x0
423
      cmp ecx,ted_seln_x1 ;(sel_x0>sel_x1)
1338 IgorA 424
      jg .swp_f
425
 
426
    .end_f:
427
  pop edi esi ecx
428
  ret
1456 IgorA 429
endp
1338 IgorA 430
 
1456 IgorA 431
align 4
432
proc SelStart, edit:dword
433
  push ecx edi
434
    mov edi,dword[edit]
435
 
436
    mov ecx,ted_cur_x
1338 IgorA 437
    add ecx,[hScr.position]
1456 IgorA 438
    mov ted_sel_x0,ecx
439
    mov ted_sel_x1,ecx
1338 IgorA 440
 
1456 IgorA 441
    mov ecx,ted_cur_y
1338 IgorA 442
    add ecx,[wScr.position]
1456 IgorA 443
    mov ted_sel_y0,ecx
444
    mov ted_sel_y1,ecx
445
  pop edi ecx
1338 IgorA 446
  ret
1456 IgorA 447
endp
1338 IgorA 448
 
1343 IgorA 449
align 4
1456 IgorA 450
proc SelMove, edit:dword
451
  push ecx edi
452
    mov edi,dword[edit]
453
 
454
    mov ecx,ted_cur_x
1338 IgorA 455
    add ecx,[hScr.position]
1456 IgorA 456
    mov ted_sel_x1,ecx
1338 IgorA 457
 
1456 IgorA 458
    mov ecx,ted_cur_y
1338 IgorA 459
    add ecx,[wScr.position]
1456 IgorA 460
    mov ted_sel_y1,ecx
461
  pop edi ecx
1343 IgorA 462
  call draw_but_toolbar ;redraw toolbar (need to button Copy)
1338 IgorA 463
  ret
1456 IgorA 464
endp
1338 IgorA 465
 
466
;input:
1456 IgorA 467
; cl_al_mem = 1 - clear all memory
468
align 4
469
proc ted_clear, edit:dword, cl_al_mem:dword
470
  push edi
471
  mov edi,dword[edit]
1338 IgorA 472
 
1456 IgorA 473
  mov ted_cur_x,0
474
  mov ted_cur_y,0
475
  mov ted_tim_ch,0
476
  mov ted_tim_ls,0
477
  mov ted_tim_co,0
478
  mov ted_tim_undo,0
479
  mov ted_help_id,-1
480
 
1338 IgorA 481
  mov [wScr.position],0
482
  mov [wScr.max_area],100
483
  mov [wScr.redraw],1
484
  mov [hScr.position],0
485
  mov [hScr.max_area],100
486
 
1456 IgorA 487
  mov ted_sel_x0,0
488
  mov ted_sel_y0,0
489
  mov ted_sel_x1,0
490
  mov ted_sel_y1,0
1338 IgorA 491
 
1456 IgorA 492
  cmp dword[cl_al_mem],0
1338 IgorA 493
  je .exit
494
 
495
  push ecx edx
496
  mov ecx,sizeof.symbol*maxChars
1456 IgorA 497
  mov edx,ted_tex
1338 IgorA 498
  @@:
499
    mov byte [edx],0
500
    inc edx
501
  loop @b
1456 IgorA 502
  mov edx,ted_tex
1338 IgorA 503
  mov dword [edx+6],1
504
  pop edx ecx
505
 
506
  .exit:
1456 IgorA 507
  pop edi
1338 IgorA 508
  ret
1456 IgorA 509
endp
1338 IgorA 510
 
1456 IgorA 511
;--- out_reg = Col[ind_reg].Text[0] ---
1338 IgorA 512
macro ColToIndexOffset ind_reg,out_reg {
513
  mov out_reg,ind_reg
514
  imul out_reg,sizeof.TexColViv
1456 IgorA 515
  add out_reg,ted_key_words_data
1338 IgorA 516
}
517
 
518
 
1456 IgorA 519
align 4
520
proc InitColText, edit:dword
521
  pushad
522
  mov edi,dword[edit]
1338 IgorA 523
 
1456 IgorA 524
  mov ebx,dword[fn_col_option]
1390 IgorA 525
  copy_path ebx,fn_syntax_dir,file_name_rez,0x0
526
  copy_path file_name_rez,sys_path,file_name,0x0
1338 IgorA 527
 
528
  mov eax,70
529
  mov [run_file_70.func_n], 0
530
  mov [run_file_70.param1], 0
531
  mov [run_file_70.param2], 0
1456 IgorA 532
  mov ebx,ted_syntax_file_end
533
  sub ebx,ted_syntax_file
1338 IgorA 534
  mov [run_file_70.param3], ebx
1456 IgorA 535
  m2m [run_file_70.param4], ted_syntax_file
1338 IgorA 536
  mov [run_file_70.rezerv], 0
537
  mov [run_file_70.name], file_name
538
  mov ebx,run_file_70
539
  int 0x40
540
 
541
  mov ecx,0x100
1456 IgorA 542
  mov edx,FkPos
1338 IgorA 543
  @@:
1456 IgorA 544
    mov dword[edx],-1
545
    add edx,4
1338 IgorA 546
  loop @b
547
 
1456 IgorA 548
  ;init: ted_colors_text_count, ted_key_words_count, ...
549
  mov ted_colors_text_count,1
550
  mov ted_key_words_count,0
551
    mov ted_help_text_f1,0
552
  mov ted_help_id,-1 ;идентификатор слова для справки
1338 IgorA 553
 
554
  cmp eax,6
555
  je @f
556
  cmp eax,0
557
  je @f
558
    cmp ax,10
559
    jl .zifra_0_9
560
      mov al,'?'
561
      sub ax,48
562
    .zifra_0_9:
563
    add ax,48
564
 
565
    mov byte[msgbox_3.err],al
1456 IgorA 566
    stdcall [mb_create],msgbox_3,thread ;message: Can-t open color options file!
1338 IgorA 567
    jmp .no_colors
568
  @@:
569
 
1456 IgorA 570
  mov eax,edi ;сохраняем значение edi
571
  mov esi,ted_syntax_file
572
  add edi,ted_offs_count_colors
1338 IgorA 573
  mov ecx,9*4
574
  rep movsb
1456 IgorA 575
  mov edi,eax ;востанавливаем значение edi
1338 IgorA 576
 
1456 IgorA 577
  mov eax,ted_syntax_file
1338 IgorA 578
  add eax,32
1456 IgorA 579
  mov ted_text_colors,eax
1338 IgorA 580
 
1456 IgorA 581
  mov eax,ted_colors_text_count ;init: count_colors_text (offset to key words)
1338 IgorA 582
  add eax,8
583
  shl eax,2
1456 IgorA 584
  add eax,ted_syntax_file
585
  mov ted_key_words_data,eax
1338 IgorA 586
 
1456 IgorA 587
  mov ecx,ted_key_words_count ;init: FkPos (first key positions)
1338 IgorA 588
  xor eax,eax
589
  @@:
1456 IgorA 590
    ColToIndexOffset eax,edx
1338 IgorA 591
    xor ebx,ebx
1456 IgorA 592
    mov bl,byte[edx]
1338 IgorA 593
    shl bx,2
594
    mov esi,FkPos
595
    add esi,ebx
596
    cmp dword[esi],-1
597
    jne .no_ch_key
598
      mov dword[esi],eax
599
    .no_ch_key:
600
    inc eax
601
  loop @b
602
 
1456 IgorA 603
  ;init: ted_help_text_f1
604
  mov ecx,ted_key_words_count
1338 IgorA 605
  imul ecx,sizeof.TexColViv
1456 IgorA 606
  add ecx,ted_key_words_data
607
  mov ted_help_text_f1,ecx
1338 IgorA 608
 
609
  .no_colors:
1456 IgorA 610
  popad
1338 IgorA 611
  ret
1456 IgorA 612
endp
1338 IgorA 613
 
614
;input:
615
; ebx = file size
1456 IgorA 616
; edi = pointer to tedit struct
617
align 4
618
proc OpenFile
1338 IgorA 619
  push eax ;destination
620
  push ecx ;for cycle
621
  push edx ;source
622
 
1456 IgorA 623
    stdcall ted_clear,edi,0 ;чистим не всю память, потому что ниже будем ее заполнять новыми даными
1338 IgorA 624
    mov eax,ebx
625
    mov ecx,ebx
626
    add eax,2
627
    ConvertIndexToPointer eax
1456 IgorA 628
    mov edx,ted_tex
1338 IgorA 629
    add edx,ebx
630
  push ebx
631
    @@:
632
      mov ebx,[edx]
633
      mov byte [eax],bl
634
      mov dword [eax+2],ecx
635
      inc dword [eax+2]
636
      mov dword [eax+6],ecx
637
      add dword [eax+6],3
638
      ;mov byte[eax+1],0 ;col=0
639
      mov dword [eax+10],-1 ;tc=-1
640
      mov dword [eax+14],0 ;td=0
641
 
642
      cmp ecx,0
643
      je @f
644
      dec ecx
645
      dec edx
646
      sub eax,sizeof.symbol
647
      jmp @b
648
    @@:
649
  pop ebx
650
    add eax,2
651
    mov dword [eax],0 ; first sumbol 'perv=0'
652
 
1456 IgorA 653
    mov edx,ted_tex
1338 IgorA 654
    ; begining sumbol 'perv=0' 'next=2'
655
    mov dword [edx+2],0
656
    mov dword [edx+6],2
657
 
658
    add edx,sizeof.symbol
659
    mov dword [edx+6],0 ; last sumbol 'next=0'
660
    mov dword [edx+2],ebx ; last sumbol 'perv=last'
661
    inc dword [edx+2]
662
 
663
    mov edx,ebx
664
    inc edx ;2 = rezerv sumbols
665
    imul edx,sizeof.symbol
1456 IgorA 666
    add edx,ted_tex
1338 IgorA 667
    mov dword [edx+6],1 ; last sumbol 'next=1'
668
 
669
    @@: ;clear memory, need if before was open big file
670
      add edx,sizeof.symbol
1456 IgorA 671
      cmp edx,ted_tex_end
1338 IgorA 672
      jge @f
673
	mov dword[edx+10],0
674
	mov dword[edx+14],0
675
      jmp @b
676
    @@:
677
 
678
    call GetNumLines
679
    cmp eax,100
680
    jge @f
681
      mov eax,100
682
    @@:
683
    mov [wScr.max_area],eax
684
;    mov [wScr.redraw],1
685
  pop edx ecx eax
1456 IgorA 686
 
1338 IgorA 687
  call CmColored
1456 IgorA 688
  call draw_but_toolbar
689
  stdcall draw_main_win,edi
1338 IgorA 690
  ret
1456 IgorA 691
endp
1338 IgorA 692
 
693
;input:
694
; edx = pointer to symbol struct
1456 IgorA 695
; edi = pointer to tedit struct
1338 IgorA 696
;output:
697
; edx = pointer to 'perv' visible symbol struct
1456 IgorA 698
align 4
1338 IgorA 699
IteratPerv:
1456 IgorA 700
  cmp ted_tim_undo,0
1338 IgorA 701
  je .else
702
  push ebx
703
  @@:
704
    call GetTexPervPos
1456 IgorA 705
    cmp edx,ted_tex
1338 IgorA 706
    je @f
707
    call SymbNotVis
708
    cmp bl,1
709
    je @b
710
    cmp byte[edx],10 ;пропуск символа с кодом 10
711
    je @b
712
  @@:
713
  pop ebx
714
  ret
715
  .else:
716
    call GetTexPervPos
1456 IgorA 717
    cmp edx,ted_tex
1338 IgorA 718
    je .endif
719
    cmp dword [edx+14],0
720
    jne .else
721
    cmp byte[edx],10 ;пропуск символа с кодом 10
722
    je .else
723
  .endif:
724
  ret
725
 
726
 
727
;input:
728
; edx = pointer to symbol struct
1456 IgorA 729
; edi = pointer to tedit struct
1338 IgorA 730
;output:
731
; edx = pointer to 'next' visible symbol struct
1456 IgorA 732
align 4
1338 IgorA 733
IteratNext:
1456 IgorA 734
  cmp ted_tim_undo,0
1338 IgorA 735
  je .else
736
  push ebx
737
  @@:
738
    call GetTexNextPos
1456 IgorA 739
    cmp edx,ted_tex_1
1338 IgorA 740
    jle @f
741
    call SymbNotVis
742
    cmp bl,1
743
    je @b
744
    cmp byte[edx],10 ;пропуск символа с кодом 10
745
    je @b
746
  @@:
747
  pop ebx
748
  ret
749
  .else:
750
    call GetTexNextPos
1456 IgorA 751
    cmp edx,ted_tex_1
1338 IgorA 752
    jle .endif
753
    cmp dword [edx+14],0
754
    jne .else
755
    cmp byte[edx],10 ;пропуск символа с кодом 10
756
    je .else
757
  .endif:
758
  ret
759
 
760
;input:
1456 IgorA 761
; bl = symbol end of select
1338 IgorA 762
; edx = pointer to symbol struct
1456 IgorA 763
; edi = pointer to tedit struct
764
align 4
1338 IgorA 765
ItPoNextUc:
766
  @@:
767
    cmp bl,byte[edx]
768
    je @f
1456 IgorA 769
    cmp edx,ted_tex_1
1338 IgorA 770
    jle @f
771
    call IteratNext
772
    jmp @b
773
  @@:
774
  call IteratNext
775
  ret
776
 
777
;input:
778
; edx = pointer to symbol struct
1456 IgorA 779
; edi = pointer to tedit struct
780
align 4
1338 IgorA 781
ItPervColorTag:
782
  @@:
783
    cmp byte[edx+1],0
784
    jne @f
785
    call IteratPerv
1456 IgorA 786
    cmp edx,ted_tex_1
1338 IgorA 787
    jle @f
788
    jmp @b
789
  @@:
790
  ret
791
 
792
;input:
793
; edx = pointer to symbol struct
1456 IgorA 794
; edi = pointer to tedit struct
795
align 4
1338 IgorA 796
ItNextColorTag:
797
  @@:
798
    call IteratNext
799
    cmp byte[edx+1],0
800
    jne @f
1456 IgorA 801
    cmp edx,ted_tex_1
1338 IgorA 802
    jle @f
803
    jmp @b
804
  @@:
805
  ;call IteratNext
806
  ret
807
 
808
;input:
809
; edx = pointer to symbol struct
1456 IgorA 810
; edi = pointer to tedit struct
1338 IgorA 811
;output:
812
; bl = 1 if sumbol not visible
1456 IgorA 813
; (tex[i].td+ted_tim_undo<=ted_tim_ch && tex[i].td) || (tex[i].tc>ted_tim_ch-ted_tim_undo)
814
align 4
1338 IgorA 815
SymbNotVis:
816
  push eax
817
 
818
  xor bl,bl
819
 
820
  cmp dword [edx+14],0
821
  je @f
822
  mov eax,[edx+14] ;eax=tex[i].td
1456 IgorA 823
  add eax,ted_tim_undo
824
  cmp eax,ted_tim_ch
1338 IgorA 825
  jg @f
826
    mov bl,1
827
    pop eax
828
    ret
829
  @@:
830
 
1456 IgorA 831
  mov eax,ted_tim_ch
832
  sub eax,ted_tim_undo
1338 IgorA 833
  cmp [edx+10],eax
834
  jle @f
835
    or bl,1
836
  @@:
837
 
838
  pop eax
839
  ret
840
 
841
 
842
;input:
1456 IgorA 843
; text:dword - pointer to text string
844
; add_opt:dword - options
845
align 4
846
proc ted_text_add, edit:dword, text:dword, t_len:dword, add_opt:dword
847
  locals
848
    new_spc dd ? ;count new spaces
849
	new_lin dd ? ;count new lines
850
  endl
851
;использование регистров внутри функции:
852
;eax - позиция для вставки текста
853
;ebx - для временных нужд, длинна вставляемого текста
854
;ecx - для временных нужд
855
;edx - указатель на структуру символа
856
  pushad
857
  mov edi,dword[edit]
858
  mov esi,dword[text]
1338 IgorA 859
 
860
  call GetPos
861
  call GetTexPervPos
862
  call GetTexArrIndex ;eax=po_t
863
 
1456 IgorA 864
  mov dword[new_spc],0
865
  cmp ted_gp_opt,2
1338 IgorA 866
  je @f
1456 IgorA 867
    push eax ;c_sp=cur[cn].x+Scroller->XPos-StrLen(cur[cn].y+Scroller->YPos);
868
      mov eax,ted_cur_x
1338 IgorA 869
      add eax,[hScr.position]
1456 IgorA 870
      mov dword[new_spc],eax
1338 IgorA 871
 
1456 IgorA 872
      mov eax,ted_cur_y
1338 IgorA 873
      add eax,[wScr.position]
1456 IgorA 874
      call ted_strlen ;ebx = line len
875
      sub dword[new_spc],ebx
876
    pop eax
1338 IgorA 877
  @@:
878
 
1456 IgorA 879
  mov ebx,dword[t_len]
880
 
881
  mov dword[new_lin],0
882
  cmp ted_gp_opt,0
1338 IgorA 883
  jne @f
884
    push eax
1456 IgorA 885
      mov eax,ted_cur_y
1338 IgorA 886
      add eax,[wScr.position]
887
      inc eax
1456 IgorA 888
      mov dword[new_lin],eax
1338 IgorA 889
 
890
      call GetNumLines
1456 IgorA 891
      sub dword[new_lin],eax
1338 IgorA 892
    pop eax
893
  @@:
894
 
895
  mov edx,sizeof.symbol
896
  shl edx,1
1456 IgorA 897
  add edx,ted_tex
1338 IgorA 898
  @@: ;for(i=2;i
899
    cmp dword [edx+10],0 ;if(!tex[i].tc && !tex[i].td)
900
    jne .u1f
901
    cmp dword [edx+14],0
902
    jne .u1f
1456 IgorA 903
      test dword[add_opt],ted_opt_ed_change_time ;if(n_tim) ted_tim_ch++;
904
      jz .no_tim
905
	inc ted_tim_ch
1338 IgorA 906
      .no_tim:
1456 IgorA 907
      test dword[add_opt],ted_opt_ed_move_cursor
908
      jz .no_cur_mov
909
      cmp dword[new_lin],0 ;если есть добавочные строки, то курсор еще не двигаем
1338 IgorA 910
      jg .no_cur_mov
1456 IgorA 911
      cmp dword[new_spc],0 ;если нет добавочных пробелов, то курсор тоже не двигаем
1338 IgorA 912
      jg .no_cur_mov
1456 IgorA 913
	inc ted_cur_x ;move cursor
1338 IgorA 914
	;call GoToPos
1456 IgorA 915
	cmp byte [esi],13
1338 IgorA 916
	jne .no_cur_mov
1456 IgorA 917
	  mov ted_cur_x,0
918
	  inc ted_cur_y
1338 IgorA 919
      .no_cur_mov:
920
 
1456 IgorA 921
      mov ecx,ted_opt_ed_change_time
922
	  not ecx
923
	  and dword[add_opt],ecx ;n_tim=false;
1338 IgorA 924
 
1456 IgorA 925
      mov cl,byte [esi] ;tex[i].c=ta[ns];
1338 IgorA 926
      mov byte [edx],cl
1456 IgorA 927
      m2m dword [edx+10],ted_tim_ch ;tex[i].tc=ted_tim_ch;
1338 IgorA 928
      mov [edx+2],eax ;tex[i].perv=po_t;
929
 
930
      mov ecx,eax
931
      imul ecx,sizeof.symbol
1456 IgorA 932
      add ecx,ted_tex ; *** ecx = tex[po_t] ***
1338 IgorA 933
      add ecx,6   ; *** ecx = tex[po_t].next ***
934
      m2m dword [edx+6],dword [ecx] ;tex[i].next=tex[po_t].next;
935
 
936
      call GetTexArrIndex ;*** eax = i ***
937
      cmp eax,maxChars
938
      jge @f
939
      mov [ecx],eax ;tex[po_t].next=i; // ссылки перенаправляем
940
      mov ecx,[edx+6] ; *** ecx = tex[i].next ***
941
      imul ecx,sizeof.symbol
1456 IgorA 942
      add ecx,ted_tex ; *** ecx = tex[tex[i].next] ***
1338 IgorA 943
      mov [ecx+2],eax ;tex[tex[i].next].perv=i;
944
 
1456 IgorA 945
      cmp dword[new_lin],0 ;add lines or text
1338 IgorA 946
      jle .spc_add
1456 IgorA 947
	dec dword[new_lin]
1338 IgorA 948
	mov byte [edx],13
949
	jmp .u1f
950
      .spc_add:
1456 IgorA 951
      cmp dword[new_spc],0 ;add spaces or text
1338 IgorA 952
      jle .tex_add
1456 IgorA 953
	dec dword[new_spc]
1338 IgorA 954
	mov byte [edx],' '
955
	jmp .u1f
956
      .tex_add:
1456 IgorA 957
      inc esi
958
      dec ebx
1338 IgorA 959
    .u1f:
960
    add edx,sizeof.symbol
1456 IgorA 961
    cmp edx,ted_tex_end
1338 IgorA 962
    jge @f ;out of memory
1456 IgorA 963
    cmp ebx,0
1338 IgorA 964
    jne @b
965
  @@:
966
 
967
  call CmColored
1456 IgorA 968
  popad
1338 IgorA 969
  ret
1456 IgorA 970
endp
1338 IgorA 971
 
972
 
973
;input:
974
;  ecx = position to free insert cell
975
;  edx = pointer to sumbol, when insert
976
;  esi = pointer to added symbol
1456 IgorA 977
;  edi = pointer to tedit struct
1338 IgorA 978
;output:
979
;  ecx = position to inserted cell
1456 IgorA 980
align 4
1338 IgorA 981
CharAdd:
982
 
983
  .loop_b:
1456 IgorA 984
    cmp ecx,ted_tex_end
1338 IgorA 985
    jge .end_f
986
    cmp dword[ecx+10],0
987
    jne @f
988
      cmp dword[ecx+14],0
989
      je .loop_e
990
    @@:
991
    add ecx,sizeof.symbol
992
    jmp .loop_b
993
  .loop_e:
994
 
995
  push eax ebx
1456 IgorA 996
  mov eax,ted_tim_ch
1338 IgorA 997
  mov dword[ecx+10],eax
998
  mov al,byte[esi]
999
  mov byte[ecx],al
1000
 
1001
  call GetTexArrIndex ; *** eax=pos ***
1002
  mov [ecx+2],eax ;tex[i].perv=pos;
1003
  m2m dword[ecx+6],dword[edx+6] ;tex[i].next=tex[pos].next;
1004
 
1005
  push edx
1006
    mov edx,ecx
1007
    call GetTexArrIndex ; *** eax=i ***
1008
  pop edx
1009
 
1010
  mov [edx+6],eax ;tex[pos].next=i; // ссылки перенаправляем
1011
  mov ebx,[ecx+6]
1012
  ConvertIndexToPointer ebx
1013
  mov [ebx+2],eax ;tex[tex[i].next].perv=i; // ...
1014
  pop ebx eax
1015
 
1016
  .end_f:
1017
  call CmColored
1018
  ret
1019
 
1020
 
1021
;input:
1022
; conv_table = pointert to convert table
1456 IgorA 1023
; edi = pointer to tedit struct
1338 IgorA 1024
;output:
1456 IgorA 1025
; esi = count converted symbols
1026
align 4
1027
proc ConvertSelText
1028
  locals
1029
    conv_cou dd ?
1030
  endl
1031
  mov dword[conv_cou],0
1032
  pushad
1033
 
1034
  stdcall IsSel,edi
1338 IgorA 1035
  cmp al,0
1036
  je .end_f
1456 IgorA 1037
    stdcall ted_set_undo,edi
1038
    stdcall SelNormalize,edi
1338 IgorA 1039
 
1456 IgorA 1040
    mov esi,ted_seln_x0
1041
    mov ecx,ted_seln_y0
1338 IgorA 1042
    call GetPosByParam
1043
    mov eax,edx
1456 IgorA 1044
    mov esi,ted_seln_x1
1045
    mov ecx,ted_seln_y1
1338 IgorA 1046
    call GetPosByParam
1047
    ;call GetTexPervPos
1048
    mov ebx,edx
1049
 
1050
    cmp eax,ebx
1051
    je .end_f
1052
 
1456 IgorA 1053
    inc ted_tim_ch
1338 IgorA 1054
    mov edx,eax ;i=p0;
1055
    mov ecx,2
1056
    ConvertIndexToPointer ecx
1057
    @@:
1058
      mov esi,[edx]
1059
      and esi,0xff
1060
      add esi,[conv_table] ;EvUpper
1061
      cmp byte [esi],0
1062
      je .no_change
1456 IgorA 1063
	m2m dword [edx+14],ted_tim_ch
1338 IgorA 1064
	call CharAdd ;b_pos=CharAdd(tex[i].c^32,i,false,b_pos);
1065
	call GetTexNextPos ;go to added symbol
1456 IgorA 1066
	inc dword[conv_cou]
1338 IgorA 1067
      .no_change:
1068
 
1069
      call IteratNext
1456 IgorA 1070
      cmp edx,ted_tex
1338 IgorA 1071
      je @f
1072
      cmp edx,ebx
1073
      je @f
1074
 
1075
      jmp @b
1076
    @@:
1456 IgorA 1077
    cmp dword[conv_cou],0
1338 IgorA 1078
    jne @f
1456 IgorA 1079
      dec ted_tim_ch
1338 IgorA 1080
    @@:
1081
  .end_f:
1456 IgorA 1082
  popad
1083
  mov esi,dword[conv_cou]
1338 IgorA 1084
  ret
1456 IgorA 1085
endp
1338 IgorA 1086
 
1087
;output:
1088
; bl = 0 - no delete
1089
; bl = 1 - delete
1456 IgorA 1090
align 4
1091
proc TextDel, edit:dword, del_opt:dword
1092
  push cx edx edi
1093
  mov edi,dword[edit]
1094
  mov ebx,dword[del_opt]
1095
 
1338 IgorA 1096
  xor cl,cl
1456 IgorA 1097
  test ebx,ted_opt_ed_move_cursor
1098
  jz @f
1338 IgorA 1099
    call CurMoveLeft
1100
    cmp dl,0
1101
    je .no_del
1102
  @@:
1103
  call GetPos
1456 IgorA 1104
  cmp ted_gp_opt,1
1338 IgorA 1105
  je .no_del
1456 IgorA 1106
    test ebx,ted_opt_ed_change_time
1107
    jz @f
1108
      inc ted_tim_ch
1338 IgorA 1109
    @@:
1456 IgorA 1110
    m2m dword [edx+14], ted_tim_ch
1338 IgorA 1111
    mov cl,1
1112
  .no_del:
1113
  mov bl,cl
1456 IgorA 1114
  pop edi edx cx
1338 IgorA 1115
  ret
1456 IgorA 1116
endp
1338 IgorA 1117
 
1456 IgorA 1118
;input:
1119
; edi = pointer to tedit struct
1120
;output:
1121
; al = 1 if delete
1122
;description:
1123
; Функция удаляет выделенный текст
1124
align 4
1125
proc SelTextDel, del_opt:dword
1126
	push ebx ecx edx esi
1338 IgorA 1127
 
1456 IgorA 1128
	stdcall IsSel,edi
1129
	cmp al,0
1130
	je .end_f
1338 IgorA 1131
 
1456 IgorA 1132
		stdcall SelNormalize,edi
1133
 
1134
		mov esi,ted_seln_x1
1135
		mov ecx,ted_seln_y1
1136
		call GetPosByParam
1137
		mov ebx,edx
1138
 
1139
		mov esi,ted_seln_x0
1140
		mov ecx,ted_seln_y0
1141
		call GetPosByParam
1142
 
1143
		test dword[del_opt],ted_opt_ed_change_time
1144
		jz @f
1145
			inc ted_tim_ch
1146
		@@:
1147
		cmp edx,ted_tex
1148
		je @f
1149
		cmp edx,ebx ;if(i==te)break;
1150
		je @f
1151
			m2m dword[edx+14],ted_tim_ch
1152
			mov esi,ted_opt_ed_change_time
1153
			not esi
1154
			and dword[del_opt],esi ;n_tim=false;
1155
			call IteratNext
1156
			jmp @b
1157
		@@:
1158
		test dword[del_opt],ted_opt_ed_change_time
1159
		jz @f
1160
			dec ted_tim_ch
1161
			xor al,al
1162
		@@:
1163
		test dword[del_opt],ted_opt_ed_change_time
1164
		jnz @f
1165
			mov ecx,ted_seln_x0
1166
			mov edx,ted_seln_y0
1167
			call GoToPos
1168
			mov ted_sel_x0,0
1169
			mov ted_sel_y0,0
1170
			mov ted_sel_x1,0
1171
			mov ted_sel_y1,0
1172
		@@:
1173
	.end_f:
1174
	pop esi edx ecx ebx
1175
	ret
1176
endp
1177
 
1178
 
1338 IgorA 1179
;input:
1180
; eax = pointer to begin select
1181
; ebx = pointer to end select
1456 IgorA 1182
; edi = pointer to tedit struct
1183
align 4
1338 IgorA 1184
Revers:
1185
  cmp eax,ebx
1186
  jne @f
1187
    ret
1188
  @@:
1189
 
1190
  push ecx edx
1191
 
1456 IgorA 1192
  mov edx,ted_tex_1
1338 IgorA 1193
  cmp edx,ebx ;if(p1==1)p1=tex[1].perv;
1194
  jne @f
1195
    call GetTexPervPos
1196
    mov ebx,edx
1197
  @@:
1198
 
1199
  push esi
1200
    mov edx,[eax+2] ; *** edx = tex[p0].perv ***
1201
    ConvertIndexToPointer edx
1202
    add edx,6
1203
    mov ecx,[edx] ;tmp = tex[tex[p0].perv].next;
1204
 
1205
    mov esi,[ebx+6] ; *** esi = tex[p1].next ***
1206
    ConvertIndexToPointer esi
1207
    add esi,2
1208
    m2m dword[edx],dword[esi] ;tex[tex[p0].perv].next = tex[tex[p1].next].perv;
1209
 
1210
    mov [esi],ecx ;tex[tex[p1].next].perv = tmp;
1211
  pop esi
1212
 
1213
  mov ecx,[eax+2] ;tmp = tex[p0].perv;
1214
  m2m dword[eax+2],dword[ebx+6] ;tex[p0].perv = tex[p1].next;
1215
  mov [ebx+6],ecx ;tex[p1].next = tmp;
1216
 
1217
  mov edx,eax ;i=p0;
1218
  @@:
1219
    mov ecx,[edx+6] ;tmp = tex[i].next;
1220
    m2m dword[edx+6],dword[edx+2] ;tex[i].next = tex[i].perv;
1221
    mov [edx+2],ecx ;tex[i].perv = tmp;
1222
    cmp edx,ebx ;if(i==p1)break;
1223
    je @f
1224
; ---
1456 IgorA 1225
;cmp edx,ted_tex
1338 IgorA 1226
;je @f
1227
; ---
1228
    mov edx,ecx ;i = tmp;
1229
    ConvertIndexToPointer edx
1230
    jmp @b
1231
  @@:
1232
  pop edx ecx
1233
  call CmColored
1234
  ret
1235
 
1236
 
1456 IgorA 1237
;input:
1238
; edi = pointer to tedit struct
1338 IgorA 1239
;output:
1240
; dl = 0 not move
1241
; dl = 2 if move up
1242
; dl = 8 if scroll move up
1456 IgorA 1243
align 4
1338 IgorA 1244
CurMoveUp:
1456 IgorA 1245
  cmp ted_cur_y,0
1338 IgorA 1246
  je @f
1456 IgorA 1247
    dec ted_cur_y
1338 IgorA 1248
    mov dl,2
1249
    ret
1250
  @@:
1251
  cmp [wScr.position],0
1252
  je @f
1253
    dec [wScr.position]
1254
    mov dl,8
1255
    ret
1256
  @@:
1257
  mov dl,0
1258
  ret
1259
 
1456 IgorA 1260
;input:
1261
; edi = pointer to tedit struct
1338 IgorA 1262
;output:
1263
; dl = 0 not move
1264
; dl = 2 if move down
1265
; dl = 8 if scroll move down
1456 IgorA 1266
align 4
1338 IgorA 1267
CurMoveDown:
1456 IgorA 1268
  push eax ebx
1338 IgorA 1269
  mov dl,0
1456 IgorA 1270
  mov ebx,ted_scr_w
1271
  mov eax,dword[ebx+sb_offs_cur_area]
1338 IgorA 1272
  dec eax
1456 IgorA 1273
  cmp ted_cur_y,eax
1338 IgorA 1274
  jge @f
1456 IgorA 1275
    inc ted_cur_y
1338 IgorA 1276
    mov dl,2
1277
    jmp .ret_f
1278
  @@:
1456 IgorA 1279
  mov eax,ted_cur_y
1280
  add eax,dword[ebx+sb_offs_position]
1338 IgorA 1281
  inc eax
1456 IgorA 1282
  cmp dword[ebx+sb_offs_max_area],eax
1338 IgorA 1283
  jle @f
1456 IgorA 1284
    inc dword[ebx+sb_offs_position]
1338 IgorA 1285
    mov dl,8
1286
  @@:
1287
  .ret_f:
1456 IgorA 1288
  pop ebx eax
1338 IgorA 1289
  ret
1290
 
1291
 
1292
;output:
1293
; dl = 0 not move
1294
; dl = 1 if move up
1456 IgorA 1295
align 4
1338 IgorA 1296
CurMovePageUp:
1297
  push eax
1298
  mov eax,[wScr.cur_area]
1299
  xor dl,dl
1300
  cmp eax,[wScr.position]
1301
  jg @f
1302
    sub [wScr.position],eax
1303
    mov dl,1
1304
  @@:
1305
  cmp [wScr.position],0
1306
  je @f
1307
  cmp dl,1
1308
  je @f
1309
    mov [wScr.position],0
1310
    mov dl,1
1311
  @@:
1312
  pop eax
1313
  ret
1314
 
1456 IgorA 1315
;input:
1316
; edi = pointer to tedit struct
1317
align 4
1338 IgorA 1318
CurMovePageDown:
1456 IgorA 1319
	push eax ebx ecx
1320
	mov ecx,ted_scr_w
1338 IgorA 1321
 
1456 IgorA 1322
	xor dl,dl
1323
	mov eax,dword[ecx+sb_offs_max_area]
1324
	sub eax,dword[ecx+sb_offs_cur_area]
1325
	cmp dword[ecx+sb_offs_position],eax
1326
	jge @f
1327
		mov ebx,dword[ecx+sb_offs_cur_area]
1328
		add dword[ecx+sb_offs_position],ebx
1329
		mov dl,1
1330
		mov dword[ecx+sb_offs_redraw],1
1331
		cmp dword[ecx+sb_offs_position],eax
1332
		jle @f
1333
			mov dword[ecx+sb_offs_position],eax
1334
	@@:
1335
	pop ecx ebx eax
1336
	ret
1337
 
1338
;input:
1339
; edi = pointer to tedit struct
1338 IgorA 1340
;output:
1341
; dl = 0 not move
1342
; dl = 1 if move left
1343
; dl = 3 if move left and up
1344
; dl = 8 if scroll move up
1456 IgorA 1345
align 4
1338 IgorA 1346
CurMoveLeft:
1456 IgorA 1347
  cmp ted_cur_x,0
1338 IgorA 1348
  je @f
1456 IgorA 1349
    dec ted_cur_x
1338 IgorA 1350
    mov dl,1
1351
    ret
1352
  @@:
1353
  cmp [hScr.position],0
1354
  je @f
1355
    dec [hScr.position]
1356
    mov dl,8
1357
    ret
1358
  @@:
1456 IgorA 1359
  cmp ted_cur_y,0
1338 IgorA 1360
  jne @f
1361
    mov dl,0
1362
    cmp [wScr.position],0
1363
    je .ret_f
1364
      dec [wScr.position]
1365
      call OnInitialUpdate
1366
      call CurMoveX_LastChar
1367
      mov dl,8
1368
    jmp .ret_f
1369
  @@:
1456 IgorA 1370
  cmp ted_cur_y,0
1338 IgorA 1371
  je @f
1456 IgorA 1372
  dec ted_cur_y
1338 IgorA 1373
  call CurMoveX_LastChar
1374
  cmp dl,8
1375
  je .ret_f
1376
  mov dl,3
1377
  ret
1378
  @@:
1379
  mov dl,0
1380
  .ret_f:
1381
  ret
1382
 
1456 IgorA 1383
;input:
1384
; edi = pointer to tedit struct
1385
align 4
1338 IgorA 1386
CurMoveRight:
1387
  push eax
1388
  xor dl,dl
1389
  mov eax,[hScr.cur_area]
1456 IgorA 1390
  cmp ted_cur_x,eax
1338 IgorA 1391
  jge @f
1456 IgorA 1392
    inc ted_cur_x
1338 IgorA 1393
    mov dl,1
1394
    jmp .ret_f
1395
  @@:
1396
    inc [hScr.position]
1397
    mov dl,8
1398
  .ret_f:
1399
  pop eax
1400
  ret
1401
 
1456 IgorA 1402
;input:
1403
; edi = pointer to tedit struct
1404
align 4
1338 IgorA 1405
CurMoveX_LastChar:
1406
;[hScr.position]
1407
;[hScr.cur_area]
1408
;dl-???
1409
  push eax ebx
1456 IgorA 1410
  mov eax,ted_cur_y
1338 IgorA 1411
  add eax,[wScr.position]
1456 IgorA 1412
  call ted_strlen
1338 IgorA 1413
  xor dl,dl
1414
 
1415
  cmp ebx,[hScr.position]
1416
  jge @f
1417
    mov dl,8
1418
    mov [hScr.position],ebx
1419
  @@:
1420
  sub ebx,[hScr.position]
1421
 
1422
  cmp ebx,[hScr.cur_area]
1423
  jle @f ; b---[---]---e
1424
    add [hScr.position],ebx
1425
    mov ebx,[hScr.cur_area]
1426
    sub [hScr.position],ebx
1427
    mov dl,8
1428
  @@:
1456 IgorA 1429
  mov ted_cur_x,ebx
1338 IgorA 1430
  pop ebx eax
1431
  ret
1432
 
1456 IgorA 1433
;input:
1434
; edi = pointer to tedit struct
1338 IgorA 1435
;output:
1436
; dl = 0 not move
1437
; dl = 1 move cursor
1438
; dl = 8 move cursor and scroll
1456 IgorA 1439
align 4
1338 IgorA 1440
CurMoveX_FirstChar:
1441
  xor dl,dl
1456 IgorA 1442
  cmp ted_cur_x,0
1338 IgorA 1443
  je @f
1456 IgorA 1444
  mov ted_cur_x,0
1338 IgorA 1445
  mov dl,1
1446
  @@:
1447
  cmp [hScr.position],0
1448
  je @f
1449
    mov [hScr.position],0
1450
    mov dl,8
1451
  @@:
1452
  ret
1453
 
1454
;input:
1455
; edx = pointer to symbol struct
1456 IgorA 1456
; edi = pointer to tedit struct
1338 IgorA 1457
;output:
1458
; eax = array index
1456 IgorA 1459
align 4
1338 IgorA 1460
GetTexArrIndex:
1461
  push ecx edx
1462
 
1463
  mov eax,edx
1456 IgorA 1464
  sub eax,ted_tex
1338 IgorA 1465
  xor edx,edx
1466
  mov ecx,sizeof.symbol
1467
  div ecx
1468
 
1469
  pop edx ecx
1470
  ret
1471
 
1472
;input:
1473
; edx = pointer to symbol struct
1456 IgorA 1474
; edi = pointer to tedit struct
1338 IgorA 1475
;output:
1476
; edx = pointer to 'perv' struct
1456 IgorA 1477
align 4
1338 IgorA 1478
GetTexPervPos:
1479
  push dword [edx+2]
1480
  pop edx
1481
  imul edx,sizeof.symbol
1456 IgorA 1482
  add edx,ted_tex
1338 IgorA 1483
  ret
1484
 
1485
;input:
1486
; edx = pointer to symbol struct
1487
;output:
1488
; edx = pointer to 'next' symbol struct
1456 IgorA 1489
align 4
1338 IgorA 1490
GetTexNextPos:
1491
  push dword [edx+6]
1492
  pop edx
1493
  imul edx,sizeof.symbol
1456 IgorA 1494
  add edx,ted_tex
1338 IgorA 1495
  ret
1496
 
1456 IgorA 1497
;input:
1498
; edi = pointer to tedit struct
1338 IgorA 1499
;output:
1500
; edx = symbol under cursor
1456 IgorA 1501
; ted_gp_opt = 1,2
1338 IgorA 1502
; edx = tex[1].perv if error
1456 IgorA 1503
; ted_gp_opt = 0
1504
align 4
1338 IgorA 1505
GetPos:
1506
  push esi ecx
1456 IgorA 1507
    mov esi,ted_cur_x
1338 IgorA 1508
    add esi,[hScr.position]
1456 IgorA 1509
    mov ecx,ted_cur_y
1338 IgorA 1510
    add ecx,[wScr.position]
1511
    call GetPosByParam
1512
  pop ecx esi
1513
  ret
1514
 
1515
 
1516
;input:
1517
; esi = XPos
1518
; ecx = YPos
1456 IgorA 1519
; edi = pointer to tedit struct
1338 IgorA 1520
;output:
1521
; edx = symbol under cursor
1456 IgorA 1522
; ted_gp_opt = 1 if found text line
1523
; ted_gp_opt = 2 if found text line and column
1338 IgorA 1524
; edx = tex[1] if error
1456 IgorA 1525
; ted_gp_opt = 0 if text no found
1526
align 4
1338 IgorA 1527
GetPosByParam:
1528
  push eax ;Row
1529
  push ebx ;Col
1530
 
1531
  xor eax,eax
1532
  xor ebx,ebx
1456 IgorA 1533
  mov ted_gp_opt,0
1534
  mov edx,ted_tex
1338 IgorA 1535
  @@:
1536
    call IteratNext
1456 IgorA 1537
    cmp edx,ted_tex_1
1338 IgorA 1538
    jle @f
1539
    cmp ebx,esi
1456 IgorA 1540
    jne .u1_0 ;Col <> ted_cur_x
1541
      mov ted_gp_opt,1
1338 IgorA 1542
      cmp eax,ecx
1456 IgorA 1543
      jge @f ; Row >= ted_cur_y
1338 IgorA 1544
    .u1_0:
1456 IgorA 1545
    mov ted_gp_opt,0
1338 IgorA 1546
    inc ebx
1547
    cmp byte [edx],13
1548
    jne @b
1549
    cmp eax,ecx
1456 IgorA 1550
    jge @f ; Row >= ted_cur_y
1338 IgorA 1551
    inc eax
1552
    xor ebx,ebx
1553
    jmp @b
1554
  @@:
1555
  cmp eax,ecx
1456 IgorA 1556
  jne @f ; Row = ted_cur_y
1557
    inc ted_gp_opt
1338 IgorA 1558
  @@:
1456 IgorA 1559
  cmp ted_gp_opt,0
1338 IgorA 1560
  jne @f
1456 IgorA 1561
    mov edx,ted_tex_1
1338 IgorA 1562
    ;call GetTexPervPos
1563
  @@:
1564
  pop ebx eax
1565
  ret
1566
 
1567
 
1568
;input:
1569
; eax = Row
1456 IgorA 1570
; edi = pointer to tedit struct
1338 IgorA 1571
;output:
1572
; ebx = str len
1456 IgorA 1573
align 4
1574
ted_strlen:
1338 IgorA 1575
  push edx ecx
1576
  ;ecx = Row, from cycle
1577
 
1578
  xor ebx,ebx
1579
  xor ecx,ecx
1456 IgorA 1580
  mov edx,ted_tex
1338 IgorA 1581
  @@:
1582
    call IteratNext
1456 IgorA 1583
    cmp edx,ted_tex_1
1338 IgorA 1584
    jle @f
1585
    inc ebx
1586
    cmp byte [edx],13
1587
    jne @b
1588
    dec ebx ;lenght minus 1 sumbol to paragraph
1589
    cmp eax,ecx
1590
    je @f
1591
    xor ebx,ebx
1592
    inc ecx
1593
    jmp @b
1594
  @@:
1595
 
1596
  cmp eax,ecx
1597
  je @f
1598
    xor ebx,ebx
1599
  @@:
1600
 
1601
  pop ecx edx
1602
  ret
1603
 
1604
 
1456 IgorA 1605
;input:
1338 IgorA 1606
; edx = symbol position
1456 IgorA 1607
; edi = pointer to tedit struct
1338 IgorA 1608
;output:
1609
; eax = number of line
1610
; ebx = symbol position in line
1456 IgorA 1611
align 4
1338 IgorA 1612
GetTexCoords:
1613
  push edx
1614
  xor eax,eax
1615
  xor ebx,ebx
1616
  @@:
1617
    call IteratPerv
1618
 
1619
    cmp eax,0
1620
    jne .no_col_mov
1621
    inc ebx
1622
    .no_col_mov:
1623
 
1456 IgorA 1624
    cmp edx,ted_tex_1
1338 IgorA 1625
    jle @f
1626
    cmp byte [edx],13
1627
    jne @b
1628
    inc eax
1629
    jmp @b
1630
  @@:
1631
  dec ebx
1632
  pop edx
1633
  ret
1634
 
1456 IgorA 1635
;input:
1636
; edi = pointer to tedit struct
1338 IgorA 1637
;output:
1638
; eax = num lines
1456 IgorA 1639
align 4
1338 IgorA 1640
GetNumLines:
1641
  push edx
1642
  mov eax,1
1456 IgorA 1643
  mov edx,ted_tex
1338 IgorA 1644
  @@:
1645
    call IteratNext
1456 IgorA 1646
    cmp edx,ted_tex_1
1338 IgorA 1647
    jle @f
1648
    cmp byte [edx],13
1649
    jne @b
1650
    inc eax
1651
    jmp @b
1652
  @@:
1653
;...
1654
;dec eax
1655
  pop edx
1656
  ret
1657
 
1456 IgorA 1658
 
1659
align 4
1660
proc ted_set_undo, edit:dword
1661
  push edi
1662
  mov edi,dword[edit]
1663
 
1664
  mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры
1665
  cmp ted_tim_undo,1
1338 IgorA 1666
  jl .no_work
1667
 
1668
  push eax ebx edx
1456 IgorA 1669
  mov edx,ted_tex
1338 IgorA 1670
  call GetTexNextPos ;long i=tex[0].next;
1456 IgorA 1671
  mov eax,ted_tim_undo
1672
  sub ted_tim_ch,eax ;ted_tim_ch-=ted_tim_undo;
1673
  mov eax,ted_tim_ch
1674
  cmp ted_tim_ls,eax ;if(ted_tim_ls>ted_tim_ch)
1338 IgorA 1675
  jle @f
1456 IgorA 1676
    mov ted_tim_ls,0
1338 IgorA 1677
  @@:
1456 IgorA 1678
    cmp edx,ted_tex
1338 IgorA 1679
    je @f
1680
 
1456 IgorA 1681
    ;if(tex[i].tc>ted_tim_ch){ // если создание символа было отменено
1338 IgorA 1682
    cmp [edx+10],eax
1683
    jle .no_u1
1684
      mov dword [edx+10],0
1685
      mov dword [edx+14],0
1686
 
1687
      mov ebx,[edx+2]
1688
      imul ebx,sizeof.symbol
1456 IgorA 1689
      add ebx,ted_tex;.next
1338 IgorA 1690
      m2m dword [ebx+6],dword [edx+6] ;tex[tex[i].perv].next=tex[i].next;
1691
 
1692
      mov ebx,[edx+6]
1693
      imul ebx,sizeof.symbol
1456 IgorA 1694
      add ebx,ted_tex;.perv
1338 IgorA 1695
      m2m dword [ebx+2],dword [edx+2] ;tex[tex[i].next].perv=tex[i].perv;
1696
 
1697
    .no_u1:
1698
 
1456 IgorA 1699
    ;else if(tex[i].td>ted_tim_ch) tex[i].td=0; // если удаление символа было отменено
1338 IgorA 1700
    cmp [edx+14],eax
1701
    jle .no_u2
1702
      mov dword [edx+14],0
1703
    .no_u2:
1704
 
1705
    call GetTexNextPos
1706
    jmp @b
1707
  @@:
1456 IgorA 1708
  mov ted_tim_undo,0
1709
  mov eax,ted_tim_co
1710
  cmp ted_tim_ch,eax
1338 IgorA 1711
  jge @f
1456 IgorA 1712
    mov ted_tim_co,0
1338 IgorA 1713
  @@:
1714
  pop edx ebx eax
1715
  .no_work:
1456 IgorA 1716
  pop edi
1338 IgorA 1717
  ret
1456 IgorA 1718
endp
1338 IgorA 1719
 
1720
;input:
1721
; ecx = Col
1722
; edx = Row
1456 IgorA 1723
; edi = pointer to tedit struct
1724
align 4
1338 IgorA 1725
GoToPos:
1456 IgorA 1726
  mov ted_cur_x,ecx
1338 IgorA 1727
  sub edx,[wScr.position]
1728
 
1456 IgorA 1729
  cmp edx,[wScr.cur_area] ;ted_cur_y > [.cur_area]
1338 IgorA 1730
  jl @f
1731
    push ebx
1732
    mov ebx,edx
1733
    sub ebx,[wScr.cur_area]
1734
    inc ebx
1735
    add [wScr.position],ebx
1736
    sub edx,ebx
1737
    pop ebx
1738
    ; ??? redrav
1739
  @@:
1456 IgorA 1740
  mov ted_cur_y,edx
1338 IgorA 1741
  ret
1742
 
1743
;input:
1456 IgorA 1744
; edi = pointer to tedit struct
1745
align 4
1338 IgorA 1746
CmColored:
1747
  push eax edx
1456 IgorA 1748
  mov eax,ted_tim_ch
1749
  sub eax,ted_tim_undo
1750
  mov ted_tim_co,eax
1751
  mov edx,ted_tex
1338 IgorA 1752
  @@:
1753
    call IteratNext
1456 IgorA 1754
    cmp edx,ted_tex_1
1338 IgorA 1755
    jle @f
1756
    mov byte[edx+1],0
1757
    jmp @b
1758
  @@:
1759
 
1456 IgorA 1760
  cmp ted_key_words_count,1
1338 IgorA 1761
  jl .no_colors
1456 IgorA 1762
  mov edx,ted_tex
1338 IgorA 1763
  @@:
1764
    call TextFSColor
1456 IgorA 1765
    cmp edx,ted_tex_1
1338 IgorA 1766
    jle .no_colors
1767
    jmp @b
1768
  .no_colors:
1769
  pop edx eax
1770
  ret
1771
 
1772
 
1773
;input:
1774
; edx = pointer to start symbol
1456 IgorA 1775
; edi = pointer to tedit struct
1338 IgorA 1776
;output:
1777
; edx = pointer to next symbol
1456 IgorA 1778
;description:
1779
; Функция для поиска и выделения подсвеченых слов
1780
align 4
1781
proc TextFSColor
1782
locals
1783
  begPos dd ? ;начальная позиция
1784
  endPos dd ? ;конечная позиция
1785
  find db ? ;найдено / не найдено
1786
  f_color db ? ;индекс цвета найденого слова
1787
endl
1788
  push eax ebx ecx esi
1789
;eax = word_n текущий номер (позиция) проверяемого слова в списке
1790
;ebx = для разных целей
1791
;ecx = l_pos последний номер (позиция) подходящего слова в списке
1792
;esi = для разных целей, номер проверяемого символа в слове
1793
  mov dword[begPos],1
1794
  mov dword[endPos],1
1795
  mov byte[find],0
1796
  mov byte[f_color],1
1338 IgorA 1797
  @@:
1798
    call IteratNext
1456 IgorA 1799
    cmp edx,ted_tex_1
1338 IgorA 1800
    jle @f
1801
 
1456 IgorA 1802
    xor eax,eax
1803
    mov al,byte[edx]
1804
    shl ax,2 ;eax*=4
1805
    add eax,FkPos
1806
    mov eax,dword[eax]
1338 IgorA 1807
    cmp eax,0
1808
    jl @b ;if( (word_n=FkPos[(unsigned char)tex[i].c])>-1 ){
1809
 
1810
    mov ecx,eax
1456 IgorA 1811
    ;while(l_pos
1338 IgorA 1812
    .wh_1b:
1456 IgorA 1813
      cmp ecx,ted_key_words_count
1338 IgorA 1814
      jge .wh_1e
1815
      ColToIndexOffset ecx,esi
1456 IgorA 1816
      mov bl,byte[esi]
1338 IgorA 1817
      ColToIndexOffset eax,esi
1456 IgorA 1818
      cmp bl,byte[esi]
1338 IgorA 1819
      jne .wh_1e
1820
	inc ecx
1821
      jmp .wh_1b
1822
    .wh_1e:
1823
 
1456 IgorA 1824
    mov dword[begPos],edx ;bP=i;
1825
    mov esi,1
1338 IgorA 1826
 
1827
    .wh_2b: ;while(1){
1828
      call IteratNext
1829
 
1456 IgorA 1830
      ;while(l_pos>word_n && Col[l_pos-1].Text[pos]!=tex[i].c)
1338 IgorA 1831
      .wh_3b:
1832
	cmp ecx,eax
1833
	jle .wh_3e
1834
	dec ecx
1835
	ColToIndexOffset ecx,ebx
1836
	inc ecx
1456 IgorA 1837
	;cmp byte[ebx+esi],byte[edx]
1838
	mov bl,byte[ebx+esi]
1338 IgorA 1839
	cmp bl,byte[edx]
1840
	je .wh_3e
1841
	  dec ecx
1842
	jmp .wh_3b
1843
      .wh_3e:
1844
 
1845
      ColToIndexOffset eax,ebx
1456 IgorA 1846
      cmp byte[ebx+esi],0
1847
      jne .if_0 ;if(Col[word_n].Text[pos]==0){
1848
	mov dword[endPos],edx ;eP=i;
1849
	ColToIndexOffset eax,ebx
1850
	mov bl,byte[ebx+MAX_COLOR_WORD_LEN+6]
1851
	mov byte[f_color],bl ;f_color=Col[word_n].color;
1338 IgorA 1852
 
1456 IgorA 1853
mov byte[find],1
1854
	  ColToIndexOffset eax,ebx ;... ebx = Col[word_n]
1855
	  mov bl,byte[ebx+MAX_COLOR_WORD_LEN+4]
1856
	  cmp bl,0 ;if(Col[word_n].wwo)
1338 IgorA 1857
	  je .if_2n
1858
	    push edx
1456 IgorA 1859
	    mov edx,dword[begPos]
1338 IgorA 1860
     call IteratPerv
1861
 
1862
	    btr bx,0 ;1-1
1456 IgorA 1863
	    jae .if_3e ;if(Col[word_n].wwo&1)
1338 IgorA 1864
	      ;u1= !(isalnum(cont_s)||cont_s=='_')
1865
	      call isalnum
1866
	      jae .if_3e
1456 IgorA 1867
		mov byte[find],0
1338 IgorA 1868
	    .if_3e:
1869
 
1870
	    btr bx,3 ;4-1
1456 IgorA 1871
	    jae .if_4e ;if(Col[word_n].wwo&8)
1338 IgorA 1872
	      ;u1= !isalpha(cont_s);
1873
	      call isalpha
1874
	      jae .if_4e
1456 IgorA 1875
		mov byte[find],0
1338 IgorA 1876
	    .if_4e:
1877
 
1456 IgorA 1878
	    mov edx,dword[endPos]
1338 IgorA 1879
;     call IteratNext
1880
 
1881
	    btr bx,1 ;2-1
1456 IgorA 1882
	    jae .if_5e ;if(Col[word_n].wwo&2)
1338 IgorA 1883
	      ;u1= !(isalnum(cont_s)||cont_s=='_')
1884
	      call isalnum
1885
	      jae .if_5e
1456 IgorA 1886
		mov byte[find],0
1338 IgorA 1887
	    .if_5e:
1888
 
1889
	    btr bx,4 ;5-1
1456 IgorA 1890
	    jae .if_6e ;if(Col[word_n].wwo&16)
1338 IgorA 1891
	      ;u1= !isalpha(cont_s);
1892
	      call isalpha
1893
	      jae .if_6e
1456 IgorA 1894
		mov byte[find],0
1338 IgorA 1895
	    .if_6e:
1896
 
1897
	    btr bx,2 ;3-1
1456 IgorA 1898
	    jae .if_7e ;if(Col[word_n].wwo&4)
1899
	    ColToIndexOffset eax,ebx
1900
	    mov bl,byte[ebx+MAX_COLOR_WORD_LEN+5]
1901
	    call ItPoNextUc
1902
       cmp edx,ted_tex_1
1338 IgorA 1903
       jle .if_7e
1456 IgorA 1904
       mov dword[endPos],edx
1338 IgorA 1905
	    .if_7e:
1906
 
1907
	    pop edx
1908
	  .if_2n:
1909
;                 if(i!=1){ // не конец документа
1910
;                   cont_s=tex[eP].c;
1456 IgorA 1911
;                   if(Col[word_n].wwo&2) u2= !(isalnum(cont_s)||cont_s=='_');  // не букв.-числ. символ
1912
;                   if(u2 && Col[word_n].wwo&16) u2= !isalpha(cont_s); // не числ. символ
1913
;                   if(Col[word_n].wwo&4) eP=ItPoNextUc(eP,Col[word_n].endc);
1338 IgorA 1914
 
1915
	cmp eax,ecx
1916
	je .wh_2e ;if(word_n==l_pos) break; // do double - если слово точно последнее
1917
      .if_0:
1918
 
1456 IgorA 1919
      cmp edx,ted_tex_1
1338 IgorA 1920
      jle .wh_2e ;if(i==1) break;
1921
 
1456 IgorA 1922
      ;while(l_pos>word_n && Col[word_n].Text[pos]!=tex[i].c)
1338 IgorA 1923
      .wh_4b:
1924
	cmp ecx,eax
1925
	jle .wh_4e
1926
	ColToIndexOffset eax,ebx
1456 IgorA 1927
	;cmp byte[ebx+esi],byte[edx]
1928
	mov bl,byte[ebx+esi]
1338 IgorA 1929
	cmp bl,byte[edx]
1930
	je .wh_4e
1931
	  inc eax
1932
	jmp .wh_4b
1933
      .wh_4e:
1934
 
1935
      cmp eax,ecx
1936
      je .wh_2e;if(word_n==l_pos) break;
1456 IgorA 1937
      inc esi ;pos++;
1338 IgorA 1938
      jmp .wh_2b
1939
    .wh_2e:
1940
 
1456 IgorA 1941
    cmp byte[find],1 ;if(fnd)break;
1338 IgorA 1942
    je @f
1456 IgorA 1943
    mov edx,dword[begPos];i=bP;
1338 IgorA 1944
    jmp @b
1945
  @@:
1946
 
1456 IgorA 1947
  cmp byte[find],1
1338 IgorA 1948
  jne .if_1e ;if(fnd){ // выделение найденого текста
1456 IgorA 1949
;    if(!mode_sf1 || (mode_sf1 && strlen(Col[word_n].f1->c_str())>0)){
1950
    mov eax,dword[begPos]
1951
    mov bl,byte[f_color]
1338 IgorA 1952
    mov byte[eax+1],bl ;tex[bP].col=f_color;
1456 IgorA 1953
    mov eax,dword[endPos]
1338 IgorA 1954
    mov byte[eax+1],0xff ;tex[eP].col=255;
1955
;    return ItPoPerv(eP); // возвращаем позицию конца вхождения
1456 IgorA 1956
    mov edx,dword[endPos]
1338 IgorA 1957
    call GetTexPervPos
1958
    jmp @f
1959
  .if_1e:
1456 IgorA 1960
    mov edx,ted_tex
1338 IgorA 1961
  @@:
1962
 
1456 IgorA 1963
  pop esi ecx ebx eax
1338 IgorA 1964
  ret
1456 IgorA 1965
endp
1338 IgorA 1966
 
1967
;input:
1968
; edx = pointer to char (byte)
1969
;output:
1970
; cf=1 if symbol is...
1456 IgorA 1971
align 4
1972
tab_all_num db 0,0,0,0,0,0,11111111b,11b,11111110b,0xff,0xff,111b,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
1338 IgorA 1973
tab_alpha db 0,0,0,0,0,0,0,0,11111110b,0xff,0xff,111b,11111110b,0xff,0xff,111b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1456 IgorA 1974
 
1975
align 4
1338 IgorA 1976
isalnum:
1977
  push eax ebx
1978
  mov al,byte[edx] ;al=offset
1979
  shr al,3
1980
  and eax,11111b
1981
  mov ebx,tab_all_num
1982
  add ebx,eax
1983
  mov ah,byte[ebx]
1984
  mov al,byte[edx] ;al=bit
1985
  and ax,111b
1456 IgorA 1986
  mov bx,word[ebx]
1338 IgorA 1987
  btr bx,ax
1988
  pop ebx eax
1989
  ret
1456 IgorA 1990
align 4
1338 IgorA 1991
isalpha:
1992
  push eax ebx
1993
  mov al,byte[edx] ;al=offset
1994
  shr al,3
1995
  and eax,11111b
1996
  mov ebx,tab_alpha
1997
  add ebx,eax
1998
  mov ah,byte[ebx]
1999
  mov al,byte[edx] ;al=bit
2000
  and ax,111b
1456 IgorA 2001
  mov bx,word[ebx]
1338 IgorA 2002
  btr bx,ax
2003
  pop ebx eax
2004
  ret
2005
 
1456 IgorA 2006
align 4
2007
proc ted_show_help_f1, edit:dword
2008
  push eax edx edi
2009
  mov edi,dword[edit]
1338 IgorA 2010
 
2011
  call GetPos
2012
  push edx
2013
    call ItNextColorTag
2014
    mov eax,edx
2015
  pop edx
2016
  call ItPervColorTag
2017
 
1456 IgorA 2018
  cmp eax,ted_tex
1338 IgorA 2019
  jle @f
1456 IgorA 2020
  cmp edx,ted_tex_1
1338 IgorA 2021
  jle @f
1456 IgorA 2022
    stdcall FindHelpId,eax
1338 IgorA 2023
  @@:
1456 IgorA 2024
  ;stdcall draw_main_cursor,edi
2025
  stdcall draw_help_f1
2026
  pop edi edx eax
1338 IgorA 2027
  ret
1456 IgorA 2028
endp
1338 IgorA 2029
 
2030
;input:
2031
; edx = position begin 'symbol' struct
1456 IgorA 2032
; edi = pointer to tedit struct
2033
; end_pos = position end 'symbol' struct
2034
align 4
2035
proc FindHelpId, end_pos:dword
1338 IgorA 2036
; ecx = word_n
2037
; ebx = l_pos
1456 IgorA 2038
  mov ted_help_id,-1
1338 IgorA 2039
 
2040
  push ebx ecx
2041
    xor ebx,ebx
2042
    mov bl,byte[edx]
2043
    shl bx,2 ;ebx*=4
2044
    add ebx,FkPos
2045
    mov ecx,dword[ebx]
2046
    cmp ecx,0
2047
    jl .if_0e ;if( (word_n=FkPos[(unsigned char)tf[0]])>-1 ){
1456 IgorA 2048
      push esi eax
1338 IgorA 2049
      mov ebx,ecx ;l_pos=word_n;
2050
      ColToIndexOffset ecx,esi
2051
      push cx
2052
      mov cl,byte[esi]
2053
      @@:
1456 IgorA 2054
	cmp ebx,ted_key_words_count ;while(l_pos
1338 IgorA 2055
	jge @f
2056
	;ColToIndexOffset ecx,esi
1456 IgorA 2057
	ColToIndexOffset ebx,eax
2058
	cmp cl,byte[eax] ;&& Col[l_pos].Text[0]==Col[word_n].Text[0])
1338 IgorA 2059
	jne @f
2060
	  inc ebx ;l_pos++;
2061
	  jmp @b
2062
      @@:
2063
      pop cx
2064
      call IteratNext ;pos=1;
2065
      mov esi,1
2066
      @@:
2067
	push dx
2068
	push word[edx]
2069
	pop dx
2070
	  .wh_0b:
2071
	    cmp ebx,ecx ;while(l_pos>word_n
2072
	    jle .wh_0e
2073
	    dec ebx
1456 IgorA 2074
	    ColToIndexOffset ebx,eax
1338 IgorA 2075
	    inc ebx
1456 IgorA 2076
	    cmp byte[eax+esi],dl ;&& Col[l_pos-1].Text[pos]!=tf[i])
1338 IgorA 2077
	    je .wh_0e
2078
	      dec ebx ;l_pos--;
2079
	    jmp .wh_0b
2080
	  .wh_0e:
2081
 
2082
	  .wh_1b:
2083
	    cmp ebx,ecx ;while(l_pos>word_n
2084
	    jle .wh_1e
1456 IgorA 2085
	    ColToIndexOffset ecx,eax
2086
	    cmp byte[eax+esi],dl
1338 IgorA 2087
	    je .wh_1e
2088
	      inc ecx ;word_n++;
2089
	    jmp .wh_1b
2090
	  .wh_1e:
2091
	pop dx
2092
 
2093
	cmp ecx,ebx ;if(word_n==l_pos) break;
2094
	je @f
2095
	call IteratNext ;pos++;
1456 IgorA 2096
	cmp edx,dword[end_pos] ;for(...;i
1338 IgorA 2097
	je @f ;jge
2098
	inc esi
2099
	jmp @b
2100
      @@:
1456 IgorA 2101
      pop eax esi
1338 IgorA 2102
 
1456 IgorA 2103
      mov ted_help_id,ecx
2104
      ;return word_n;
1338 IgorA 2105
 
2106
    .if_0e:
2107
  pop ecx ebx
2108
  ret
1456 IgorA 2109
endp
1338 IgorA 2110
 
1390 IgorA 2111
;-----------------------------------------------------------------------------
2112
;функция для выделения памяти
2113
;input:
2114
; ecx = size data
2115
;otput:
2116
; eax = pointer to memory
2117
align 4
2118
mem_Alloc:
2119
  push ebx
2120
  mov eax,68
2121
  mov ebx,12
2122
  int 0x40
2123
  pop ebx
2124
  ret
2125
;-----------------------------------------------------------------------------
2126
;функция для освобождения памяти
2127
;input:
2128
; ecx = pointer to memory
2129
align 4
2130
mem_Free:
2131
  push eax ebx
2132
  cmp ecx,0
2133
  jz @f
2134
    mov eax,68
2135
    mov ebx,13
2136
    int 0x40
2137
  @@:
2138
  pop ebx eax
2139
  ret