Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
258 mikedld 1
;-----------------------------------------------------------------------------
2
func check_cur_vis_inv ;//////////////////////////////////////////////////////
3
;-----------------------------------------------------------------------------
4
	push	eax ebx
5
	xor	bl,bl
6
  .chk_y:
267 mikedld 7
	mov	eax,[cur_editor.Caret.Y] ;! eax,[pos.y]
258 mikedld 8
	or	eax,eax
9
	jge	@f
267 mikedld 10
	mov	[cur_editor.Caret.Y],0 ;! [pos.y],0
258 mikedld 11
	jmp	.chk_dy
267 mikedld 12
    @@: cmp	eax,[cur_editor.Lines.Count] ;! eax,[lines]
258 mikedld 13
	jl	.chk_dy
267 mikedld 14
	mov	eax,[cur_editor.Lines.Count] ;! eax,[lines]
258 mikedld 15
	dec	eax
267 mikedld 16
	mov	[cur_editor.Caret.Y],eax ;! [pos.y],eax
258 mikedld 17
  .chk_dy:
267 mikedld 18
	mov	eax,[cur_editor.TopLeft.Y] ;! eax,[top_line]
19
	cmp	eax,[cur_editor.Caret.Y] ;! eax,[pos.y]
258 mikedld 20
	jle	@f
267 mikedld 21
	m2m	[cur_editor.TopLeft.Y],[cur_editor.Caret.Y]
259 mikedld 22
;!      push    [pos.y]
23
;!      pop     [top_line]
258 mikedld 24
	inc	bl
25
    @@: add	eax,[lines.scr]
267 mikedld 26
	cmp	eax,[cur_editor.Caret.Y] ;! eax,[pos.y]
258 mikedld 27
	jg	.chk_x
267 mikedld 28
	mov	eax,[cur_editor.Caret.Y] ;! eax,[pos.y]
258 mikedld 29
	sub	eax,[lines.scr]
30
	inc	eax
267 mikedld 31
	mov	[cur_editor.TopLeft.Y],eax ;! [top_line],eax
258 mikedld 32
	inc	bl
33
  .chk_x:
267 mikedld 34
	mov	eax,[cur_editor.Caret.X] ;! eax,[pos.x]
258 mikedld 35
	or	eax,eax
36
	jge	@f
267 mikedld 37
	mov	[cur_editor.Caret.X],0 ;! [pos.x],0
258 mikedld 38
	jmp	.chk_dx
267 mikedld 39
    @@: cmp	eax,[cur_editor.Columns.Count] ;! eax,[columns]
258 mikedld 40
	jl	.chk_dx
267 mikedld 41
	mov	eax,[cur_editor.Columns.Count] ;! eax,[columns]
42
	mov	[cur_editor.Caret.X],eax ;! [pos.x],eax
258 mikedld 43
  .chk_dx:
267 mikedld 44
	mov	eax,[cur_editor.TopLeft.X] ;! eax,[left_col]
45
	cmp	eax,[cur_editor.Caret.X] ;! eax,[pos.x]
258 mikedld 46
	jle	@f
267 mikedld 47
	m2m	[cur_editor.TopLeft.X],[cur_editor.Caret.X]
259 mikedld 48
;!      push    [pos.x]
49
;!      pop     [left_col]
258 mikedld 50
	inc	bl
51
    @@: add	eax,[columns.scr]
267 mikedld 52
	cmp	eax,[cur_editor.Caret.X] ;! eax,[pos.x]
258 mikedld 53
	jg	@f
267 mikedld 54
	mov	eax,[cur_editor.Caret.X] ;! eax,[pos.x]
258 mikedld 55
	sub	eax,[columns.scr]
56
	inc	eax
267 mikedld 57
	mov	[cur_editor.TopLeft.X],eax ;! [left_col],eax
258 mikedld 58
	inc	bl
59
    @@: cmp	[mev],MEV_LDOWN
60
	jne	.exit
267 mikedld 61
	push	[cur_editor.Caret.X] [cur_editor.Caret.Y] ;! [pos.x] [pos.y]
62
	pop	[cur_editor.SelStart.Y] [cur_editor.SelStart.X] ;! [sel.y] [sel.x]
