diff --git a/programs/develop/tinypad/history.txt b/programs/develop/tinypad/history.txt index 6d7330797..772c33b82 100644 --- a/programs/develop/tinypad/history.txt +++ b/programs/develop/tinypad/history.txt @@ -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 diff --git a/programs/develop/tinypad/tinypad.asm b/programs/develop/tinypad/tinypad.asm index 83bc88c89..7098ad7fb 100644 --- a/programs/develop/tinypad/tinypad.asm +++ b/programs/develop/tinypad/tinypad.asm @@ -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 diff --git a/programs/develop/tinypad/tp-common.asm b/programs/develop/tinypad/tp-common.asm index 86e83f38d..b784c4aef 100644 --- a/programs/develop/tinypad/tp-common.asm +++ b/programs/develop/tinypad/tp-common.asm @@ -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 diff --git a/programs/develop/tinypad/tp-editor.asm b/programs/develop/tinypad/tp-editor.asm index c94c0de06..31311c577 100644 --- a/programs/develop/tinypad/tp-editor.asm +++ b/programs/develop/tinypad/tp-editor.asm @@ -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 diff --git a/programs/develop/tinypad/tp-files.asm b/programs/develop/tinypad/tp-files.asm index 06f6769a2..0786b2351 100644 --- a/programs/develop/tinypad/tp-files.asm +++ b/programs/develop/tinypad/tp-files.asm @@ -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 diff --git a/programs/develop/tinypad/tp-key.asm b/programs/develop/tinypad/tp-key.asm index 2c9d18038..020e11cdd 100644 --- a/programs/develop/tinypad/tp-key.asm +++ b/programs/develop/tinypad/tp-key.asm @@ -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