mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-30 02:09:41 +03:00
44e90288dd
KFar_Arc 0.16: fixed crash when handling some extremely big 7z+lzma archives git-svn-id: svn://kolibrios.org@1122 a494cfbc-eb01-0410-851d-a64ba20cac60
1902 lines
50 KiB
PHP
1902 lines
50 KiB
PHP
virtual at 0
|
||
viewer_data:
|
||
.hPlugin dd ?
|
||
.hFile dd ?
|
||
.buf_start dq ?
|
||
.cur_pos dq ?
|
||
.filesize dq ?
|
||
.buf_pos dd ?
|
||
.buf_size dd ?
|
||
.col dq ?
|
||
.hWorkFile dd ?
|
||
.encoding db ?
|
||
.flags db ? ; & 1: hex mode
|
||
; & 2: unwrap
|
||
; & 4: big-endian unicode
|
||
.bEofReached db ?
|
||
rb 1
|
||
.selected_start dq ?
|
||
.selected_len dq ?
|
||
align 200h
|
||
.filename rb 1024
|
||
.hostname rb 1024
|
||
.buf rb 16384
|
||
.size = $
|
||
end virtual
|
||
|
||
view_file:
|
||
push eax ecx
|
||
mov ecx, viewer_data.size
|
||
mov edx, viewer_vtable
|
||
call new_screen
|
||
pop ecx
|
||
test eax, eax
|
||
pop eax
|
||
jnz @f
|
||
ret
|
||
@@:
|
||
test eax, eax
|
||
jz .frompanel
|
||
and dword [ebp+viewer_data.hPlugin], 0
|
||
and dword [ebp+viewer_data.hFile], 0
|
||
mov byte [ebp+viewer_data.hostname], 0
|
||
lea edi, [ebp+viewer_data.filename]
|
||
push edi
|
||
@@:
|
||
lodsb
|
||
stosb
|
||
test al, al
|
||
jnz @b
|
||
jmp .namecopied
|
||
.frompanel:
|
||
mov eax, dword [esi+panel1_hPlugin-panel1_dir]
|
||
mov [ebp+viewer_data.hPlugin], eax
|
||
test eax, eax
|
||
jz .nocopyhostname
|
||
lea edi, [ebp+viewer_data.hostname]
|
||
push esi
|
||
mov eax, dword [esi+panel1_parents-panel1_dir]
|
||
mov esi, dword [esi+panel1_parents_sz-panel1_dir]
|
||
add esi, eax
|
||
@@:
|
||
dec esi
|
||
cmp byte [esi-1], 0
|
||
jz @f
|
||
cmp byte [esi-1], '/'
|
||
jnz @b
|
||
@@:
|
||
lodsb
|
||
stosb
|
||
test al, al
|
||
jnz @b
|
||
pop esi
|
||
.nocopyhostname:
|
||
mov eax, dword [esi+panel1_hFile-panel1_dir]
|
||
mov [ebp+viewer_data.hFile], eax
|
||
lea edi, [ebp+viewer_data.filename]
|
||
push edi
|
||
@@:
|
||
lodsb
|
||
test al, al
|
||
jz @f
|
||
stosb
|
||
jmp @b
|
||
@@:
|
||
lea esi, [ecx+40]
|
||
cmp byte [edi-1], '/'
|
||
jz @f
|
||
mov al, '/'
|
||
stosb
|
||
@@:
|
||
lodsb
|
||
stosb
|
||
test al, al
|
||
jnz @b
|
||
.namecopied:
|
||
xor eax, eax
|
||
mov [ebp+viewer_data.encoding], al ;encodings.cp866 = 0
|
||
mov [ebp+viewer_data.flags], al
|
||
mov dword [ebp+viewer_data.col], eax
|
||
mov dword [ebp+viewer_data.col+4], eax
|
||
call viewer_clear_selection
|
||
pop eax
|
||
mov ebx, attrinfo
|
||
mov [ebx+21], eax
|
||
mov [readinfo.name], eax
|
||
.attr_retry:
|
||
mov edx, [ebp+viewer_data.hPlugin]
|
||
test edx, edx
|
||
jz .attr_native
|
||
push ebp
|
||
push dword [ebx+16]
|
||
push eax
|
||
push [ebp+viewer_data.hFile]
|
||
call [edx+PluginInfo.getattr]
|
||
pop ebp
|
||
jmp .attr_common
|
||
.attr_native:
|
||
push 70
|
||
pop eax
|
||
int 40h
|
||
.attr_common:
|
||
test eax, eax
|
||
jz @f
|
||
lea ebx, [ebp+viewer_data.filename]
|
||
push ebx
|
||
push aCannotReadFile
|
||
call get_error_msg
|
||
push eax
|
||
mov eax, esp
|
||
push RetryOrCancelBtn
|
||
push 2
|
||
push eax
|
||
push 3
|
||
call SayErr
|
||
add esp, 3*4
|
||
mov ebx, attrinfo
|
||
test eax, eax
|
||
jz .attr_retry
|
||
pop eax
|
||
jmp delete_active_screen
|
||
@@:
|
||
mov eax, dword [attrinfo.attr+32]
|
||
mov dword [ebp+viewer_data.filesize], eax
|
||
mov eax, dword [attrinfo.attr+36]
|
||
mov dword [ebp+viewer_data.filesize+4], eax
|
||
mov ebx, readinfo
|
||
xor eax, eax
|
||
mov dword [ebx+readinfo.first-readinfo], eax
|
||
mov dword [ebx+readinfo.first+4-readinfo], eax
|
||
mov dword [ebp+viewer_data.buf_start], eax
|
||
mov dword [ebp+viewer_data.buf_start+4], eax
|
||
mov dword [ebp+viewer_data.cur_pos], eax
|
||
mov dword [ebp+viewer_data.cur_pos+4], eax
|
||
mov [ebx+readinfo.size-readinfo], 16384
|
||
lea eax, [ebp+viewer_data.buf]
|
||
mov [readinfo.data], eax
|
||
mov [ebp+viewer_data.buf_pos], eax
|
||
mov eax, [ebp+viewer_data.hPlugin]
|
||
test eax, eax
|
||
jz .retry
|
||
push ebx ebp
|
||
push O_READ
|
||
push dword [readinfo.name]
|
||
push [ebp+viewer_data.hFile]
|
||
call [eax+PluginInfo.open]
|
||
pop ebp ebx
|
||
mov [ebp+viewer_data.hWorkFile], eax
|
||
test eax, eax
|
||
jnz .retry
|
||
..openerr_in_screen:
|
||
push ContinueBtn
|
||
push 1
|
||
push aCannotOpenFile_ptr
|
||
push 1
|
||
call SayErr
|
||
jmp delete_active_screen
|
||
.retry:
|
||
mov eax, [ebp+viewer_data.hPlugin]
|
||
test eax, eax
|
||
jz .read_native
|
||
push ebp
|
||
push 16384
|
||
push [ebx+readinfo.data-readinfo]
|
||
push [ebp+viewer_data.hWorkFile]
|
||
call [eax+PluginInfo.read]
|
||
pop ebp
|
||
cmp eax, -1
|
||
jz .readok ; let's hope that plugin says error itself
|
||
mov [ebp+viewer_data.buf_size], eax
|
||
mov ebx, eax
|
||
jmp .readok
|
||
.read_native:
|
||
push 70
|
||
pop eax
|
||
int 40h
|
||
mov [ebp+viewer_data.buf_size], ebx
|
||
test eax, eax
|
||
jz .readok
|
||
cmp eax, 6
|
||
jz .readok
|
||
.readerr:
|
||
lea ebx, [ebp+viewer_data.filename]
|
||
push ebx
|
||
push aCannotReadFile
|
||
call get_error_msg
|
||
push eax
|
||
mov eax, esp
|
||
push RetryOrCancelBtn
|
||
push 2
|
||
push eax
|
||
push 3
|
||
call SayErr
|
||
add esp, 3*4
|
||
mov ebx, readinfo
|
||
test eax, eax
|
||
jz .attr_retry
|
||
jmp delete_active_screen
|
||
.readok:
|
||
cmp ebx, 2
|
||
jb .nounicode
|
||
cmp word [ebp+viewer_data.buf], 0xFEFF
|
||
jz @f
|
||
cmp word [ebp+viewer_data.buf], 0xFFFE
|
||
jnz .nounicode
|
||
or byte [ebp+viewer_data.flags], 4
|
||
@@:
|
||
mov [ebp+viewer_data.encoding], encodings.unicode
|
||
.nounicode:
|
||
viewer_OnRedraw:
|
||
or [cursor_x], -1
|
||
or [cursor_y], -1
|
||
call viewer_set_keybar
|
||
call viewer_draw_text
|
||
ret
|
||
|
||
viewer_skip_unicode_marker:
|
||
cmp [ebp+viewer_data.encoding], encodings.unicode
|
||
jnz @f
|
||
cmp [bForHex], 0
|
||
jnz @f
|
||
cmp dword [ebp+viewer_data.buf_start], 0
|
||
jnz @f
|
||
cmp dword [ebp+viewer_data.buf_start+4], 0
|
||
jnz @f
|
||
lea eax, [ebp+viewer_data.buf]
|
||
cmp eax, [ebp+viewer_data.buf_pos]
|
||
jnz @f
|
||
cmp word [eax], 0xFFFE
|
||
jz .skip
|
||
cmp word [eax], 0xFEFF
|
||
jnz @f
|
||
.skip:
|
||
add [ebp+viewer_data.buf_pos], 2
|
||
@@:
|
||
ret
|
||
|
||
viewer_load_next:
|
||
mov eax, dword [ebp+viewer_data.buf_start]
|
||
add eax, 8192
|
||
mov dword [ebp+viewer_data.buf_start], eax
|
||
mov edx, dword [ebp+viewer_data.buf_start+4]
|
||
adc edx, 0
|
||
mov dword [ebp+viewer_data.buf_start+4], edx
|
||
add eax, 16384-8192
|
||
adc edx, 0
|
||
mov dword [readinfo.first], eax
|
||
mov dword [readinfo.first+4], edx
|
||
mov dword [readinfo.size], 8192
|
||
lea edi, [ebp+viewer_data.buf]
|
||
lea esi, [edi+8192]
|
||
mov ecx, (16384-8192)/4
|
||
rep movsd
|
||
mov [readinfo.data], edi
|
||
lea eax, [ebp+viewer_data.filename]
|
||
mov [readinfo.name], eax
|
||
.readretry:
|
||
mov ebx, readinfo
|
||
mov eax, [ebp+viewer_data.hPlugin]
|
||
test eax, eax
|
||
jz .native
|
||
push ecx ebp
|
||
push 8192
|
||
push [ebx+readinfo.data-readinfo]
|
||
push [ebp+viewer_data.hWorkFile]
|
||
call [eax+PluginInfo.read]
|
||
pop ebp ecx
|
||
mov ebx, eax
|
||
cmp eax, -1
|
||
jnz .readok
|
||
xor ebx, ebx
|
||
jmp .readok
|
||
.native:
|
||
push 70
|
||
pop eax
|
||
int 40h
|
||
test eax, eax
|
||
jz .readok
|
||
cmp eax, 6
|
||
jz .readok
|
||
.readerr:
|
||
call ask_retry_ignore
|
||
jz .readretry
|
||
.readok:
|
||
sub [ebp+viewer_data.buf_pos], 8192
|
||
add ebx, 16384-8192
|
||
mov [ebp+viewer_data.buf_size], ebx
|
||
mov eax, [ebp+viewer_data.buf_pos]
|
||
cmp ebx, 16384-8192
|
||
ret
|
||
|
||
viewer_get_next_char:
|
||
pusha
|
||
call viewer_skip_unicode_marker
|
||
mov eax, [ebp+viewer_data.buf_pos]
|
||
lea ecx, [ebp+viewer_data.buf]
|
||
add ecx, [ebp+viewer_data.buf_size]
|
||
cmp eax, ecx
|
||
jb .buffered
|
||
mov al, ' '
|
||
sub ecx, ebp
|
||
cmp ecx, viewer_data.buf + 16384
|
||
jb .err
|
||
call viewer_load_next
|
||
jnz .buffered
|
||
.err:
|
||
stc
|
||
popa
|
||
ret
|
||
.buffered:
|
||
cmp [ebp+viewer_data.encoding], encodings.unicode
|
||
jz .unicode
|
||
mov al, [eax]
|
||
.done:
|
||
mov [esp+28], al
|
||
inc [ebp+viewer_data.buf_pos]
|
||
clc
|
||
popa
|
||
ret
|
||
|
||
.unicode:
|
||
inc [ebp+viewer_data.buf_pos]
|
||
cmp [bForHex], 0
|
||
jnz @f
|
||
call read_unicode_char
|
||
jmp .done
|
||
@@:
|
||
mov ax, [eax]
|
||
mov [esp+29], ah
|
||
jmp .done
|
||
|
||
viewer_get_prev_char:
|
||
pusha
|
||
lea ecx, [ebp+viewer_data.buf]
|
||
cmp [ebp+viewer_data.buf_pos], ecx
|
||
ja .buffered
|
||
mov eax, dword [ebp+viewer_data.buf_start]
|
||
mov edx, dword [ebp+viewer_data.buf_start+4]
|
||
test eax, eax
|
||
jnz @f
|
||
test edx, edx
|
||
jnz @f
|
||
stc
|
||
jmp .ret
|
||
@@:
|
||
sub eax, 8192
|
||
sbb edx, 0
|
||
jnc @f
|
||
xor eax, eax
|
||
xor edx, edx
|
||
@@:
|
||
call viewer_seek
|
||
add [ebp+viewer_data.buf_pos], 8192
|
||
.buffered:
|
||
mov eax, [ebp+viewer_data.buf_pos]
|
||
dec eax
|
||
cmp [ebp+viewer_data.encoding], encodings.unicode
|
||
jz .unicode
|
||
mov [ebp+viewer_data.buf_pos], eax
|
||
mov al, [eax]
|
||
mov [esp+28], al
|
||
.done:
|
||
clc
|
||
.ret:
|
||
popa
|
||
ret
|
||
|
||
.unicode:
|
||
dec eax
|
||
mov [ebp+viewer_data.buf_pos], eax
|
||
call read_unicode_char
|
||
jmp .done
|
||
|
||
read_unicode_char:
|
||
mov ax, [eax]
|
||
uni2ansi_char:
|
||
test [ebp+viewer_data.flags], 4
|
||
jz @f
|
||
xchg al, ah
|
||
@@:
|
||
cmp ax, 0x80
|
||
jb .ret
|
||
cmp ax, 0x401
|
||
jz .yo1
|
||
cmp ax, 0x451
|
||
jz .yo2
|
||
cmp ax, 0x410
|
||
jb .unk
|
||
cmp ax, 0x440
|
||
jb .rus1
|
||
cmp ax, 0x450
|
||
jb .rus2
|
||
.unk:
|
||
mov al, ' '
|
||
.ret:
|
||
ret
|
||
.yo1:
|
||
mov al, '<EFBFBD>'
|
||
ret
|
||
.yo2:
|
||
mov al, '<EFBFBD>'
|
||
ret
|
||
.rus1:
|
||
; 0x410-0x43F -> 0x80-0xAF
|
||
add al, 0x70
|
||
ret
|
||
.rus2:
|
||
; 0x440-0x44F -> 0xE0-0xEF
|
||
add al, 0xA0
|
||
ret
|
||
|
||
viewer_clear_selection:
|
||
and dword [ebp+viewer_data.selected_start], 0
|
||
and dword [ebp+viewer_data.selected_start+4], 0
|
||
and dword [ebp+viewer_data.selected_len], 0
|
||
and dword [ebp+viewer_data.selected_len+4], 0
|
||
ret
|
||
|
||
fld_uint64:
|
||
fild qword [eax]
|
||
test byte [eax+7], 80h
|
||
jz .ret
|
||
fadd [@f]
|
||
.ret:
|
||
ret
|
||
@@ dq 18446744073709551616.0 ;0x10000000000000000
|
||
|
||
viewer_draw_text:
|
||
call viewer_seek_to_current
|
||
xor eax, eax
|
||
xor edx, edx
|
||
call get_console_ptr
|
||
mov ah, [view_status_color]
|
||
mov ecx, [cur_width]
|
||
sub ecx, 44
|
||
cmp ecx, 20
|
||
jae @f
|
||
mov cl, 20
|
||
@@:
|
||
call viewedit_draw_filename
|
||
add ecx, 11
|
||
rep stosw
|
||
movzx esi, [ebp+viewer_data.encoding]
|
||
lea esi, [encodings.names+esi*8]
|
||
push edi esi
|
||
dec edi
|
||
dec edi
|
||
std
|
||
add esi, 8
|
||
@@:
|
||
dec esi
|
||
cmp byte [esi], ' '
|
||
jz @b
|
||
@@:
|
||
lodsb
|
||
stosw
|
||
cmp esi, [esp]
|
||
jae @b
|
||
cld
|
||
pop esi edi
|
||
mov al, ' '
|
||
mov cl, 13
|
||
rep stosw
|
||
std
|
||
push edi
|
||
mov edx, dword [ebp+viewer_data.filesize+4]
|
||
mov eax, dword [ebp+viewer_data.filesize]
|
||
mov cl, 10
|
||
@@:
|
||
push eax
|
||
mov eax, edx
|
||
xor edx, edx
|
||
div ecx
|
||
xchg eax, [esp]
|
||
div ecx
|
||
xchg eax, edx
|
||
add al, '0'
|
||
mov ah, [view_status_color]
|
||
stosw
|
||
xchg eax, edx
|
||
pop edx
|
||
test eax, eax
|
||
jnz @b
|
||
test edx, edx
|
||
jnz @b
|
||
mov al, ' '
|
||
mov ah, [view_status_color]
|
||
stosw
|
||
cld
|
||
pop edi
|
||
inc edi
|
||
inc edi
|
||
mov al, ' '
|
||
mov cl, 5
|
||
rep stosw
|
||
if lang eq ru
|
||
mov al, '<EFBFBD>'
|
||
stosw
|
||
mov al, '<EFBFBD>'
|
||
stosw
|
||
mov al, '<EFBFBD>'
|
||
stosw
|
||
else
|
||
mov al, 'C'
|
||
stosw
|
||
mov al, 'o'
|
||
stosw
|
||
mov al, 'l'
|
||
stosw
|
||
end if
|
||
mov al, ' '
|
||
stosw
|
||
push edi
|
||
mov eax, dword [ebp+viewer_data.col]
|
||
mov edx, dword [ebp+viewer_data.col+4]
|
||
test edx, edx
|
||
jnz .col_big
|
||
cmp eax, 100000
|
||
jae .col_big
|
||
mov cl, 10
|
||
push -'0'
|
||
@@:
|
||
div ecx
|
||
push edx
|
||
xor edx, edx
|
||
test eax, eax
|
||
jnz @b
|
||
@@:
|
||
pop eax
|
||
add eax, '0'
|
||
jz .col_done
|
||
mov ah, [view_status_color]
|
||
stosw
|
||
jmp @b
|
||
.col_big:
|
||
push eax
|
||
mov al, '.'
|
||
mov ah, [view_status_color]
|
||
stosw
|
||
stosw
|
||
stosw
|
||
xor eax, eax
|
||
xchg eax, edx
|
||
mov cl, 100
|
||
div ecx
|
||
pop eax
|
||
div ecx
|
||
mov cl, 10
|
||
xor eax, eax
|
||
xchg eax, edx
|
||
div ecx
|
||
add al, '0'
|
||
mov ah, [view_status_color]
|
||
stosw
|
||
mov al, dl
|
||
add al, '0'
|
||
stosw
|
||
.col_done:
|
||
pop ecx
|
||
add ecx, 10*2
|
||
sub ecx, edi
|
||
shr ecx, 1
|
||
mov al, ' '
|
||
mov ah, [view_status_color]
|
||
rep stosw
|
||
finit
|
||
fldcw [fpu_cw]
|
||
mov [tmp], 100
|
||
lea eax, [ebp+viewer_data.filesize]
|
||
cmp dword [eax], 0
|
||
jnz @f
|
||
cmp dword [eax+4], 0
|
||
jz .size_zero
|
||
@@:
|
||
call fld_uint64
|
||
lea eax, [ebp+viewer_data.cur_pos]
|
||
call fld_uint64
|
||
fdivrp
|
||
fimul [_100d]
|
||
fistp [tmp]
|
||
.size_zero:
|
||
mov byte [edi-2], '%'
|
||
sub edi, 4
|
||
mov eax, [tmp]
|
||
mov cl, 10
|
||
@@:
|
||
xor edx, edx
|
||
div ecx
|
||
xchg eax, edx
|
||
add al, '0'
|
||
mov [edi], al
|
||
sub edi, 2
|
||
xchg eax, edx
|
||
test eax, eax
|
||
jnz @b
|
||
xor eax, eax
|
||
push 1
|
||
pop edx
|
||
call get_console_ptr
|
||
test [ebp+viewer_data.flags], 1
|
||
jnz .DrawHex
|
||
push 2
|
||
pop edx
|
||
xor ecx, ecx
|
||
mov dword [scrpos], ecx
|
||
mov dword [scrpos+4], ecx
|
||
mov dword [viewer_right_side], ecx
|
||
mov dword [viewer_right_side+4], ecx
|
||
.1:
|
||
call viewer_get_next_char
|
||
jc .done
|
||
.2:
|
||
cmp al, 0xD
|
||
jz .newline
|
||
cmp al, 0xA
|
||
jz .newline
|
||
cmp ecx, [cur_width]
|
||
jb .no_newline
|
||
test [ebp+viewer_data.flags], 2
|
||
jnz .no_newline
|
||
.newline:
|
||
push eax
|
||
mov ecx, dword [scrpos]
|
||
mov eax, dword [scrpos+4]
|
||
sub ecx, dword [ebp+viewer_data.col]
|
||
sbb eax, dword [ebp+viewer_data.col+4]
|
||
ja .line_filled
|
||
jb .line_full
|
||
cmp ecx, [cur_width]
|
||
ja .line_filled
|
||
jmp @f
|
||
.line_full:
|
||
xor ecx, ecx
|
||
@@:
|
||
test ecx, ecx
|
||
jnz @f
|
||
mov eax, dword [scrpos]
|
||
or eax, dword [scrpos+4]
|
||
jz @f
|
||
inc ecx
|
||
@@:
|
||
sub ecx, [cur_width]
|
||
neg ecx
|
||
mov al, ' '
|
||
mov ah, [view_normal_color]
|
||
rep stosw
|
||
.line_filled:
|
||
mov eax, dword [scrpos]
|
||
sub eax, dword [viewer_right_side]
|
||
mov eax, dword [scrpos+4]
|
||
sbb eax, dword [viewer_right_side+4]
|
||
jb @f
|
||
mov eax, dword [scrpos]
|
||
mov dword [viewer_right_side], eax
|
||
mov eax, dword [scrpos+4]
|
||
mov dword [viewer_right_side+4], eax
|
||
@@:
|
||
xor ecx, ecx
|
||
mov dword [scrpos], ecx
|
||
mov dword [scrpos+4], ecx
|
||
inc edx
|
||
pop eax
|
||
cmp edx, [cur_height]
|
||
jae .done
|
||
.no_newline:
|
||
cmp al, 0xD
|
||
jz .3
|
||
cmp al, 0xA
|
||
jz .3
|
||
.4:
|
||
test al, al
|
||
jns @f
|
||
movzx esi, [ebp+viewer_data.encoding]
|
||
cmp esi, encodings.unicode
|
||
jz @f
|
||
shl esi, 7
|
||
movzx eax, al
|
||
mov al, [encodings.tables-80h+esi+eax]
|
||
@@:
|
||
cmp al, 9
|
||
jz .tab
|
||
call .write_char
|
||
inc ecx
|
||
jns .1
|
||
push edx
|
||
mov eax, ecx
|
||
xor edx, edx
|
||
div [viewer_tabsize]
|
||
mov ecx, edx
|
||
pop edx
|
||
jmp .1
|
||
.3:
|
||
mov bl, al
|
||
call viewer_get_next_char
|
||
jc .done
|
||
xor bl, al
|
||
cmp bl, 0xA xor 0xD
|
||
jz .1
|
||
jmp .2
|
||
.tab:
|
||
push edx
|
||
push ecx
|
||
mov eax, ecx
|
||
mov ecx, [viewer_tabsize]
|
||
xor edx, edx
|
||
div ecx
|
||
pop eax
|
||
sub ecx, edx
|
||
pop edx
|
||
add eax, ecx
|
||
test [ebp+viewer_data.flags], 2
|
||
jnz @f
|
||
cmp eax, [cur_width]
|
||
jbe @f
|
||
sub eax, [cur_width]
|
||
sub ecx, eax
|
||
mov eax, [cur_width]
|
||
@@:
|
||
push eax
|
||
mov al, ' '
|
||
@@:
|
||
call .write_char
|
||
loop @b
|
||
pop ecx
|
||
jmp .1
|
||
.done:
|
||
setc [ebp+viewer_data.bEofReached]
|
||
.done2:
|
||
inc edx
|
||
cmp edx, [cur_height]
|
||
jnc @f
|
||
mov eax, dword [ebp+viewer_data.cur_pos]
|
||
or eax, dword [ebp+viewer_data.cur_pos+4]
|
||
jz @f
|
||
call viewer_seek_to_current
|
||
call viewer_prev_newline
|
||
jmp viewer_draw_text
|
||
@@:
|
||
push edi
|
||
xor eax, eax
|
||
mov edx, [cur_height]
|
||
dec edx
|
||
call get_console_ptr
|
||
mov ecx, edi
|
||
pop edi
|
||
sub ecx, edi
|
||
shr ecx, 1
|
||
mov al, ' '
|
||
mov ah, [view_normal_color]
|
||
rep stosw
|
||
cmp [ebp+viewer_data.bEofReached], 0
|
||
jz @f
|
||
xor edx, edx
|
||
mov eax, [cur_width]
|
||
sub eax, 4
|
||
call get_console_ptr
|
||
mov ah, [view_status_color]
|
||
mov al, '1'
|
||
stosw
|
||
mov al, '0'
|
||
stosw
|
||
stosw
|
||
@@:
|
||
call draw_image
|
||
ret
|
||
.DrawHex:
|
||
xor esi, esi
|
||
mov [ebp+viewer_data.bEofReached], 0
|
||
.line:
|
||
mov al, ' '
|
||
mov ah, [view_normal_color]
|
||
push edi
|
||
mov ecx, [cur_width]
|
||
rep stosw
|
||
mov ebx, edi
|
||
pop edi
|
||
mov [bForHex], 1
|
||
call viewer_get_next_char
|
||
mov [bForHex], 0
|
||
jc .hexdone
|
||
push eax
|
||
push edi
|
||
add edi, 36*2
|
||
mov al, 0xB3
|
||
mov ah, [view_normal_color]
|
||
call .safechar
|
||
pop edi
|
||
mov eax, dword [ebp+viewer_data.cur_pos]
|
||
mov edx, dword [ebp+viewer_data.cur_pos+4]
|
||
push esi
|
||
shl esi, 4
|
||
add eax, esi
|
||
adc edx, 0
|
||
pop esi
|
||
push eax
|
||
mov al, dl
|
||
shr eax, 4
|
||
and al, 0xF
|
||
call .hex_digit
|
||
mov al, dl
|
||
and al, 0xF
|
||
call .hex_digit
|
||
pop eax
|
||
push 8
|
||
pop ecx
|
||
add edi, 7*2
|
||
std
|
||
@@:
|
||
push eax
|
||
and al, 0xF
|
||
call .hex_digit
|
||
pop eax
|
||
shr eax, 4
|
||
loop @b
|
||
cld
|
||
add edi, 9*2
|
||
mov al, ':'
|
||
mov ah, [view_normal_color]
|
||
stosw
|
||
mov al, ' '
|
||
stosw
|
||
xor ecx, ecx
|
||
pop eax
|
||
jmp @f
|
||
.hexchar:
|
||
mov [bForHex], 1
|
||
call viewer_get_next_char
|
||
mov [bForHex], 0
|
||
jc .hexdone
|
||
@@:
|
||
cmp [ebp+viewer_data.encoding], encodings.unicode
|
||
jz .hexchar_unicode
|
||
push eax
|
||
shr al, 4
|
||
call .hex_digit
|
||
pop eax
|
||
push eax
|
||
and al, 0xF
|
||
call .hex_digit
|
||
mov al, ' '
|
||
call .safechar
|
||
pop eax
|
||
push edi
|
||
add edi, 48*2
|
||
push ecx
|
||
shl ecx, 2
|
||
sub edi, ecx
|
||
pop ecx
|
||
cmp ecx, 8
|
||
jb @f
|
||
sub edi, 4
|
||
@@:
|
||
test al, al
|
||
jns @f
|
||
movzx edx, [ebp+viewer_data.encoding]
|
||
shl edx, 7
|
||
movzx eax, al
|
||
mov al, [encodings.tables+eax+edx-80h]
|
||
mov ah, [view_normal_color]
|
||
@@:
|
||
call .safechar
|
||
pop edi
|
||
inc ecx
|
||
cmp ecx, 8
|
||
jnz @f
|
||
mov al, 0xB3
|
||
call .safechar
|
||
mov al, ' '
|
||
call .safechar
|
||
@@:
|
||
cmp ecx, 16
|
||
jnz .hexchar
|
||
jmp .hexchar_nextline
|
||
.hexchar_unicode:
|
||
push eax
|
||
shr eax, 12
|
||
call .hex_digit
|
||
pop eax
|
||
push eax
|
||
shr eax, 8
|
||
and al, 0xF
|
||
call .hex_digit
|
||
pop eax
|
||
push eax
|
||
shr al, 4
|
||
call .hex_digit
|
||
pop eax
|
||
push eax
|
||
and al, 0xF
|
||
call .hex_digit
|
||
mov al, ' '
|
||
mov ah, [view_normal_color]
|
||
call .safechar
|
||
pop eax
|
||
push edi
|
||
add edi, 38*2
|
||
push ecx
|
||
shl ecx, 3
|
||
sub edi, ecx
|
||
pop ecx
|
||
cmp ecx, 4
|
||
jb @f
|
||
sub edi, 4
|
||
@@:
|
||
call uni2ansi_char
|
||
mov ah, [view_normal_color]
|
||
call .safechar
|
||
pop edi
|
||
inc ecx
|
||
cmp ecx, 4
|
||
jnz @f
|
||
mov al, 0xB3
|
||
call .safechar
|
||
mov al, ' '
|
||
call .safechar
|
||
@@:
|
||
cmp ecx, 8
|
||
jnz .hexchar
|
||
.hexchar_nextline:
|
||
mov edi, ebx
|
||
add esi, 3
|
||
mov edx, esi
|
||
cmp esi, [cur_height]
|
||
jae .done2
|
||
dec esi
|
||
dec esi
|
||
jmp .line
|
||
.hexdone:
|
||
mov [ebp+viewer_data.bEofReached], 1
|
||
mov edi, ebx
|
||
lea edx, [esi+2]
|
||
jmp .done2
|
||
|
||
.hex_digit:
|
||
push eax
|
||
cmp al, 10
|
||
sbb al, 69h
|
||
das
|
||
mov ah, [view_normal_color]
|
||
call .safechar
|
||
pop eax
|
||
ret
|
||
.safechar:
|
||
cmp edi, ebx
|
||
jae @f
|
||
stosw
|
||
@@:
|
||
ret
|
||
.write_char:
|
||
push ecx eax
|
||
mov ecx, dword [scrpos]
|
||
mov eax, dword [scrpos+4]
|
||
sub ecx, dword [ebp+viewer_data.col]
|
||
sbb eax, dword [ebp+viewer_data.col+4]
|
||
jb .left
|
||
ja .skip
|
||
test ecx, ecx
|
||
jnz @f
|
||
mov eax, dword [scrpos]
|
||
or eax, dword [scrpos+4]
|
||
jnz .skip
|
||
@@:
|
||
cmp ecx, [cur_width]
|
||
ja .skip
|
||
jb .do
|
||
mov al, '>'
|
||
mov [edi-2], al
|
||
mov al, [view_arrows_color]
|
||
mov [edi-1], al
|
||
jmp .skip
|
||
.left:
|
||
mov eax, dword [scrpos]
|
||
or eax, dword [scrpos+4]
|
||
jnz .skip
|
||
mov al, '<'
|
||
mov ah, [view_arrows_color]
|
||
stosw
|
||
jmp .skip
|
||
.do:
|
||
mov al, [esp]
|
||
mov ah, [view_normal_color]
|
||
push edx
|
||
mov ecx, [ebp+viewer_data.buf_pos]
|
||
sub ecx, ebp
|
||
sub ecx, viewer_data.buf + 1
|
||
xor edx, edx
|
||
add ecx, dword [ebp+viewer_data.buf_start]
|
||
adc edx, dword [ebp+viewer_data.buf_start+4]
|
||
sub ecx, dword [ebp+viewer_data.selected_start]
|
||
sbb edx, dword [ebp+viewer_data.selected_start+4]
|
||
cmp edx, dword [ebp+viewer_data.selected_len+4]
|
||
ja .color_ok
|
||
jb @f
|
||
cmp ecx, dword [ebp+viewer_data.selected_len]
|
||
jae .color_ok
|
||
@@:
|
||
mov ah, [view_selected_color]
|
||
.color_ok:
|
||
pop edx
|
||
stosw
|
||
.skip:
|
||
pop eax ecx
|
||
add dword [scrpos], 1
|
||
adc dword [scrpos+4], 0
|
||
ret
|
||
|
||
viewedit_draw_filename:
|
||
lea esi, [ebp+viewer_data.filename]
|
||
xor edx, edx
|
||
cmp [ebp+viewer_data.hPlugin], edx
|
||
mov dl, 3
|
||
jz .5
|
||
mov dl, 1
|
||
.5:
|
||
lodsb
|
||
cmp al, '/'
|
||
jnz @f
|
||
dec edx
|
||
jz .6
|
||
@@:
|
||
stosw
|
||
loop .5
|
||
.6:
|
||
dec ecx
|
||
stosw
|
||
push esi
|
||
@@:
|
||
inc esi
|
||
cmp byte [esi-1], 0
|
||
jnz @b
|
||
sub esi, [esp]
|
||
dec esi
|
||
cmp ecx, esi
|
||
jae .7
|
||
mov al, '.'
|
||
stosw
|
||
stosw
|
||
stosw
|
||
sub ecx, 3
|
||
sub esi, ecx
|
||
add [esp], esi
|
||
.7:
|
||
pop esi
|
||
@@:
|
||
lodsb
|
||
test al, al
|
||
jz @f
|
||
dec ecx
|
||
stosw
|
||
jmp @b
|
||
@@:
|
||
mov al, ' '
|
||
ret
|
||
|
||
viewer_seek_to_current:
|
||
mov eax, dword [ebp+viewer_data.cur_pos]
|
||
mov edx, dword [ebp+viewer_data.cur_pos+4]
|
||
viewer_seek:
|
||
push eax edx
|
||
sub eax, dword [ebp+viewer_data.buf_start]
|
||
sbb edx, dword [ebp+viewer_data.buf_start+4]
|
||
jb .prev
|
||
ja .next
|
||
cmp eax, 16384
|
||
jae .next
|
||
lea eax, [ebp+viewer_data.buf+eax]
|
||
mov [ebp+viewer_data.buf_pos], eax
|
||
pop edx eax
|
||
ret
|
||
.prev:
|
||
inc edx
|
||
jnz .read_full
|
||
and eax, not 511
|
||
cmp eax, -16384
|
||
jbe .read_full
|
||
lea edi, [ebp+viewer_data.buf+16384-4]
|
||
lea esi, [edi+eax]
|
||
lea ecx, [eax+16384]
|
||
push ecx
|
||
shr ecx, 2
|
||
std
|
||
rep movsd
|
||
cld
|
||
pop ecx
|
||
add dword [ebp+viewer_data.buf_start], eax
|
||
adc dword [ebp+viewer_data.buf_start+4], -1
|
||
neg eax
|
||
cmp dword [ebp+viewer_data.buf_size], ecx
|
||
jb .doread
|
||
mov dword [ebp+viewer_data.buf_size], ecx
|
||
jmp .doread
|
||
.read_full:
|
||
pop edx eax
|
||
push eax edx
|
||
and eax, not 511
|
||
sub eax, 8192-512
|
||
sbb edx, 0
|
||
jnc @f
|
||
xor eax, eax
|
||
xor edx, edx
|
||
@@:
|
||
mov dword [ebp+viewer_data.buf_start], eax
|
||
mov dword [ebp+viewer_data.buf_start+4], edx
|
||
and dword [ebp+viewer_data.buf_size], 0
|
||
mov eax, 16384
|
||
.doread:
|
||
mov ebx, readinfo
|
||
push dword [ebp+viewer_data.buf_start]
|
||
pop dword [ebx+4]
|
||
push dword [ebp+viewer_data.buf_start+4]
|
||
pop dword [ebx+8]
|
||
mov [ebx+12], eax
|
||
lea eax, [ebp+viewer_data.buf]
|
||
mov [ebx+16], eax
|
||
lea eax, [ebp+viewer_data.filename]
|
||
mov [ebx+21], eax
|
||
call .q
|
||
cmp ebx, [readinfo.size]
|
||
jnz @f
|
||
add ebx, [ebp+viewer_data.buf_size]
|
||
@@:
|
||
.ret:
|
||
mov [ebp+viewer_data.buf_size], ebx
|
||
pop edx eax
|
||
sub eax, dword [ebp+viewer_data.buf_start]
|
||
lea eax, [ebp+eax+viewer_data.buf]
|
||
mov [ebp+viewer_data.buf_pos], eax
|
||
ret
|
||
.next:
|
||
or eax, 511
|
||
sub eax, 16384-1
|
||
sbb edx, 0
|
||
jnz .read_full
|
||
cmp eax, 16384
|
||
jae .read_full
|
||
cmp [ebp+viewer_data.buf_size], 16384
|
||
jb .read_full
|
||
lea edi, [ebp+viewer_data.buf]
|
||
lea esi, [edi+eax]
|
||
mov ecx, 16384
|
||
sub ecx, eax
|
||
shr ecx, 2
|
||
rep movsd
|
||
add dword [ebp+viewer_data.buf_start], eax
|
||
adc dword [ebp+viewer_data.buf_start+4], 0
|
||
mov ebx, readinfo
|
||
mov [ebx+16], edi
|
||
sub edi, ebp
|
||
sub edi, viewer_data.buf
|
||
mov edx, dword [ebp+viewer_data.buf_start]
|
||
add edx, edi
|
||
mov [ebx+4], edx
|
||
mov edx, dword [ebp+viewer_data.buf_start+4]
|
||
adc edx, 0
|
||
mov [ebx+8], edx
|
||
mov [ebx+12], eax
|
||
lea eax, [ebp+viewer_data.filename]
|
||
mov [ebx+21], eax
|
||
call .q
|
||
sub ebx, [readinfo.size]
|
||
add ebx, 16384
|
||
jmp .ret
|
||
|
||
.q:
|
||
mov ebx, readinfo
|
||
mov eax, [ebp+viewer_data.hPlugin]
|
||
test eax, eax
|
||
jz .native
|
||
push ebp
|
||
push dword [ebx+12]
|
||
push dword [ebx+16]
|
||
push [ebp+viewer_data.hWorkFile]
|
||
push eax
|
||
push dword [ebx+8]
|
||
push dword [ebx+4]
|
||
push [ebp+viewer_data.hWorkFile]
|
||
call [eax+PluginInfo.setpos]
|
||
pop eax
|
||
call [eax+PluginInfo.read]
|
||
pop ebp
|
||
mov ebx, eax
|
||
cmp eax, -1
|
||
jnz @f
|
||
xor ebx, ebx
|
||
@@:
|
||
ret
|
||
.native:
|
||
push 70
|
||
pop eax
|
||
int 40h
|
||
test eax, eax
|
||
jz .readok
|
||
cmp eax, 6
|
||
jz .readok
|
||
.readerr:
|
||
call ask_retry_ignore
|
||
jz .q
|
||
.readok:
|
||
ret
|
||
|
||
ask_retry_ignore:
|
||
push esi
|
||
lea esi, [ebp+viewer_data.filename]
|
||
push esi
|
||
push aCannotReadFile
|
||
call get_error_msg
|
||
push eax
|
||
mov eax, esp
|
||
push RetryOrIgnoreBtn
|
||
push 2
|
||
push eax
|
||
push 3
|
||
call SayErr
|
||
add esp, 3*4
|
||
pop esi
|
||
test eax, eax
|
||
ret
|
||
|
||
viewer_set_curpos:
|
||
mov eax, [ebp+viewer_data.buf_pos]
|
||
sub eax, ebp
|
||
sub eax, viewer_data.buf
|
||
xor edx, edx
|
||
add eax, dword [ebp+viewer_data.buf_start]
|
||
adc edx, dword [ebp+viewer_data.buf_start+4]
|
||
mov dword [ebp+viewer_data.cur_pos], eax
|
||
mov dword [ebp+viewer_data.cur_pos+4], edx
|
||
ret
|
||
|
||
viewer_next_newline:
|
||
test [ebp+viewer_data.flags], 1
|
||
jz .nohex
|
||
push 8
|
||
pop ecx
|
||
cmp [ebp+viewer_data.encoding], encodings.unicode
|
||
jz @f
|
||
add ecx, ecx
|
||
@@:
|
||
call viewer_get_next_char
|
||
jc @f
|
||
loop @b
|
||
call viewer_set_curpos
|
||
clc
|
||
@@: ret
|
||
.nohex:
|
||
xor ecx, ecx
|
||
@@:
|
||
call viewer_get_next_char
|
||
jc .ret
|
||
cmp al, 0xD
|
||
jz .1
|
||
cmp al, 0xA
|
||
jz .1
|
||
cmp al, 9
|
||
jz .tab
|
||
inc ecx
|
||
.next:
|
||
test [ebp+viewer_data.flags], 2
|
||
jnz @b
|
||
cmp ecx, [cur_width]
|
||
jbe @b
|
||
call viewer_get_prev_char
|
||
jmp .2
|
||
.tab:
|
||
push ecx
|
||
mov eax, ecx
|
||
mov ecx, [viewer_tabsize]
|
||
xor edx, edx
|
||
div ecx
|
||
sub ecx, edx
|
||
add [esp], ecx
|
||
pop ecx
|
||
jmp .next
|
||
.1:
|
||
mov cl, al
|
||
call viewer_get_next_char
|
||
jc .ret
|
||
xor cl, al
|
||
cmp cl, 0xD xor 0xA
|
||
jz .2
|
||
dec [ebp+viewer_data.buf_pos]
|
||
cmp [ebp+viewer_data.encoding], encodings.unicode
|
||
jnz .2
|
||
dec [ebp+viewer_data.buf_pos]
|
||
.2:
|
||
clc
|
||
.ret:
|
||
pushf
|
||
call viewer_set_curpos
|
||
popf
|
||
ret
|
||
|
||
viewer_prev_newline:
|
||
test [ebp+viewer_data.flags], 1
|
||
jz .nohex
|
||
push 8
|
||
pop ecx
|
||
cmp [ebp+viewer_data.encoding], encodings.unicode
|
||
jz @f
|
||
add ecx, ecx
|
||
@@:
|
||
call viewer_get_prev_char
|
||
jc @f
|
||
loop @b
|
||
@@: call viewer_set_curpos
|
||
ret
|
||
.nohex:
|
||
mov eax, 8192
|
||
push eax
|
||
cdq
|
||
div [cur_width]
|
||
pop eax
|
||
sub eax, edx
|
||
mov edx, eax
|
||
call viewer_get_prev_char
|
||
jc .0
|
||
dec edx
|
||
cmp al, 0xD
|
||
jz .2
|
||
cmp al, 0xA
|
||
jnz .3
|
||
.2:
|
||
mov cl, al
|
||
call viewer_get_prev_char
|
||
jc .0
|
||
dec edx
|
||
xor cl, al
|
||
cmp cl, 0xD xor 0xA
|
||
jnz .3
|
||
@@:
|
||
call viewer_get_prev_char
|
||
jc .0
|
||
dec edx
|
||
jz .0
|
||
.3:
|
||
cmp al, 0xD
|
||
jz .1
|
||
cmp al, 0xA
|
||
jnz @b
|
||
.1:
|
||
call viewer_get_next_char
|
||
.0:
|
||
push dword [ebp+viewer_data.cur_pos+4]
|
||
push dword [ebp+viewer_data.cur_pos]
|
||
call viewer_set_curpos
|
||
@@:
|
||
push dword [ebp+viewer_data.cur_pos+4]
|
||
push dword [ebp+viewer_data.cur_pos]
|
||
call viewer_next_newline
|
||
jc .ret3
|
||
mov eax, dword [ebp+viewer_data.cur_pos]
|
||
mov edx, dword [ebp+viewer_data.cur_pos+4]
|
||
sub eax, [esp+8]
|
||
sbb edx, [esp+12]
|
||
jae .ret3
|
||
pop eax
|
||
pop eax
|
||
jmp @b
|
||
.ret3:
|
||
pop dword [ebp+viewer_data.cur_pos]
|
||
pop dword [ebp+viewer_data.cur_pos+4]
|
||
.ret:
|
||
pop eax
|
||
pop eax
|
||
jmp viewer_seek_to_current
|
||
|
||
viewer_set_keybar:
|
||
mov eax, keybar_viewer
|
||
if lang eq ru
|
||
test [ebp+viewer_data.flags], 1
|
||
jnz .hex
|
||
mov dword [eax+(4-1)*6], '<EFBFBD><EFBFBD><EFBFBD> '
|
||
mov word [eax+(4-1)*6+4], ' '
|
||
jmp @f
|
||
.hex:
|
||
mov dword [eax+(4-1)*6], '<EFBFBD><EFBFBD><EFBFBD><EFBFBD>'
|
||
mov word [eax+(4-1)*6+4], '<EFBFBD> '
|
||
@@:
|
||
test [ebp+viewer_data.flags], 2
|
||
jnz .unwrap
|
||
mov dword [eax+6], '<EFBFBD><EFBFBD><EFBFBD><EFBFBD>'
|
||
mov word [eax+6+4], '<EFBFBD><EFBFBD>'
|
||
jmp @f
|
||
.unwrap:
|
||
mov dword [eax+6], '<EFBFBD><EFBFBD><EFBFBD><EFBFBD>'
|
||
mov word [eax+6+4], '<EFBFBD> '
|
||
@@:
|
||
else
|
||
test [ebp+viewer_data.flags], 1
|
||
jnz .hex
|
||
mov dword [eax+(4-1)*6], 'Hex '
|
||
; mov word [eax+(4-1)*6+4], ' '
|
||
jmp @f
|
||
.hex:
|
||
mov dword [eax+(4-1)*6], 'Text'
|
||
; mov word [eax+(4-1)*6+4], ' '
|
||
@@:
|
||
test [ebp+viewer_data.flags], 2
|
||
jnz .unwrap
|
||
mov dword [eax+6], 'Unwr'
|
||
mov word [eax+6+4], 'ap'
|
||
jmp @f
|
||
.unwrap:
|
||
mov dword [eax+6], 'Wrap'
|
||
mov word [eax+6+4], ' '
|
||
@@:
|
||
end if
|
||
movzx esi, [ebp+viewer_data.encoding]
|
||
dec esi
|
||
jz @f
|
||
push 1
|
||
pop esi
|
||
@@:
|
||
lea esi, [encodings.names+esi*8]
|
||
lea edi, [eax+keybar_cp-keybar_viewer]
|
||
movsd
|
||
movsw
|
||
jmp draw_keybar
|
||
|
||
viewer_OnExit:
|
||
mov edx, [ebp+viewer_data.hPlugin]
|
||
test edx, edx
|
||
jz @f
|
||
and [ebp+viewer_data.hPlugin], 0
|
||
push edx ebp
|
||
push [ebp+viewer_data.hWorkFile]
|
||
call [edx+PluginInfo.close]
|
||
pop ebp edx
|
||
mov ebx, [ebp+viewer_data.hFile]
|
||
call close_handle_if_unused
|
||
@@:
|
||
ret
|
||
|
||
viewer_IsHandleUsed:
|
||
editor_IsHandleUsed:
|
||
cmp edx, [ebp+viewer_data.hPlugin]
|
||
jnz @f
|
||
cmp ebx, [ebp+viewer_data.hFile]
|
||
@@:
|
||
ret
|
||
|
||
viewer_OnKey:
|
||
mov esi, viewer_ctrlkeys
|
||
jmp process_ctrl_keys
|
||
.exit:
|
||
call viewer_OnExit
|
||
jmp delete_active_screen
|
||
.down:
|
||
cmp [ebp+viewer_data.bEofReached], 0
|
||
jnz .ret
|
||
call viewer_seek_to_current
|
||
call viewer_next_newline
|
||
jc .ret
|
||
call viewer_draw_text
|
||
ret
|
||
.pgdn:
|
||
cmp [ebp+viewer_data.bEofReached], 0
|
||
jnz .ret
|
||
call viewer_seek_to_current
|
||
mov ebx, [cur_height]
|
||
sub ebx, 3
|
||
@@:
|
||
call viewer_next_newline
|
||
jc .ret
|
||
dec ebx
|
||
jnz @b
|
||
call viewer_draw_text
|
||
ret
|
||
.up:
|
||
call viewer_seek_to_current
|
||
call viewer_prev_newline
|
||
call viewer_draw_text
|
||
ret
|
||
.pgup:
|
||
call viewer_seek_to_current
|
||
mov ebx, [cur_height]
|
||
sub ebx, 3
|
||
@@:
|
||
call viewer_prev_newline
|
||
dec ebx
|
||
jnz @b
|
||
.done_redraw:
|
||
call viewer_draw_text
|
||
.ret:
|
||
ret
|
||
.f8:
|
||
movzx esi, [ebp+viewer_data.encoding]
|
||
dec [ebp+viewer_data.encoding]
|
||
jz .done_redraw_keybar
|
||
mov [ebp+viewer_data.encoding], 1
|
||
jmp .done_redraw_keybar
|
||
.f2:
|
||
xor [ebp+viewer_data.flags], 2
|
||
.done_redraw_keybar:
|
||
call viewer_set_keybar
|
||
jmp .done_redraw
|
||
.f4:
|
||
xor [ebp+viewer_data.flags], 1
|
||
pushf
|
||
call viewer_set_keybar
|
||
popf
|
||
jnz .tohex
|
||
push 1
|
||
pop eax
|
||
cmp [ebp+viewer_data.encoding], encodings.unicode
|
||
jnz @f
|
||
add eax, eax
|
||
@@:
|
||
add dword [ebp+viewer_data.cur_pos], eax
|
||
adc dword [ebp+viewer_data.cur_pos+4], 0
|
||
call viewer_seek_to_current
|
||
call viewer_prev_newline
|
||
jmp .done_redraw
|
||
.tohex:
|
||
and byte [ebp+viewer_data.cur_pos], 0xF0
|
||
jmp .done_redraw
|
||
.home:
|
||
xor eax, eax
|
||
mov dword [ebp+viewer_data.cur_pos], eax
|
||
mov dword [ebp+viewer_data.cur_pos+4], eax
|
||
mov dword [ebp+viewer_data.col], eax
|
||
mov dword [ebp+viewer_data.col+4], eax
|
||
jmp .done_redraw
|
||
.end:
|
||
mov eax, dword [ebp+viewer_data.filesize]
|
||
mov edx, dword [ebp+viewer_data.filesize+4]
|
||
and al, 0xF0
|
||
mov dword [ebp+viewer_data.cur_pos], eax
|
||
mov dword [ebp+viewer_data.cur_pos+4], edx
|
||
and dword [ebp+viewer_data.col], 0
|
||
and dword [ebp+viewer_data.col+4], 0
|
||
jmp .done_redraw
|
||
.right:
|
||
add dword [ebp+viewer_data.col], 1
|
||
adc dword [ebp+viewer_data.col+4], 0
|
||
jnc .done_redraw
|
||
sub dword [ebp+viewer_data.col], 1
|
||
sbb dword [ebp+viewer_data.col+4], 0
|
||
ret
|
||
.left:
|
||
sub dword [ebp+viewer_data.col], 1
|
||
sbb dword [ebp+viewer_data.col+4], 0
|
||
jnc .done_redraw
|
||
add dword [ebp+viewer_data.col], 1
|
||
adc dword [ebp+viewer_data.col+4], 0
|
||
ret
|
||
.ctrl_left:
|
||
test [ebp+viewer_data.flags], 1
|
||
jnz .ctrl_left_hex
|
||
sub dword [ebp+viewer_data.col], 20
|
||
sbb dword [ebp+viewer_data.col+4], 0
|
||
jnc .done_redraw
|
||
.ctrl_shift_left:
|
||
and dword [ebp+viewer_data.col], 0
|
||
and dword [ebp+viewer_data.col+4], 0
|
||
jmp .done_redraw
|
||
.ctrl_left_hex:
|
||
call viewer_seek_to_current
|
||
call viewer_get_prev_char
|
||
jc @f
|
||
call viewer_set_curpos
|
||
jmp .done_redraw
|
||
.ctrl_right:
|
||
test [ebp+viewer_data.flags], 1
|
||
jnz .ctrl_right_hex
|
||
add dword [ebp+viewer_data.col], 20
|
||
adc dword [ebp+viewer_data.col+4], 0
|
||
jnc .done_redraw
|
||
sub dword [ebp+viewer_data.col], 20
|
||
sbb dword [ebp+viewer_data.col+4], 0
|
||
@@: ret
|
||
.ctrl_right_hex:
|
||
call viewer_seek_to_current
|
||
call viewer_get_next_char
|
||
call viewer_set_curpos
|
||
jmp .done_redraw
|
||
.ctrl_shift_right:
|
||
test [ebp+viewer_data.flags], 1
|
||
jnz @b
|
||
mov eax, dword [viewer_right_side]
|
||
mov edx, dword [viewer_right_side+4]
|
||
sub eax, [cur_width]
|
||
sbb edx, 0
|
||
jnc @f
|
||
xor eax, eax
|
||
xor edx, edx
|
||
@@:
|
||
mov dword [ebp+viewer_data.col], eax
|
||
mov dword [ebp+viewer_data.col+4], edx
|
||
jmp .done_redraw
|
||
.shift_f8:
|
||
mov ecx, encodings.menu.1
|
||
mov al, [ebp+viewer_data.encoding]
|
||
@@:
|
||
cmp byte [ecx-1], al
|
||
jz @f
|
||
mov ecx, [ecx]
|
||
jmp @b
|
||
@@:
|
||
push 1
|
||
push aTables
|
||
push ecx
|
||
call menu
|
||
cmp eax, -1
|
||
jz .ret
|
||
mov al, [eax-1]
|
||
mov [ebp+viewer_data.encoding], al
|
||
cmp al, encodings.unicode
|
||
jnz .done_redraw_keybar
|
||
add dword [ebp+viewer_data.cur_pos], 1
|
||
adc dword [ebp+viewer_data.cur_pos+4], 0
|
||
and dword [ebp+viewer_data.cur_pos], not 1
|
||
jmp .done_redraw_keybar
|
||
.f7:
|
||
call viewer_clear_selection
|
||
call find_in_file_dlg
|
||
jz .shift_f7
|
||
.ret2:
|
||
ret
|
||
.shift_f7:
|
||
; search string SearchString in file starting from current position
|
||
cmp byte [SearchString], 0
|
||
jz .ret2
|
||
mov eax, dword [ebp+viewer_data.selected_start]
|
||
mov edx, dword [ebp+viewer_data.selected_start+4]
|
||
inc eax
|
||
jnz @f
|
||
inc edx
|
||
@@:
|
||
cmp dword [ebp+viewer_data.selected_len], 0
|
||
jnz @f
|
||
cmp dword [ebp+viewer_data.selected_len+4], 0
|
||
jnz @f
|
||
mov eax, dword [ebp+viewer_data.cur_pos]
|
||
mov edx, dword [ebp+viewer_data.cur_pos+4]
|
||
@@:
|
||
call viewer_clear_selection
|
||
call viewer_seek
|
||
call viewer_skip_unicode_marker
|
||
mov esi, tolower_table
|
||
test [find_in_file_dlgdata.flags_case], 10h
|
||
jz @f
|
||
mov esi, identical_table
|
||
@@:
|
||
mov ebx, SearchString
|
||
test [find_in_file_dlgdata.flags_whole], 10h
|
||
setnz al
|
||
push eax
|
||
push dword [ebp+viewer_data.encoding]
|
||
call search_string_pre
|
||
mov esi, [ebp+viewer_data.buf_pos]
|
||
lea ebx, [ebp+viewer_data.buf]
|
||
add ebx, [ebp+viewer_data.buf_size]
|
||
mov edi, edx
|
||
cmp esi, ebx
|
||
jb @f
|
||
sub ebx, ebp
|
||
cmp ebx, viewer_data.buf + 16384
|
||
jnz .f7.notfound
|
||
pusha
|
||
call viewer_load_next
|
||
popa
|
||
jz .f7.notfound
|
||
mov esi, [ebp+viewer_data.buf_pos]
|
||
lea ebx, [ebp+viewer_data.buf]
|
||
add ebx, [ebp+viewer_data.buf_size]
|
||
@@:
|
||
test [find_in_file_dlgdata.flags_whole], 10h
|
||
jz .search_loop
|
||
cmp dword [ebp+viewer_data.buf_start], 0
|
||
jnz @f
|
||
cmp dword [ebp+viewer_data.buf_start+4], 0
|
||
jnz @f
|
||
lea eax, [ebp+viewer_data.buf]
|
||
cmp [ebp+viewer_data.buf_pos], eax
|
||
jz .f7.startspace
|
||
@@:
|
||
xor eax, eax
|
||
call viewer_get_prev_char
|
||
inc esi
|
||
cmp [isspace_table+eax], 0
|
||
jz .search_loop
|
||
.f7.startspace:
|
||
add edi, 256
|
||
.search_loop:
|
||
; edx -> FSM, ecx = last state, edi = current state,
|
||
; esi = buf_pos, ebx = end of buffer
|
||
; get current symbol
|
||
movzx eax, byte [esi]
|
||
; calculate next state
|
||
movzx edi, byte [edi+eax]
|
||
; done?
|
||
cmp edi, ecx
|
||
jz .f7.found
|
||
.search_loop_next:
|
||
; no; proceed to next symbol
|
||
shl edi, 8
|
||
add esi, 1
|
||
add edi, edx
|
||
cmp esi, ebx
|
||
jb .search_loop
|
||
sub ebx, ebp
|
||
cmp ebx, viewer_data.buf + 16384
|
||
jnz .f7.notfound
|
||
mov [ebp+viewer_data.buf_pos], esi
|
||
pusha
|
||
call viewer_load_next
|
||
popa
|
||
jz .f7.notfoundt
|
||
mov esi, [ebp+viewer_data.buf_pos]
|
||
lea ebx, [ebp+viewer_data.buf]
|
||
add ebx, [ebp+viewer_data.buf_size]
|
||
jmp .search_loop
|
||
.f7.notfoundt:
|
||
; last chance - if we are looking for a whole word, EOF is ok for last symbol
|
||
test [find_in_file_dlgdata.flags_whole], 10h
|
||
jz .f7.notfound
|
||
movzx edi, byte [edi+' ']
|
||
inc esi
|
||
cmp edi, ecx
|
||
jz .f7.found
|
||
.f7.notfound:
|
||
call search_failed
|
||
jmp .done_redraw
|
||
.f7.found:
|
||
push ecx
|
||
mov ecx, edx
|
||
call pgfree
|
||
mov [ebp+viewer_data.buf_pos], esi
|
||
call viewer_set_curpos
|
||
pop ecx
|
||
mov dword [ebp+viewer_data.selected_len], ecx
|
||
and dword [ebp+viewer_data.selected_len+4], 0
|
||
dec ecx
|
||
sub eax, ecx
|
||
sbb edx, 0
|
||
mov dword [ebp+viewer_data.selected_start], eax
|
||
mov dword [ebp+viewer_data.selected_start+4], edx
|
||
inc eax
|
||
jnz @f
|
||
inc edx
|
||
@@:
|
||
test [find_in_file_dlgdata.flags_whole], 10h
|
||
jz @f
|
||
sub dword [ebp+viewer_data.selected_len], 2
|
||
sbb dword [ebp+viewer_data.selected_len+4], 0
|
||
mov dword [ebp+viewer_data.selected_start], eax
|
||
mov dword [ebp+viewer_data.selected_start+4], edx
|
||
inc eax
|
||
jnz @f
|
||
inc edx
|
||
@@:
|
||
mov dword [ebp+viewer_data.cur_pos], eax
|
||
mov dword [ebp+viewer_data.cur_pos+4], edx
|
||
call viewer_seek
|
||
call viewer_prev_newline
|
||
jmp .done_redraw
|
||
|
||
search_failed:
|
||
mov ecx, edx
|
||
call pgfree
|
||
mov eax, SearchString-1
|
||
push dword [eax-3]
|
||
push eax
|
||
mov byte [eax], '"'
|
||
@@:
|
||
inc eax
|
||
cmp byte [eax], 0
|
||
jnz @b
|
||
mov word [eax], '"'
|
||
xchg eax, [esp]
|
||
push eax
|
||
push aStringNotFound
|
||
mov eax, esp
|
||
push ContinueBtn
|
||
push 1
|
||
push eax
|
||
push 2
|
||
push aSearch
|
||
call SayErrTitle
|
||
pop eax
|
||
pop eax
|
||
pop ecx
|
||
mov byte [ecx], 0
|
||
pop dword [eax-3]
|
||
ret
|
||
|
||
viewer_getname:
|
||
if lang eq ru
|
||
mov eax, '<EFBFBD><EFBFBD><EFBFBD><EFBFBD>'
|
||
stosd
|
||
mov eax, '<EFBFBD><EFBFBD><EFBFBD><EFBFBD>'
|
||
stosd
|
||
mov eax, ' '
|
||
stosd
|
||
stosb
|
||
else
|
||
mov eax, 'View'
|
||
stosd
|
||
mov eax, ' '
|
||
stosd
|
||
stosd
|
||
stosb
|
||
end if
|
||
jmp viewedit_getname
|
||
editor_getname:
|
||
if lang eq ru
|
||
mov eax, '<EFBFBD><EFBFBD><EFBFBD><EFBFBD>'
|
||
stosd
|
||
mov eax, '<EFBFBD><EFBFBD><EFBFBD><EFBFBD>'
|
||
stosd
|
||
mov eax, ' '
|
||
stosd
|
||
stosb
|
||
else
|
||
mov eax, 'Edit'
|
||
stosd
|
||
mov eax, ' '
|
||
stosd
|
||
stosd
|
||
stosb
|
||
end if
|
||
viewedit_getname:
|
||
sub ecx, 13
|
||
cmp [ebp+viewer_data.hPlugin], 0
|
||
jz .native
|
||
lea esi, [ebp+viewer_data.hostname]
|
||
push ecx edi
|
||
shr ecx, 1
|
||
@@:
|
||
lodsb
|
||
test al, al
|
||
jz @f
|
||
stosb
|
||
loop @b
|
||
@@:
|
||
sub edi, [esp]
|
||
sub [esp+4], edi
|
||
add [esp], edi
|
||
pop edi ecx
|
||
lea esi, [ebp+viewer_data.filename]
|
||
jmp .main
|
||
.native:
|
||
lea esi, [ebp+viewer_data.filename]
|
||
push 3
|
||
pop edx
|
||
@@:
|
||
lodsb
|
||
stosb
|
||
dec ecx
|
||
test al, al
|
||
jz .ret
|
||
cmp al, '/'
|
||
jnz @b
|
||
dec edx
|
||
jnz @b
|
||
.main:
|
||
push esi
|
||
@@:
|
||
lodsb
|
||
test al, al
|
||
jnz @b
|
||
sub esi, [esp]
|
||
dec esi
|
||
cmp esi, ecx
|
||
jbe @f
|
||
mov al, '.'
|
||
stosb
|
||
stosb
|
||
stosb
|
||
sub ecx, 3
|
||
sub esi, ecx
|
||
add [esp], esi
|
||
@@:
|
||
pop esi
|
||
@@:
|
||
lodsb
|
||
stosb
|
||
test al, al
|
||
jnz @b
|
||
.ret:
|
||
ret
|