258 mikedld 63
  .exit:
64
	or	bl,bl
65
	clc
66
	jz	@f
67
	call	draw_file
68
	stc
69
    @@: pop	ebx eax
70
	ret
71
endf
72
 
73
;-----------------------------------------------------------------------------
74
func clear_selection ;////////////////////////////////////////////////////////
75
;-----------------------------------------------------------------------------
76
	push	eax ebx
267 mikedld 77
	mov	eax,[cur_editor.SelStart.Y] ;! eax,[sel.y]
78
	mov	ebx,[cur_editor.Caret.Y] ;! ebx,[pos.y]
258 mikedld 79
	cmp	eax,ebx
80
	jle	@f
81
	xchg	eax,ebx
267 mikedld 82
    @@: push	[cur_editor.Caret.X] [cur_editor.Caret.Y] ;! [pos.x] [pos.y]
83
	pop	[cur_editor.SelStart.Y] [cur_editor.SelStart.X] ;! [sel.y] [sel.x]
258 mikedld 84
	call	draw_file.ex
85
	pop	ebx eax
86
	ret
87
endf
88
 
89
;-----------------------------------------------------------------------------
90
func pt_in_rect ;/////////////////////////////////////////////////////////////
91
;-----------------------------------------------------------------------------
92
	cmp	eax,[ecx+0x0]
93
	jl	@f
94
	cmp	ebx,[ecx+0x4]
95
	jl	@f
96
	cmp	eax,[ecx+0x8]
97
	jg	@f
98
	cmp	ebx,[ecx+0xC]
99
	jg	@f
100
	stc
101
	ret
102
    @@: clc
103
	ret
104
endf
105
 
106
;-----------------------------------------------------------------------------
107
func check_bottom_right ;/////////////////////////////////////////////////////
108
;-----------------------------------------------------------------------------
109
	push	eax
267 mikedld 110
	mov	eax,[cur_editor.TopLeft.Y] ;! eax,[top_line]
258 mikedld 111
	add	eax,[lines.scr]
267 mikedld 112
	cmp	eax,[cur_editor.Lines.Count] ;! eax,[lines]
258 mikedld 113
	jbe	.lp1
267 mikedld 114
	mov	eax,[cur_editor.Lines.Count] ;! eax,[lines]
258 mikedld 115
	sub	eax,[lines.scr]
116
	jns	@f
117
	xor	eax,eax
267 mikedld 118
    @@: mov	[cur_editor.TopLeft.Y],eax ;! [top_line],eax
119
  .lp1: mov	eax,[cur_editor.TopLeft.X] ;! eax,[left_col]
258 mikedld 120
	add	eax,[columns.scr]
267 mikedld 121
	cmp	eax,[cur_editor.Columns.Count] ;! eax,[columns]
258 mikedld 122
	jbe	.exit
267 mikedld 123
	mov	eax,[cur_editor.Columns.Count] ;! eax,[columns]
258 mikedld 124
	sub	eax,[columns.scr]
125
	jns	@f
126
	xor	eax,eax
267 mikedld 127
    @@: mov	[cur_editor.TopLeft.X],eax ;! [left_col],eax
258 mikedld 128
  .exit:
129
	pop	eax
130
	ret
131
endf
132
 
133
;-----------------------------------------------------------------------------
134
func check_inv_str ;//////////////////////////////////////////////////////////
135
;-----------------------------------------------------------------------------
136
@^
137
	mov	eax,[pos.y]
138
	mov	ecx,[top_line]
139
  .skip_init:
140
	call	check_cur_vis
141
	mov	[pos.y],eax
142
	mov	[top_line],ecx
143
  .skip_check:
144
;       call    invalidate_string
145
	call	drawfile
146
	ret
147
^@
148
endf
149
 
150
;-----------------------------------------------------------------------------
151
func check_inv_all ;//////////////////////////////////////////////////////////
152
;-----------------------------------------------------------------------------
267 mikedld 153
	mov	eax,[cur_editor.Caret.Y] ;! eax,[pos.y]
154
	mov	ecx,[cur_editor.TopLeft.Y] ;! ecx,[top_line]
258 mikedld 155
  .skip_init:
