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 |