apps/tinypad: fix select all delete crash (fix #173) #700
No files matched your search
@@ -1,6 +1,10 @@
|
||||
|
||||
HISTORY:
|
||||
|
||||
4.1.1 (18/09/2026, Leency)
|
||||
bug-fixes:
|
||||
- fixed crash on deleting the whole text (Ctrl+A, Del)
|
||||
|
||||
4.1 (17/07/2015, Pathoswithin)
|
||||
- various fixes
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
; project name: TINYPAD
|
||||
; compiler: flat assembler 1.67.21
|
||||
; memory to compile: 3.0/9.0 MBytes (without/with size optimizations)
|
||||
; version: SVN (4.1)
|
||||
; last update: 2015-07-17 (Jul 17, 2015)
|
||||
; version: SVN (4.1.1)
|
||||
; last update: 2026-09-18 (Sep 18, 2026)
|
||||
; minimal kernel: revision #4199 (https://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/kernel/trunk)
|
||||
;-----------------------------------------------------------------------------
|
||||
; originally by: Ville Michael Turjanmaa >> villemt@aton.co.jyu.fi
|
||||
@@ -40,7 +40,7 @@ include 'tinypad.inc'
|
||||
|
||||
__header '01',1,@CODE,TINYPAD_END,STATIC_MEM_END,MAIN_STACK,@PARAMS,ini_path
|
||||
|
||||
APP_VERSION equ '4.1'
|
||||
APP_VERSION equ '4.1.1'
|
||||
|
||||
TRUE = 1
|
||||
FALSE = 0
|
||||
|
||||
@@ -355,7 +355,7 @@ proc line_add_spaces ;////////////////////////////////////////////////////////
|
||||
; ESI = line offset
|
||||
; ECX = needed line length
|
||||
; Output:
|
||||
; EAX = delta
|
||||
; EAX = delta, CF = 1 on failure
|
||||
;-----------------------------------------------------------------------------
|
||||
xor eax,eax
|
||||
pushad
|
||||
@@ -365,6 +365,7 @@ proc line_add_spaces ;////////////////////////////////////////////////////////
|
||||
sub ecx,edx
|
||||
lea eax,[ecx+sizeof.EDITOR_LINE_DATA]
|
||||
call editor_realloc_lines
|
||||
jc .failed
|
||||
mov [esp+4*7],eax
|
||||
add esi,eax
|
||||
push ecx
|
||||
@@ -388,6 +389,26 @@ proc line_add_spaces ;////////////////////////////////////////////////////////
|
||||
rep stosb
|
||||
.exit:
|
||||
popad
|
||||
clc
|
||||
ret
|
||||
.failed:
|
||||
popad
|
||||
stc
|
||||
ret
|
||||
endp
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
proc set_lines_terminator ;///////////////////////////////////////////////////
|
||||
;-----------------------------------------------------------------------------
|
||||
; Lines buffer is terminated by a line header with zero Size, restore it after
|
||||
; the data has been compacted (line count decreased)
|
||||
;-----------------------------------------------------------------------------
|
||||
push ecx esi
|
||||
mov ecx,[cur_editor.Lines.Count]
|
||||
call get_line_offset
|
||||
mov [esi+EDITOR_LINE_DATA.Size],0
|
||||
mov [esi+EDITOR_LINE_DATA.Flags],0
|
||||
pop esi ecx
|
||||
ret
|
||||
endp
|
||||
|
||||
@@ -408,6 +429,7 @@ proc delete_selection ;///////////////////////////////////////////////////////
|
||||
or [esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
|
||||
mov ecx,[sel.begin.x]
|
||||
call line_add_spaces
|
||||
jc .abort
|
||||
add esi,eax
|
||||
lea edi,[esi+sizeof.EDITOR_LINE_DATA]
|
||||
mov ecx,[sel.end.y]
|
||||
@@ -456,6 +478,8 @@ proc delete_selection ;///////////////////////////////////////////////////////
|
||||
rep movsb
|
||||
|
||||
.exit:
|
||||
call set_lines_terminator
|
||||
|
||||
mov eax,[sel.begin.x]
|
||||
mov [cur_editor.Caret.X],eax
|
||||
mov [cur_editor.SelStart.X],eax
|
||||
@@ -478,6 +502,11 @@ proc delete_selection ;///////////////////////////////////////////////////////
|
||||
clc
|
||||
ret
|
||||
|
||||
.abort:
|
||||
popad
|
||||
clc
|
||||
ret
|
||||
|
||||
.exit.2:
|
||||
stc
|
||||
ret
|
||||
|
||||
@@ -993,17 +993,30 @@ endp
|
||||
proc editor_realloc_lines ;///// ADD $DELTA$ TO LINES SIZE ///////////////////
|
||||
;-----------------------------------------------------------------------------
|
||||
; EAX = delta
|
||||
; Output:
|
||||
; EAX = buffer displacement, CF = 1 on failure (buffer left untouched)
|
||||
;-----------------------------------------------------------------------------
|
||||
push ebx ecx
|
||||
mov ebx,[cur_editor.Lines.Size]
|
||||
push ebx
|
||||
add ebx,eax
|
||||
mov eax,[cur_editor.Lines]
|
||||
mov [cur_editor.Lines.Size],ebx
|
||||
mov ecx,eax
|
||||
stdcall mem.ReAlloc,eax,ebx
|
||||
test eax,eax
|
||||
jz .failed
|
||||
add esp,4
|
||||
mov [cur_editor.Lines],eax
|
||||
sub eax,ecx
|
||||
pop ecx ebx
|
||||
clc
|
||||
ret
|
||||
.failed:
|
||||
pop [cur_editor.Lines.Size]
|
||||
xor eax,eax
|
||||
pop ecx ebx
|
||||
stc
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
@@ -237,6 +237,7 @@ proc load_from_memory ;///////////////////////////////////////////////////////
|
||||
lea edx,[ebx+ecx]
|
||||
imul ebx,eax,16
|
||||
add ebx,edx
|
||||
add ebx,sizeof.EDITOR_LINE_DATA
|
||||
mov [ebp+EDITOR.Lines.Size],ebx
|
||||
stdcall mem.ReAlloc,[ebp+EDITOR.Lines],ebx
|
||||
mov [ebp+EDITOR.Lines],eax
|
||||
|
||||
@@ -591,10 +591,12 @@ proc key.ctrl_v ;///// PASTE ///////////////////////////////////
|
||||
mov eax,[copy_size]
|
||||
sub eax,sizeof.EDITOR_LINE_DATA
|
||||
call editor_realloc_lines
|
||||
jc .exit_1
|
||||
mov ecx,[cur_editor.Caret.Y]
|
||||
call get_line_offset
|
||||
mov ecx,[cur_editor.Caret.X]
|
||||
call line_add_spaces
|
||||
jc .exit_1
|
||||
pushd [esi+EDITOR_LINE_DATA.Size]
|
||||
push esi
|
||||
lea eax,[esi+ecx+sizeof.EDITOR_LINE_DATA]
|
||||
@@ -692,6 +694,7 @@ proc key.ctrl_d ;///// INSERT SEPARATOR ////////////////////////
|
||||
;---------------------------------------------------------------
|
||||
mov eax,90+sizeof.EDITOR_LINE_DATA
|
||||
call editor_realloc_lines
|
||||
jc .exit
|
||||
|
||||
mov ecx,[cur_editor.Caret.Y]
|
||||
call get_line_offset
|
||||
@@ -748,6 +751,7 @@ proc key.ctrl_y ;///// DELETE CURRENT LINE /////////////////////
|
||||
shr ecx,2
|
||||
cld
|
||||
rep movsd
|
||||
call set_lines_terminator
|
||||
|
||||
pop eax
|
||||
add eax,sizeof.EDITOR_LINE_DATA
|
||||
@@ -1151,6 +1155,7 @@ proc key.del ;///// DELETE NEXT CHAR OR SELECTION //////////////
|
||||
|
||||
.ok.dec.lines:
|
||||
dec [cur_editor.Lines.Count]
|
||||
call set_lines_terminator
|
||||
mov eax,[cur_editor.Lines.Count]
|
||||
cmp [cur_editor.Caret.Y],eax
|
||||
jb @f
|
||||
@@ -1264,6 +1269,7 @@ proc key.tab ;///// TABULATE ///////////////////////////////////
|
||||
push eax
|
||||
call editor_realloc_lines
|
||||
pop eax
|
||||
jc .failed
|
||||
mov ecx,[cur_editor.Caret.Y]
|
||||
call get_line_offset
|
||||
and [esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
|
||||
@@ -1282,6 +1288,7 @@ proc key.tab ;///// TABULATE ///////////////////////////////////
|
||||
push eax
|
||||
mov eax,10
|
||||
call editor_realloc_lines
|
||||
jc .failed.1
|
||||
add esi,eax
|
||||
pop eax
|
||||
pushad
|
||||
@@ -1332,6 +1339,12 @@ proc key.tab ;///// TABULATE ///////////////////////////////////
|
||||
|
||||
.exit:
|
||||
ret
|
||||
|
||||
.failed.1:
|
||||
pop eax
|
||||
.failed:
|
||||
add esp,4*2
|
||||
ret
|
||||
endp
|
||||
|
||||
;---------------------------------------------------------------
|
||||
@@ -1342,6 +1355,7 @@ proc key.return ;///// CARRIAGE RETURN /////////////////////////
|
||||
; so you should do a little more value
|
||||
mov eax,14*100
|
||||
call editor_realloc_lines
|
||||
jc .exit
|
||||
|
||||
mov ecx,[cur_editor.Caret.Y]
|
||||
call get_line_offset
|
||||
|
||||
Reference in new issue
Block a user