156
	call	check_cur_vis
267 mikedld 157
	mov	[cur_editor.Caret.Y],eax ;! [pos.y],eax
158
	mov	[cur_editor.TopLeft.Y],ecx ;! [top_line],ecx
258 mikedld 159
  .skip_check:
160
;       call    clear_screen
161
	call	draw_file
162
	ret
163
endf
164
 
165
;-----------------------------------------------------------------------------
166
func check_cur_vis ;//////////////////////////////////////////////////////////
167
;-----------------------------------------------------------------------------
168
	cmp	eax,ecx
169
	jb	.low
170
	mov	edx,ecx
171
	add	edx,[lines.scr]
267 mikedld 172
	cmp	edx,[cur_editor.Lines.Count] ;! edx,[lines]
258 mikedld 173
	jbe	@f
267 mikedld 174
	mov	edx,[cur_editor.Lines.Count] ;! edx,[lines]
258 mikedld 175
    @@: cmp	eax,edx
176
	jb	@f
177
	lea	ecx,[eax+1]
178
	sub	ecx,[lines.scr]
179
	jns	@f
180
	xor	ecx,ecx
181
	jmp	@f
182
  .low: mov	ecx,eax
183
    @@: mov	edx,ecx
184
	add	edx,[lines.scr]
267 mikedld 185
	cmp	edx,[cur_editor.Lines.Count] ;! edx,[lines]
258 mikedld 186
	jbe	@f
267 mikedld 187
	mov	ecx,[cur_editor.Lines.Count] ;! ecx,[lines]
258 mikedld 188
	sub	ecx,[lines.scr]
189
	jns	@f
190
	xor	ecx,ecx
191
    @@:;mov     [top_line],ecx
192
 
193
	pushad
267 mikedld 194
	mov	eax,[cur_editor.Caret.X] ;! eax,[pos.x]
195
	mov	ebx,[cur_editor.TopLeft.X] ;! ebx,[left_col]
258 mikedld 196
	mov	ecx,ebx
197
	add	ecx,[columns.scr]
198
	cmp	eax,ebx
199
	jb	.lp1
200
	cmp	eax,ecx
201
	jb	.exit
202
	lea	ebx,[eax]
203
	sub	ebx,[columns.scr]
204
	jmp	@f
205
  .lp1: mov	ebx,eax
267 mikedld 206
    @@: mov	[cur_editor.TopLeft.X],ebx ;! [left_col],ebx
258 mikedld 207
 
208
  .exit:
267 mikedld 209
	mov	[cur_editor.Caret.X],eax ;! [pos.x],eax
258 mikedld 210
	popad
211
 
212
	ret
213
endf
214
 
215
;-----------------------------------------------------------------------------
216
func get_real_length ;////////////////////////////////////////////////////////
217
;-----------------------------------------------------------------------------
218
	movzx	eax,word[esi]
219
    @@: cmp	byte[esi+eax+4-1],' '
220
	jne	@f
221
	dec	eax
222
	jnz	@b
223
    @@: ret
224
endf
225
 
226
;-----------------------------------------------------------------------------
227
func get_line_offset ;////////////////////////////////////////////////////////
228
;-----------------------------------------------------------------------------
229
; Input:
230
;  ECX = line number
231
; Output:
232
;  ESI = line data offset
233
;-----------------------------------------------------------------------------
234
	push	eax ecx
267 mikedld 235
	mov	esi,[cur_editor.Lines] ;! AREA_EDIT
259 mikedld 236
    @@: dec	ecx
237
	js	.exit
238
	movzx	eax,word[esi]
258 mikedld 239
	lea	esi,[esi+eax+4]
259 mikedld 240
	jmp	@b
258 mikedld 241
  .exit:
242
	pop	ecx eax
243
	ret
244
endf
245
 
246
;-----------------------------------------------------------------------------
247
func init_sel_vars ;//////////////////////////////////////////////////////////
248
;-----------------------------------------------------------------------------
249
	pushad
250
	mov	[sel.selected],1
267 mikedld 251
	mov	eax,[cur_editor.SelStart.X] ;! eax,[sel.x]
252
	mov	ebx,[cur_editor.SelStart.Y] ;! ebx,[sel.y]
