diff --git a/programs/develop/tinypad/trunk/tp-files.asm b/programs/develop/tinypad/trunk/tp-files.asm new file mode 100644 index 0000000000..06f6769a21 --- /dev/null +++ b/programs/develop/tinypad/trunk/tp-files.asm @@ -0,0 +1,355 @@ +diff16 'tp-files.asm',0,$ + +;----------------------------------------------------------------------------- +proc save_file ;////////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + mov esi,tb_opensave.text + mov edi,f_info.path + movzx ecx,[tb_opensave.length] + mov [f_info.length],ecx + cld + rep movsb + mov byte[edi],0 + + mov esi,[cur_editor.Lines] + + xor ebx,ebx + mov ecx,[cur_editor.Lines.Count] + @@: call get_real_length + add ebx,eax + mov eax,[esi+EDITOR_LINE_DATA.Size] + lea esi,[esi+eax+sizeof.EDITOR_LINE_DATA] + loop @b + mov eax,[cur_editor.Lines.Count] + shl eax,1 + lea eax,[eax+ebx+1024] + stdcall mem.Alloc,eax + push eax + mov esi,[cur_editor.Lines] + mov edi,eax + + .new_string: + call save_string + cmp dword[esi+EDITOR_LINE_DATA.Size],0 + jne .new_string + pop eax + sub edi,eax + add edi,-2 ; minus last CRLF + + .systree_save: + mov [f_info70+0],2 + mov [f_info70+12],edi + mov [f_info70+16],eax + mov byte[f_info70+20],0 + mov [f_info70+21],f_info.path + mcall 70,f_info70 + + call set_status_fs_error + + or eax,eax + jnz .exit.2 + + .exit: + mov ebp,cur_editor + call update_tab_filename + mov [cur_editor.Modified],0 + clc + ret + + .exit.2: + stc + ret +endp + +;----------------------------------------------------------------------------- +proc save_string ;//////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + mov ecx,[esi+EDITOR_LINE_DATA.Size] + test [esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED + jz @f + or [esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_SAVED + @@: add esi,sizeof.EDITOR_LINE_DATA + + @@: cmp byte[esi+ecx-1],' ' + jne @f + loop @b + @@: jecxz .endcopy + xor edx,edx + mov ebx,edx + mov ah,dl + + .next_char: + mov al,[esi+ebx] + inc ebx + test [optim_save],1 + jz .put + test ah,00000001b + jnz .char + cmp al,'"' + jne @f + xor ah,00000100b + jmp .char + @@: cmp al,"'" + jne @f + xor ah,00000010b + jmp .char + @@: test ah,00000110b + jnz .char + cmp al,';' + jne @f + test ah,00000001b + jnz .char + xor ah,00000001b + jmp .char + @@: cmp al,' ' + jne .char + inc edx + test ebx,ATABW-1 + jnz @f + dec edx + jle .put + mov al,9 + xor edx,edx + jmp .put + .char: + or edx,edx + jz .put + push ecx eax + mov ecx,edx + mov al,' ' + rep stosb + pop eax ecx + xor edx,edx + .put: + stosb + @@: loop .next_char + + .endcopy: + mov eax,0x0A0D + stosw + add esi,[esi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size] + ret +endp + +proc set_status_fs_error + push eax + mov esi,s_fs_error + @@: dec eax + js @f + movzx ecx,byte[esi] + lea esi,[esi+ecx+1] + jmp @b + @@: inc esi + mov [s_status],esi + pop eax + call draw_statusbar + ret +endp + +;----------------------------------------------------------------------------- +proc load_file ;////////////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- + cmp [tb_opensave.length],0 + jne @f + stc + ret + + @@: mov esi,tb_opensave.text + mov edi,f_info.path + movzx ecx,[tb_opensave.length] + mov [f_info.length],ecx + cld + rep movsb + mov byte[edi],0 + + xor eax,eax + mov [f_info70+0],5 + mov [f_info70+4],eax + mov [f_info70+8],eax + mov [f_info70+12],eax + mov [f_info70+16],file_info + mov byte[f_info70+20],al + mov [f_info70+21],f_info.path + mcall 70,f_info70 + mov [f_info70+0],0 + mov eax,dword[file_info.Size] + or eax, eax + jnz @f + mov eax, 1024 + @@: mov [f_info70+12],eax + stdcall mem.Alloc,eax + mov [f_info70+16],eax + mcall 70,f_info70 + + call set_status_fs_error + + mov esi,[f_info70+16] + + xchg eax,ebx + test ebx,ebx + je .file_found + cmp ebx,6 ;// ATV driver fix (6 instead of 5) + je .file_found + + stdcall mem.Free,[f_info70+16] + stc + ret + + .file_found: + mov ecx,eax + cmp [tab_bar.Items.Count],1 + jne @f + cmp [cur_editor.FilePath],0 + jne @f + cmp [cur_editor.Modified],0 + jne @f + mov ebp,cur_editor + jmp .lp1 + @@: inc [do_not_draw] + call create_tab + dec [do_not_draw] + .lp1: call update_tab_filename + call load_from_memory + stdcall mem.Free,[f_info70+16] + + xor eax,eax + mov [cur_editor.TopLeft.Y],eax + mov [cur_editor.TopLeft.X],eax + mov [cur_editor.Caret.X],eax + mov [cur_editor.Caret.Y],eax + mov [cur_editor.SelStart.X],eax + mov [cur_editor.SelStart.Y],eax + mov [cur_editor.Modified],al + + clc + ret +endp + +;----------------------------------------------------------------------------- +proc load_from_memory ;/////////////////////////////////////////////////////// +;----------------------------------------------------------------------------- +; ECX = data length +; ESI = data pointer +; EBP = EDITOR* +;----------------------------------------------------------------------------- + call get_lines_in_file + mov [ebp+EDITOR.Lines.Count],eax + lea edx,[ebx+ecx] + imul ebx,eax,16 + add ebx,edx + mov [ebp+EDITOR.Lines.Size],ebx + stdcall mem.ReAlloc,[ebp+EDITOR.Lines],ebx + mov [ebp+EDITOR.Lines],eax + + mov [ebp+EDITOR.Columns.Count],0 + mov edi,eax + mov edx,ecx + + .next_line: + mov ebx,edi + add edi,sizeof.EDITOR_LINE_DATA + .next_char: + or edx,edx + jle .exit + lodsb + dec edx + cmp al,13 + je .CR + cmp al,10 + je .LF + cmp al,9 + je .TB + cmp al,0 + je .exit + stosb + jmp .next_char + + .exit: + mov ecx,10 + mov al,' ' + rep stosb + lea eax,[edi-sizeof.EDITOR_LINE_DATA] + sub eax,ebx + mov [ebx+EDITOR_LINE_DATA.Size],eax + mov [ebx+eax+sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size],0 + sub eax,10 + jnz @f + inc eax + @@: cmp eax,[ebp+EDITOR.Columns.Count] + jbe @f + mov [ebp+EDITOR.Columns.Count],eax + @@: mov [ebp+EDITOR.Modified],0 + ret + + .CR: cmp byte[esi],10 + jne .LF + lodsb + dec edx + .LF: mov ecx,10 + mov al,' ' + rep stosb + lea eax,[edi-sizeof.EDITOR_LINE_DATA] + sub eax,ebx + mov [ebx+EDITOR_LINE_DATA.Size],eax + add eax,-10 + cmp eax,[ebp+EDITOR.Columns.Count] + jbe .next_line + mov [ebp+EDITOR.Columns.Count],eax + jmp .next_line + + .TB: lea eax,[edi-sizeof.EDITOR_LINE_DATA] + sub eax,ebx + mov ecx,eax + add ecx,ATABW + and ecx,not(ATABW-1) + sub ecx,eax + mov al,' ' + rep stosb + jmp .next_char +endp + +;----------------------------------------------------------------------------- +proc update_tab_filename ;//////////////////////////////////////////////////// +;----------------------------------------------------------------------------- +; EBP = TABITEM* +;----------------------------------------------------------------------------- + push ecx esi edi + inc [do_not_draw] + mov esi,tb_opensave.text + lea edi,[ebp+TABITEM.Editor.FilePath] + movzx ecx,[tb_opensave.length] + cld + rep movsb + mov byte[edi],0 + lea edi,[ebp+TABITEM.Editor.FilePath] + movzx ecx,[tb_opensave.length] + inc ecx + @@: dec ecx + jz @f + cmp byte[edi+ecx-1],'/' + jne @b + @@: mov [ebp+TABITEM.Editor.FileName],ecx + call flush_cur_tab + call update_caption + dec [do_not_draw] + + mov [cur_editor.AsmMode],0 + movzx ecx,[tb_opensave.length] + mov ecx,dword[ecx+tb_opensave.text-3] + or ecx,0x202020 + cmp ecx,'asm' + jne @f + inc [cur_editor.AsmMode] + jmp .exit + @@: cmp ecx,'inc' + jne @f + inc [cur_editor.AsmMode] + jmp .exit + @@: cmp ecx,'mac' + jne .exit + inc [cur_editor.AsmMode] + + .exit: + pop edi esi ecx + ret +endp