253
	mov	ecx,[cur_editor.Caret.X] ;! ecx,[pos.x]
254
	mov	edx,[cur_editor.Caret.Y] ;! edx,[pos.y]
258 mikedld 255
	cmp	ebx,edx
256
	jl	.lp2
257
	jne	@f
258
	cmp	eax,ecx
259
	jl	.lp2
260
	jne	.lp1
261
	dec	[sel.selected]
262
	jmp	.lp2
263
    @@: xchg	ebx,edx
264
  .lp1: xchg	eax,ecx
265
  .lp2: mov	[sel.begin.x],eax
266
	mov	[sel.begin.y],ebx
267
	mov	[sel.end.x],ecx
268
	mov	[sel.end.y],edx
269
	popad
270
	ret
271
endf
272
 
273
;-----------------------------------------------------------------------------
274
func get_scroll_vars ;////////////////////////////////////////////////////////
275
;-----------------------------------------------------------------------------
276
; Input:
277
;  EAX = maximum data size      (units)
278
;  EBX = visible data size      (units)
279
;  ECX = current data position  (units)
280
;  EDX = scrolling area size    (pixels)
281
; Output:
282
;  EAX = srcoller offset        (pixels)
283
;  EBX = scroller size          (pixels)
284
;-----------------------------------------------------------------------------
285
	push	eax ebx edx
286
;       sub     eax,ebx
287
	mov	esi,eax
288
	mov	eax,edx
289
	imul	ebx
290
	idiv	esi
291
	cmp	eax,[esp]
292
	jge	.null
293
	cmp	eax,AMINS
294
	jge	@f
295
	neg	eax
296
	add	eax,AMINS
297
	sub	[esp],eax
298
	mov	eax,AMINS
299
    @@: mov	[esp+4],eax	; scroller size
300
	mov	eax,[esp]
301
	imul	ecx
302
	idiv	esi
303
	or	eax,eax
304
	jns	@f
305
	xor	eax,eax
306
   @@:	mov	[esp+8],eax    ; scroller offset
307
	add	eax,[esp+4]
308
	cmp	eax,[esp]
309
	jle	@f
310
;        mov     eax,[esp]
311
;        sub     eax,[esp+4]
312
;        js      @f
313
;        mov     [esp+8],eax
314
    @@:
315
	pop	edx ebx eax
316
	ret
317
  .null:
318
	mov	dword[esp+4],0
319
	mov	dword[esp+8],0
320
	jmp	@b
321
endf
322
 
323
;-----------------------------------------------------------------------------
324
func uint2strz ;//////////////////////////////////////////////////////////////
325
;-----------------------------------------------------------------------------
326
	dec	ebx
327
	jz	@f
328
	xor	edx,edx
329
	div	ecx
330
	push	edx
331
	call	uint2strz
332
	pop	eax
333
    @@: cmp	al,10
334
	sbb	al,$69
335
	das
336
	stosb
337
	ret
338
endf
339
 
340
;-----------------------------------------------------------------------------
341
func uint2str ;///////////////////////////////////////////////////////////////
342
;-----------------------------------------------------------------------------
343
	cmp	eax,ecx
344
	jb	@f
345
	xor	edx,edx
346
	div	ecx
347
	push	edx
348
	call	uint2str
349
	pop	eax
350
    @@: cmp	al,10
351
	sbb	al,$69
352
	das
353
	stosb
354
	ret
355
endf
356
 
357
;-----------------------------------------------------------------------------
259 mikedld 358
func strlen ;/////////////////////////////////////////////////////////////////
359
;-----------------------------------------------------------------------------
360
	push	ebx
361
	mov	ebx,eax
362
	xor	eax,eax
363
    @@: cmp	byte[ebx+eax],0
364
	je	@f
365
	inc	eax
366
	jmp	@b
367
    @@: pop	ebx
368
	ret
369
endf
370
 
371
;-----------------------------------------------------------------------------
258 mikedld 372
func rgb_to_gray ;////////////////////////////////////////////////////////////
373
;-----------------------------------------------------------------------------
374
	push	0 eax
375
	and	dword[esp],0x000000FF
376
	fild	dword[esp]
377
	fmul	[float_gray_b]
378
	shr	eax,8
379
	mov	[esp],eax
380
	and	dword[esp],0x000000FF
381
	fild	dword[esp]
382
	fmul	[float_gray_g]
383
	faddp
384
	shr	eax,8
385
	and	eax,0x000000FF
386
	mov	[esp],eax
387
	fild	dword[esp]
388
	fmul	[float_gray_r]
389
	faddp
390
	frndint
391
	fist	dword[esp]
392
	fist	dword[esp+1]
393
	fistp	dword[esp+2]
394
	pop	eax
395
	add	esp,4
396
	ret
397
endf
398
 
399
;float_gray_r dd 0.30f
400
;float_gray_g dd 0.59f
401
;float_gray_b dd 0.11f
402
 
403
;-----------------------------------------------------------------------------
404
func get_active_menu_item ;///////////////////////////////////////////////////
405
;-----------------------------------------------------------------------------
406
	pushad
407
	mov	[mi_cur],0
408
	mcall	37,1
409
	movsx	ebx,ax
410
	sar	eax,16
411
	mov	ecx,__rc
412
	pushd	2 0 (main_menu.width+7) (ATOPH-2)
413
	popd	[__rc+0xC] [__rc+0x8] [__rc+0x4] [__rc+0x0]
414
;       add     [__rc+0xC],ATOPH-2
415
	call	pt_in_rect
416
	jnc	.outside_menu
417
	m2m	dword[ecx+0x8],dword[ecx+0x0]
418
	mov	edx,main_menu
419
    @@: inc	[mi_cur]
420
	movzx	esi,word[edx+0]
421
	add	[ecx+0x8],esi
422
	call	pt_in_rect
423
	jc	.exit
424
	m2m	dword[ecx+0x0],dword[ecx+0x8]
425
	add	edx,8+1
426
	movzx	esi,byte[edx-1]
427
	add	edx,esi
428
	cmp	byte[edx+8],0
429
	jne	@b
430
	mov	[mi_cur],0
431
  .exit:
432
	popad
433
	ret
434
  .outside_menu:
435
	or	[mi_cur],-1
436
    @@: popad
437
	ret
438
endf
439
 
440
;-----------------------------------------------------------------------------
441
func get_active_popup_item ;//////////////////////////////////////////////////
442
;-----------------------------------------------------------------------------
443
	pushad
444
	mov	[pi_cur],0
445
	mcall	37,1
446
	movsx	ebx,ax
447
	sar	eax,16
448
	mov	ecx,__rc
449
	mov	dword[ecx+0x0],0
450
	mov	dword[ecx+0x4],0
451
	movzx	edx,[ebp+POPUP.width]
452
	mov	dword[ecx+0x8],edx;POP_WIDTH
453
	movzx	edx,[ebp+POPUP.height]
454
	mov	dword[ecx+0xC],edx;POP_HEIGHT
455
	call	pt_in_rect
456
	jnc	.outside_window
457
	inc	dword[ecx+0x0]
458
	mov	dword[ecx+0x4],3
459
	dec	dword[ecx+0x8]
460
	mov	dword[ecx+0xC],3+POP_IHEIGHT-1
461
	mov	edx,[ebp+POPUP.data];popup_text.data
462
    @@: inc	[pi_cur]
463
	inc	edx
464
	movzx	esi,byte[edx-1]
465
	cmp	byte[edx],'-'
466
	jne	.lp1
467
	pushd	[ecx+0xC]
468
	sub	dword[ecx+0xC],POP_IHEIGHT-4
469
	call	pt_in_rect
470
	popd	[ecx+0xC]
471
	jc	.separator
472
	add	dword[ecx+0x4],4
473
	add	dword[ecx+0xC],4
474
	jmp	.lp3
475
  .lp1: call	pt_in_rect
476
	jnc	.lp2
477
	mov	eax,[pi_cur]
478
	test	byte[ebp+eax-1],1;byte[popup_text+eax-1],1
479
	jnz	.exit
480
	jmp	.separator
481
  .lp2: add	dword[ecx+0x4],POP_IHEIGHT
482
	add	dword[ecx+0xC],POP_IHEIGHT
483
	add	edx,esi
484
	inc	edx
485
	movzx	esi,byte[edx-1]
486
  .lp3: add	edx,esi
487
	cmp	byte[edx],0
488
	jne	@b
489
  .separator:
490
	mov	[pi_cur],0
491
  .exit:
492
	popad
493
	ret
494
  .outside_window:
495
	or	[pi_cur],-1
496
	jmp	.exit
497
endf
498
 
499
;-----------------------------------------------------------------------------
500
func line_add_spaces ;////////////////////////////////////////////////////////
501
;-----------------------------------------------------------------------------
502
; esi = line offset
503
; ecx = needed line length
504
;-----------------------------------------------------------------------------
505
	pushad
506
	movzx	edx,word[esi]
507
	cmp	ecx,edx
508
	jbe	.exit
509
	sub	ecx,edx
510
	push	ecx
267 mikedld 511
	mov	edi,[cur_editor.Lines] ;! AREA_TEMP2
259 mikedld 512
	add	edi,[edi-4]
513
	dec	edi
258 mikedld 514
	mov	eax,esi
515
	mov	esi,edi
516
	sub	esi,ecx
517
	lea	ecx,[eax+4]
518
	add	ecx,edx;[eax]
519
	push	ecx
520
	neg	ecx
521
	lea	ecx,[esi+ecx+1]
522
	std
259 mikedld 523
diff16 '32DC',0,$
258 mikedld 524
	rep	movsb
525
	pop	edi ecx
526
	add	[eax],cx
527
	mov	al,' '
528
	cld
529
	rep	stosb
530
  .exit:
531
	popad
532
	ret
533
endf
534
 
535
;-----------------------------------------------------------------------------
536
func delete_selection ;///////////////////////////////////////////////////////
537
;-----------------------------------------------------------------------------
259 mikedld 538
;       call    init_sel_vars
539
 
258 mikedld 540
	cmp	[sel.selected],0
541
	je	.exit.2
542
 
543
	pushad
544
	mov	ecx,[sel.begin.y]
545
	cmp	ecx,[sel.end.y]
546
	je	.single_line
547
	call	get_line_offset
548
	and	dword[esi],not 0x00020000
549
	or	dword[esi],0x00010000
550
	mov	ecx,[sel.begin.x]
551
	call	line_add_spaces
552
	lea	edi,[esi+4]
553
	mov	ecx,[sel.end.y]
554
	call	get_line_offset
555
	call	get_real_length
556
	cmp	eax,[sel.end.x]
557
	jbe	@f
558
	mov	eax,[sel.end.x]
559
    @@: movzx	ecx,word[esi]
560
	sub	ecx,eax
561
	mov	ebx,[sel.begin.x]
562
	add	ebx,ecx
563
	mov	[edi-4],bx
564
	add	edi,[sel.begin.x]
565
	lea	esi,[esi+eax+4]
267 mikedld 566
	mov	ecx,[cur_editor.Lines] ;! AREA_TEMP2
259 mikedld 567
	add	ecx,[ecx-4]
258 mikedld 568
	sub	ecx,esi
569
	cld
570
	rep	movsb
571
	mov	eax,[sel.end.y]
572
	sub	eax,[sel.begin.y]
267 mikedld 573
	sub	[cur_editor.Lines.Count],eax ;! [lines],eax
258 mikedld 574
	jmp	.exit
575
 
576
  .single_line:
577
	call	get_line_offset
578
	and	dword[esi],not 0x00020000
579
	or	dword[esi],0x00010000
580
	call	get_real_length
581
	cmp	eax,[sel.begin.x]
582
	jbe	.exit
583
	mov	ecx,[sel.end.x]
584
	cmp	ecx,eax
585
	jbe	@f
586
	mov	ecx,eax
587
    @@: sub	ecx,[sel.begin.x]
588
	sub	[esi],cx
589
	lea	edi,[esi+4]
590
	add	edi,[sel.begin.x]
591
	lea	esi,[edi+ecx]
267 mikedld 592
	mov	ecx,[cur_editor.Lines] ;! AREA_TEMP2
259 mikedld 593
	add	ecx,[ecx-4]
258 mikedld 594
	sub	ecx,esi
595
	cld
596
	rep	movsb
597
 
598
  .exit:
599
	mov	eax,[sel.begin.x]
267 mikedld 600
	mov	[cur_editor.Caret.X],eax ;! [pos.x],eax
601
	mov	[cur_editor.SelStart.X],eax ;! [sel.x],eax
258 mikedld 602
	mov	eax,[sel.begin.y]
267 mikedld 603
	mov	[cur_editor.Caret.Y],eax ;! [pos.y],eax
604
	mov	[cur_editor.SelStart.Y],eax ;! [sel.y],eax
258 mikedld 605
	popad
267 mikedld 606
	mov	[cur_editor.Modified],1 ;! [modified],1
258 mikedld 607
	clc
608
	ret
609
 
610
  .exit.2:
611
	stc
612
	ret
613
endf
259 mikedld 614
 
615
;-----------------------------------------------------------------------------
616
func get_selection_size ;/////////////////////////////////////////////////////
617
;-----------------------------------------------------------------------------
618
	push	ecx esi
619
	mov	ecx,[sel.end.y]
620
	inc	ecx
621
	call	get_line_offset
622
	mov	eax,esi
623
	mov	ecx,[sel.begin.y]
624
	call	get_line_offset
625
	sub	eax,esi
626
	pop	esi ecx
627
	ret
628
endf
629
 
630
;-----------------------------------------------------------------------------
631
func get_lines_in_file ;//////////////////////////////////////////////////////
632
;-----------------------------------------------------------------------------
633
; ESI = data pointer
634
; ECX = data length
635
;-----------------------------------------------------------------------------
636
	push	ebx ecx esi
637
	or	ebx,-1
638
  .lp0: inc	ebx
639
  .lp1: dec	ecx
640
	jle	.lp2
641
	lodsb
642
	cmp	al,10
643
	je	.LF
644
	cmp	al,13
645
	je	.CR
646
	jmp	.lp1
647
  .lp2: mov	eax,ebx
648
	pop	esi ecx ebx
649
	ret
650
 
651
   .CR: cmp	byte[esi],10
652
	jne	.lp0
653
	lodsb
654
   .LF: jmp	.lp0
655
endf
656
 
657
;-----------------------------------------------------------------------------
658
func mem.Alloc ;//////////////////////////////////////////////////////////////
659
;-----------------------------------------------------------------------------
660
	push	ebx ecx
661
	lea	ecx,[eax+4+4095]
662
	and	ecx,not 4095
663
	mcall	68,12
664
	add	ecx,-4
665
	mov	[eax],ecx
666
	add	eax,4
667
	pop	ecx ebx
668
	ret
669
endf
670
 
671
;-----------------------------------------------------------------------------
672
func mem.ReAlloc ;////////////////////////////////////////////////////////////
673
;-----------------------------------------------------------------------------
674
	push	ebx ecx esi edi eax
675
	or	eax,eax
676
	jz	@f
677
	lea	ecx,[ebx+4+4095]
678
	and	ecx,not 4095
679
	add	ecx,-4
680
	cmp	ecx,[eax-4]
681
	je	.exit
682
    @@: mov	eax,ebx
683
	call	mem.Alloc
684
	xchg	eax,[esp]
685
	or	eax,eax
686
	jz	.exit
687
	mov	esi,eax
688
	xchg	eax,[esp]
689
	mov	edi,eax
690
	mov	ecx,[esi-4]
691
	cmp	ecx,[edi-4]
692
	jbe	@f
693
	mov	ecx,[edi-4]
694
    @@: add	ecx,3
695
	shr	ecx,2
696
	cld
697
	rep	movsd
698
	xchg	eax,[esp]
699
	call	mem.Free
700
  .exit:
701
	pop	eax edi esi ecx ebx
702
	ret
703
endf
704
 
705
;-----------------------------------------------------------------------------
706
func mem.Free ;///////////////////////////////////////////////////////////////
707
;-----------------------------------------------------------------------------
708
	push	ebx ecx
709
	lea	ecx,[eax-4]
710
	mcall	68,13
711
	pop	ecx ebx
712
	ret
713
endf