KFar 0.6: search capabilities

git-svn-id: svn://kolibrios.org@997 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Evgeny Grechnikov (Diamond) 2009-01-20 15:03:05 +00:00
parent f7e7dc15e2
commit 77889c54ce
7 changed files with 2545 additions and 89 deletions

View File

@ -40,6 +40,7 @@ GenericBox:
pushad pushad
; message loop ; message loop
.event: .event:
; call get_event
push 10 push 10
pop eax pop eax
int 40h int 40h
@ -264,6 +265,16 @@ ShowGenericBox:
; draw shadow ; draw shadow
test byte [ebx+dlgtemplate.flags], 4 test byte [ebx+dlgtemplate.flags], 4
jnz .noshadow jnz .noshadow
call draw_dialog_shadow
.noshadow:
popad
push dword [esp+8]
push dword [esp+8]
call DrawGenericBox
xor eax, eax
ret 8
draw_dialog_shadow:
mov eax, [ebx+dlgtemplate.x] mov eax, [ebx+dlgtemplate.x]
sub eax, [ebx+dlgtemplate.border_size_x] sub eax, [ebx+dlgtemplate.border_size_x]
ja @f ja @f
@ -316,13 +327,7 @@ ShowGenericBox:
add edi, [cur_width] add edi, [cur_width]
dec edx dec edx
jnz .shadow_loop jnz .shadow_loop
.noshadow: ret
popad
push dword [esp+8]
push dword [esp+8]
call DrawGenericBox
xor eax, eax
ret 8
; void __stdcall DrawGenericBox(DLGDATA* dlg, void* DlgProc) ; void __stdcall DrawGenericBox(DLGDATA* dlg, void* DlgProc)
DrawGenericBox: DrawGenericBox:
@ -648,9 +653,9 @@ menu_centered_in:
xor ecx, ecx xor ecx, ecx
mov esi, [esp+20h+20] mov esi, [esp+20h+20]
mov [ebx+40], esi mov [ebx+40], esi
and dword [ebx+56], 0 mov dword [ebx+56], eax
@@: @@:
cmp dword [esi+4], 0 cmp dword [esi+4], eax
jz .find_width jz .find_width
mov esi, [esi+4] mov esi, [esi+4]
inc dword [ebx+56] inc dword [ebx+56]
@ -1103,6 +1108,9 @@ dlgitemtemplate:
; 1 = áâ â¨ç¥áª¨© ⥪áâ ; 1 = áâ â¨ç¥áª¨© ⥪áâ
; 2 = ª­®¯ª  ; 2 = ª­®¯ª 
; 3 = ¯®«¥ । ªâ¨à®¢ ­¨ï ; 3 = ¯®«¥ । ªâ¨à®¢ ­¨ï
; 4 = £®à¨§®­â «ì­ë© à §¤¥«¨â¥«ì
; 5 = ä« ¦®ª
; 6 = ᯨ᮪
.type dd ? .type dd ?
.x1 dd ? .x1 dd ?
.y1 dd ? .y1 dd ?
@ -1110,9 +1118,14 @@ dlgitemtemplate:
.y2 dd ? .y2 dd ?
; „ ­­ë¥: ; „ ­­ë¥:
; ¤«ï ⥪áâ : const char* data - ASCIIZ-áâப  ; ¤«ï ⥪áâ : const char* data - ASCIIZ-áâப 
; ¤«ï ª­®¯ª¨: const char* data - § £®«®¢®ª ; ¤«ï ª­®¯ª¨ ¨ ä« ¦ª : const char* data - § £®«®¢®ª
; ¤«ï । ªâ®à : struct {unsigned maxlength; unsigned pos; unsigned start; ; ¤«ï । ªâ®à : struct {unsigned maxlength; unsigned pos; unsigned start;
; char data[maxlength+1];}* data; ; char data[maxlength+1];}* data;
; ¤«ï ᯨ᪠: struct {listitem* curitemptr; unsigned numitems;
; listitem *head; unsigned curitem;}* data;
; head = 㪠§ â¥«ì ­  ¯¥à¢ë© ®â®¡à ¦ ¥¬ë© í«¥¬¥­â,
; curitemptr = 㪠§ â¥«ì ­  ¢ë¤¥«¥­­ë© í«¥¬¥­â, curitem = ¥£® ¨­¤¥ªá ¢ ᯨ᪥ (®â 0)
; (£¤¥ struct listitem {listitem* next; listitem* prev; char text[];};)
.data dd ? .data dd ?
.flags dd ? .flags dd ?
; ”« £¨: ; ”« £¨:
@ -1123,6 +1136,7 @@ dlgitemtemplate:
; 8 = í«¥¬¥­â ¬®¦¥â ¨¬¥âì 䮪ãá ¢¢®¤  ; 8 = í«¥¬¥­â ¬®¦¥â ¨¬¥âì 䮪ãá ¢¢®¤ 
; 10h: ¤«ï ª­®¯ª¨ = ª­®¯ª  ¯® 㬮«ç ­¨î (Enter ­  ­¥-ª­®¯ª¥) ; 10h: ¤«ï ª­®¯ª¨ = ª­®¯ª  ¯® 㬮«ç ­¨î (Enter ­  ­¥-ª­®¯ª¥)
; ¤«ï ¯®«ï ¢¢®¤  = ¤ ­­ë¥ ¡ë«¨ ¬®¤¨ä¨æ¨à®¢ ­ë ; ¤«ï ¯®«ï ¢¢®¤  = ¤ ­­ë¥ ¡ë«¨ ¬®¤¨ä¨æ¨à®¢ ­ë
; ¤«ï ä« ¦ª  = ä« ¦®ª ãáâ ­®¢«¥­
; 20h: ¤«ï ¯®«ï ¢¢®¤  = ­¥ ®â®¡à ¦ âì ¢¢®¤¨¬ë¥ ¤ ­­ë¥ (¯®ª §ë¢ âì '*') ; 20h: ¤«ï ¯®«ï ¢¢®¤  = ­¥ ®â®¡à ¦ âì ¢¢®¤¨¬ë¥ ¤ ­­ë¥ (¯®ª §ë¢ âì '*')
.size = $ .size = $
end virtual end virtual
@ -1191,10 +1205,17 @@ ManagerDlgProc:
jz .up jz .up
cmp al, 0x50 cmp al, 0x50
jz .down jz .down
jecxz @f jecxz .nobtns2
cmp [ebx+dlgitemtemplate.type], 3 cmp [ebx+dlgitemtemplate.type], 3
jz .key_edit jz .key_edit
cmp [ebx+dlgitemtemplate.type], 5
jnz @f
cmp al, 0x39
jnz @f
xor [ebx+dlgitemtemplate.flags], 10h
jmp .ret_draw
@@: @@:
.nobtns2:
cmp al, 0x4B cmp al, 0x4B
jz .left jz .left
cmp al, 0x4D cmp al, 0x4D
@ -1386,19 +1407,9 @@ ManagerDlgProc:
.draw_loop: .draw_loop:
push ecx push ecx
mov eax, [ebx+dlgitemtemplate.type] mov eax, [ebx+dlgitemtemplate.type]
dec eax cmp eax, draw_functions_num
jz .draw_text jae .draw_loop_continue
dec eax call [draw_functions + eax*4]
jz .draw_button
dec eax
jnz .draw_loop_continue
call draw_editbox
jmp .draw_loop_continue
.draw_button:
call draw_button
jmp .draw_loop_continue
.draw_text:
call draw_static_text
.draw_loop_continue: .draw_loop_continue:
pop ecx pop ecx
add ebx, dlgitemtemplate.size add ebx, dlgitemtemplate.size
@ -1406,6 +1417,19 @@ ManagerDlgProc:
.done_draw: .done_draw:
ret ret
iglobal
align 4
label draw_functions dword
dd ManagerDlgProc.done_draw
dd draw_static_text
dd draw_button
dd draw_editbox
dd draw_h_separator
dd draw_checkbox
dd draw_listbox
draw_functions_num = ($ - draw_functions) / 4
endg
draw_static_text: draw_static_text:
; à¨á㥬 áâ â¨ç¥áª¨© ⥪áâ ; à¨á㥬 áâ â¨ç¥áª¨© ⥪áâ
mov ah, [dialog_main_color] mov ah, [dialog_main_color]
@ -1417,7 +1441,8 @@ draw_text:
mov esi, [ebx+dlgitemtemplate.data] mov esi, [ebx+dlgitemtemplate.data]
draw_text_esi: draw_text_esi:
test esi, esi test esi, esi
jz .ret jz .ret2
push eax
push -1 push -1
pop ecx pop ecx
@@: @@:
@ -1425,7 +1450,6 @@ draw_text_esi:
cmp byte [ecx+esi], 0 cmp byte [ecx+esi], 0
jnz @b jnz @b
; ¢ ecx ¤«¨­  áâப¨ ; ¢ ecx ¤«¨­  áâப¨
push eax
xor eax, eax xor eax, eax
mov edx, [ebx+dlgitemtemplate.x2] mov edx, [ebx+dlgitemtemplate.x2]
sub edx, [ebx+dlgitemtemplate.x1] sub edx, [ebx+dlgitemtemplate.x1]
@ -1451,12 +1475,8 @@ draw_text_esi:
.text_draw: .text_draw:
push ecx push ecx
push eax push eax
mov eax, [ebx+dlgitemtemplate.x1]
add eax, [ebp+dlgtemplate.x]
push edx push edx
mov edx, [ebx+dlgitemtemplate.y1] call dlgitem_get_console_ptr
add edx, [ebp+dlgtemplate.y]
call get_console_ptr
pop edx pop edx
pop ecx pop ecx
mov ah, [esp+5] mov ah, [esp+5]
@ -1508,6 +1528,7 @@ draw_text_esi:
pop eax pop eax
mov al, ' ' mov al, ' '
rep stosw rep stosw
.ret2:
ret ret
draw_button: draw_button:
@ -1551,6 +1572,310 @@ draw_editbox:
add esi, 12 add esi, 12
jmp draw_text_esi jmp draw_text_esi
dlgitem_get_console_ptr:
mov eax, [ebx+dlgitemtemplate.x1]
mov edx, [ebx+dlgitemtemplate.y1]
mov ecx, eax
add eax, [ebp+dlgtemplate.x]
add edx, [ebp+dlgtemplate.y]
jmp get_console_ptr
draw_h_separator:
; à¨á㥬 £®à¨§®­â «ì­ë© à §¤¥«¨â¥«ì
call dlgitem_get_console_ptr
.scan:
mov al, 0xC7
test ecx, ecx
js @f
mov al, 0xB6
cmp ecx, [ebp+dlgtemplate.width]
jz @f
mov al, 0xC4
@@:
stosb
jz .done
inc ecx
inc edi
cmp ecx, [ebx+dlgitemtemplate.x2]
jb .scan
.done:
ret
draw_checkbox:
; à¨á㥬 ä« ¦®ª
call dlgitem_get_console_ptr
test byte [ebx+dlgitemtemplate.flags], 4
jz @f
inc eax
mov [cursor_x], eax
mov [cursor_y], edx
@@:
mov ah, [dialog_main_color]
test byte [ebp+dlgtemplate.flags], 2
jz @f
mov ah, [warning_main_color]
@@:
mov al, '['
stosw
mov al, 'x'
test byte [ebx+dlgitemtemplate.flags], 10h
jnz @f
mov al, ' '
@@:
stosw
mov al, ']'
stosw
mov al, ' '
stosw
mov ecx, [ebx+dlgitemtemplate.x2]
sub ecx, [ebx+dlgitemtemplate.x1]
jb .ret
sub ecx, 3
jbe .ret
mov esi, [ebx+dlgitemtemplate.data]
@@:
lodsb
test al, al
jz .ret
stosw
loop @b
.ret:
ret
draw_listbox:
; à¨á㥬 ᯨ᮪
call dlgitem_get_console_ptr
mov edx, [ebx+dlgitemtemplate.data]
mov esi, [edx+8]
mov eax, [ebx+dlgitemtemplate.y2]
sub eax, [ebx+dlgitemtemplate.y1]
push eax
push eax
.0:
test esi, esi
jz .listdone
push esi edi
push edx
or edx, -1
mov ecx, [ebx+dlgitemtemplate.x2]
sub ecx, [ebx+dlgitemtemplate.x1]
inc ecx
xor eax, eax
@@:
inc edx
cmp byte [esi+8+edx], al
jnz @b
@@:
cmp ecx, edx
jae .text_draw
mov al, byte [ebx+dlgitemtemplate.flags]
and al, 3
jz .text_align_left
cmp al, 1
jz .text_align_center
; ⥪áâ ¢ë஢­¥­ ¢¯à ¢®
mov eax, edx
sub eax, ecx
jmp .text_draw
.text_align_center:
mov eax, edx
sub eax, ecx
shr eax, 1
jmp .text_draw
.text_align_left:
; xor eax, eax
.text_draw:
pop edx
cmp esi, [edx]
lea esi, [esi+8+eax]
mov ah, [dialog_selected_list_color]
jz @f
mov ah, [dialog_list_color]
@@:
jecxz .next
@@:
lodsb
test al, al
jz @f
stosw
loop @b
@@:
mov al, ' '
rep stosw
.next:
pop edi esi
add edi, [cur_width]
add edi, [cur_width]
mov esi, [esi]
dec dword [esp]
jns .0
.listdone:
pop eax
; ‹¨­¥©ª  ¯à®ªàã⪨
pop ecx
inc ecx
mov esi, [edx+4]
cmp ecx, esi
jae .noscrollbar
sub ecx, 2
jbe .noscrollbar
mov eax, [edx+12]
mul ecx
div esi
push eax
mov eax, [ebx+dlgitemtemplate.x2]
add eax, [ebp+dlgtemplate.x]
mov edx, [ebx+dlgitemtemplate.y1]
add edx, [ebp+dlgtemplate.y]
call get_console_ptr
pop edx
inc edx
mov al, 0x1E
mov ah, [dialog_scroll_list_color]
mov [edi], ax
add edi, [cur_width]
add edi, [cur_width]
.2:
mov al, 0xB1
dec edx
jz @f
mov al, 0xB0
@@:
mov [edi], ax
add edi, [cur_width]
add edi, [cur_width]
loop .2
mov al, 0x1F
stosw
.noscrollbar:
ret
listbox_key:
mov edx, [ebx+dlgitemtemplate.data]
cmp al, 0x48
jz .prev
cmp al, 0x50
jz .next
cmp al, 0x47
jz .home
cmp al, 0x4F
jz .end
cmp al, 0x51
jz .pgdn
cmp al, 0x49
jz .pgup
ret
.next:
call .calc_last_line
mov eax, [edx]
cmp dword [eax], 0
jz @f
call .line_next
@@:
mov [edx], eax
ret
.pgdn:
call .calc_last_line
mov eax, [edx]
mov ecx, [ebx+dlgitemtemplate.y2]
sub ecx, [ebx+dlgitemtemplate.y1]
.pgdnl:
cmp dword [eax], 0
jz @f
call .line_next
loop .pgdnl
@@:
mov [edx], eax
ret
.prev:
mov eax, [edx]
cmp dword [eax+4], 0
jz @f
call .line_prev
@@:
mov [edx], eax
ret
.pgup:
mov eax, [edx]
mov ecx, [ebx+dlgitemtemplate.y2]
sub ecx, [ebx+dlgitemtemplate.y1]
; inc ecx
.pgupl:
cmp dword [eax+4], 0
jz @f
call .line_prev
loop .pgupl
@@:
mov [edx], eax
ret
.home:
mov eax, [edx]
@@:
cmp dword [eax+4], 0
jz @f
mov eax, [eax+4]
jmp @b
@@:
mov [edx], eax
mov [edx+8], eax
and dword [edx+12], 0
ret
.end:
mov eax, [edx]
@@:
cmp dword [eax], 0
jz @f
mov eax, [eax]
jmp @b
@@:
mov [edx], eax
mov ecx, [ebx+dlgitemtemplate.y2]
sub ecx, [ebx+dlgitemtemplate.y1]
jz .e1
.e2:
mov eax, [eax+4]
loop .e2
.e1:
mov [edx+8], eax
mov eax, [edx+4]
dec eax
mov [edx+12], eax
ret
.line_prev:
cmp eax, [edx+8]
mov eax, [eax+4]
jnz @f
mov [edx+8], eax
@@:
dec dword [edx+12]
ret
.calc_last_line:
mov esi, [edx+8]
mov ecx, [ebx+dlgitemtemplate.y2]
sub ecx, [ebx+dlgitemtemplate.y1]
jz .clldone
@@:
mov esi, [esi]
test esi, esi
jz @f
loop @b
.clldone:
ret
.line_next:
cmp eax, esi
mov eax, [eax]
jnz @f
push eax
mov eax, [edx+8]
mov eax, [eax]
mov [edx+8], eax
pop eax
mov esi, eax
@@:
inc dword [edx+12]
ret
; void __stdcall SayNoMem(void); ; void __stdcall SayNoMem(void);
SayNoMem: SayNoMem:
or dword [nomem_dlgdata+4], -1 or dword [nomem_dlgdata+4], -1
@ -1559,6 +1884,18 @@ SayNoMem:
call DialogBox call DialogBox
ret ret
; int __stdcall ConfirmCancel(void);
; return value: 0 = the user is sure, nonzero = the user wants to continue
ConfirmCancel:
push YesOrNoBtn
push 2
push ConfirmCancelMsg
push 1
push aCancelled
call SayErrTitle
test eax, eax
ret
; int __stdcall SayErr(int num_strings, const char* strings[], ; int __stdcall SayErr(int num_strings, const char* strings[],
; int num_buttons, const char* buttons[]); ; int num_buttons, const char* buttons[]);
SayErr: SayErr:

View File

@ -123,7 +123,7 @@ edit_file:
mov [ebp + editor_data.memsize], ebx mov [ebp + editor_data.memsize], ebx
mov al, [EditEOLStyle] mov al, [EditEOLStyle]
mov [ebp + editor_data.eol], al mov [ebp + editor_data.eol], al
mov eax, [esi + panel1_hPlugin - panel1_data] mov eax, dword [esi + panel1_hPlugin - panel1_dir]
mov [ebp + editor_data.hPlugin], eax mov [ebp + editor_data.hPlugin], eax
test eax, eax test eax, eax
jz .nocopyhostname jz .nocopyhostname
@ -196,6 +196,7 @@ edit_file:
push dword [ebx+21] push dword [ebx+21]
push [ebp + editor_data.hFile] push [ebp + editor_data.hFile]
call [edx + PluginInfo.open] call [edx + PluginInfo.open]
mov [esp+1Ch], eax
popad popad
test eax, eax test eax, eax
jz ..openerr_in_screen jz ..openerr_in_screen
@ -210,6 +211,7 @@ edit_file:
push [readinfo.data] push [readinfo.data]
push ebx push ebx
call [edx + PluginInfo.read] call [edx + PluginInfo.read]
mov [esp+1Ch], eax
popad popad
cmp eax, -1 cmp eax, -1
jnz .readok jnz .readok
@ -259,7 +261,7 @@ edit_file:
jnz .readdone jnz .readdone
@@: @@:
push eax ebx push eax ebx
mov ebx, [ebx+16] mov ebx, [readinfo.data]
.loadloop: .loadloop:
mov ecx, [EditBlockSize] mov ecx, [EditBlockSize]
cmp eax, ecx cmp eax, ecx
@ -1977,7 +1979,7 @@ editor_OnKey:
.left: .left:
call editor_cursor_left call editor_cursor_left
jc .redraw_status jnc .redraw_status
jmp editor_draw_text jmp editor_draw_text
.ret3: .ret3:
ret ret
@ -2156,6 +2158,204 @@ editor_OnKey:
.del1: .del1:
jmp editor_draw_text jmp editor_draw_text
.f7:
call find_in_file_dlg
jz .shift_f7
.f7.ret:
ret
.shift_f7:
; search string SearchString in file starting from current cursor position
mov ebx, SearchString
xor eax, eax
cmp byte [ebx], al
jz .f7.ret
mov esi, tolower_table
test [find_in_file_dlgdata.flags_case], 10h
jz @f
mov esi, identical_table
@@:
test [find_in_file_dlgdata.flags_whole], 10h
setnz al
push eax
push dword [ebp+editor_data.encoding]; always cp866 for now
; needs to be revisited after Unicode support in editor
call search_string_pre
mov esi, [ebp + editor_data.cur_block]
add esi, ebp
mov ebx, [ebp + editor_data.cur_offs]
call editor_normalize_offs
jnc .f7.notfound
xor edi, edi
push ebx esi
push edi
push edi
test [find_in_file_dlgdata.flags_whole], 10h
jnz @f
movzx eax, byte [esi+ebx]
jmp .search_loop_next
@@:
mov edi, edx
.search_loop:
; edx -> FSM, ecx = last state, esi:ebx -> current data,
; edi = current state
; [esp] = row, [esp+4] = delta in lines
; get current symbol
movzx eax, byte [esi+ebx]
; calculate next state
movzx edi, byte [edi+eax]
; done?
cmp edi, ecx
jz .f7.found
.search_loop_next:
; no; proceed to next symbol
add ebx, 1
shl edi, 8
add dword [esp], 1
add edi, edx
cmp ebx, [esi + edit_block_header.limit]
jae .f7.nextblock
.f7.nonextblock:
cmp al, 10
jz .f7.newline
cmp al, 13
jnz .search_loop
cmp byte [esi+ebx], 10
jnz .f7.newline
call editor_step_forward
jnc .f7.notfound_pop
.f7.newline:
mov dword [esp], 0
add dword [esp+4], 1
mov dword [esp+8], esi
mov dword [esp+12], ebx
jmp .search_loop
.f7.nextblock:
call editor_normalize_offs
jc .f7.nonextblock
.f7.notfound_pop:
; 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 @f
mov esi, [ebp + editor_data.last_block]
add esi, ebp
mov ebx, [esi + edit_block_header.limit]
movzx edi, byte [edi+' ']
cmp edi, ecx
jz .f7.found
@@:
add esp, 10h
.f7.notfound:
jmp search_failed
.f7.found:
or [ebp + editor_data.cur_delta], -1
sub ebx, ecx
inc ebx
test [find_in_file_dlgdata.flags_whole], 10h
jz @f
inc ebx
@@:
cmp ebx, [EditBlockStart]
jge @f
sub ebx, [EditBlockStart]
mov esi, [esi + edit_block_header.prev]
add esi, ebp
add ebx, [esi + edit_block_header.limit]
jmp @b
@@:
sub esi, ebp
mov [ebp + editor_data.cur_block], esi
add esi, ebp
mov [ebp + editor_data.cur_offs], ebx
push ecx
mov ecx, edx
call pgfree
pop ecx
pop eax
pop edi
; esi:ebx -> last symbol of match, eax = row, edi = delta in lines
pop esi ebx
test [find_in_file_dlgdata.flags_whole], 10h
jz @f
dec ecx
@@:
push ebx esi
sub eax, ecx
lea edx, [eax+1]
mov eax, [ebp + editor_data.curcol]
add eax, [ebp + editor_data.cursor_x]
test edi, edi
jz @f
xor eax, eax
@@:
test edx, edx
jz .f7.foundpos1
.f7.findpos1:
cmp byte [ebx+esi], 9
jz .f7.findpos1.tab
inc eax
call editor_step_forward
dec edx
jnz .f7.findpos1
jmp .f7.foundpos1
.f7.findpos1.tab:
push edx eax
xor edx, edx
div [editor_tabsize]
pop eax
sub edx, [editor_tabsize]
sub eax, edx
call editor_step_forward
pop edx
dec edx
jnz .f7.findpos1
.f7.foundpos1:
pop esi ebx
push eax
cmp eax, [ebp + editor_data.curcol]
jb .f7.scrollleft
sub eax, [ebp + editor_data.curcol]
sub eax, [cur_width]
jb .f7.xset
inc eax
inc edx
add [ebp + editor_data.curcol], eax
jmp .f7.xset
.f7.scrollleft:
inc edx
mov [ebp + editor_data.curcol], eax
.f7.xset:
pop eax
push edx
sub eax, [ebp + editor_data.curcol]
mov [ebp + editor_data.cursor_x], eax
mov [cursor_x], eax
add edi, [ebp + editor_data.cursor_y]
push edi
inc edi
cmp edi, [cur_height]
pop edi
jae .f7.newview
mov [ebp + editor_data.cursor_y], edi
mov [cursor_y], edi
jmp .f7.yset
.f7.newview:
dec edi
mov [ebp + editor_data.linedata_start + editor_line.block], esi
mov [ebp + editor_data.linedata_start + editor_line.offs], bx
add [ebp + editor_data.curline], edi
xor eax, eax
inc eax
mov [ebp + editor_data.cursor_y], eax
mov [cursor_y], eax
call editor_init_lines
call editor_test_cursor_y
inc dword [esp]
.f7.yset:
pop eax
test eax, eax
jz .redraw_status
jmp editor_draw_text
editor_cursor_left: editor_cursor_left:
cmp [ebp + editor_data.cur_delta], -1 cmp [ebp + editor_data.cur_delta], -1
jz .in_text jz .in_text
@ -2292,3 +2492,31 @@ editor_OnExit:
call close_handle_if_unused call close_handle_if_unused
@@: @@:
ret ret
find_in_file_dlg:
mov ebx, find_in_file_dlgdata
mov eax, [cur_width]
sub eax, 12
mov [ebx + dlgtemplate.width], eax
dec eax
dec eax
mov [ebx - find_in_file_dlgdata + find_in_file_dlgdata.width2], eax
shr eax, 1
dec eax
dec eax
mov [ebx - find_in_file_dlgdata + find_in_file_dlgdata.search_x2], eax
sub eax, aSearchBLength-1
mov [ebx - find_in_file_dlgdata + find_in_file_dlgdata.search_x1], eax
add eax, aSearchBLength+3
mov [ebx - find_in_file_dlgdata + find_in_file_dlgdata.cnl_x1], eax
add eax, aCancelBLength - 1
mov [ebx - find_in_file_dlgdata + find_in_file_dlgdata.cnl_x2], eax
mov byte [ebx - find_in_file_dlgdata + find_in_file_dlgdata.flags0], 0xC
and byte [ebx - find_in_file_dlgdata + find_in_file_dlgdata.flags1], not 4
and byte [ebx - find_in_file_dlgdata + find_in_file_dlgdata.flags2], not 4
and byte [ebx - find_in_file_dlgdata + find_in_file_dlgdata.flags_case], not 4
and byte [ebx - find_in_file_dlgdata + find_in_file_dlgdata.flags_whole], not 4
push ebx
call DialogBox
cmp eax, find_in_file_dlgdata.search_btn
ret

File diff suppressed because it is too large Load Diff

View File

@ -7,8 +7,8 @@ memsize dd mem
dd stacktop dd stacktop
dd 0, app_path dd 0, app_path
version equ '0.5' version equ '0.6'
version_dword equ 0*10000h + 50 version_dword equ 0*10000h + 60
min_width = 54 min_width = 54
max_width = 255 max_width = 255
@ -20,6 +20,7 @@ include 'font.inc'
include 'sort.inc' include 'sort.inc'
include 'kglobals.inc' include 'kglobals.inc'
include 'dialogs.inc' include 'dialogs.inc'
include 'search.inc'
include 'viewer.inc' include 'viewer.inc'
include 'editor.inc' include 'editor.inc'
include 'tools.inc' include 'tools.inc'
@ -29,10 +30,14 @@ cursor_normal_size = (font_height*15+50)/100
cursor_big_size = font_height cursor_big_size = font_height
start: start:
mov edi, tolower_table mov edi, identical_table
push 'A' mov ecx, 0x100
pop ecx
xor eax, eax xor eax, eax
@@:
stosb
inc eax
loop @b
mov cl, 'A'
@@: @@:
stosb stosb
inc eax inc eax
@ -68,6 +73,41 @@ start:
inc eax inc eax
loop @b loop @b
mov byte [edi-256+'ð'], 'ñ' mov byte [edi-256+'ð'], 'ñ'
mov cl, 'A'
inc eax
rep stosb
mov cl, 'Z'-'A'+1
dec eax
rep stosb
mov cl, 'a'-'Z'-1
inc eax
rep stosb
mov byte [edi-'a'+'_'], 0
mov cl, 'z'-'a'+1
dec eax
rep stosb
mov cl, '€'-'z'-1
inc eax
rep stosb
mov cl, '¯'-'€'+1
dec eax
rep stosb
mov cl, 'à'-'¯'-1
inc eax
rep stosb
mov cl, 'ñ'-'à'+1
dec eax
rep stosb
mov cl, 256-'ñ'-1
inc eax
rep stosb
mov edi, SearchStringEditBuf
mov eax, SearchStringEditBuf.length
stosd
xor eax, eax
stosd
stosd
stosb
push 68 push 68
pop eax pop eax
push 11 push 11
@ -116,6 +156,7 @@ start:
mov ecx, panels_vtable mov ecx, panels_vtable
mov [eax], ecx mov [eax], ecx
mov [active_screen_vtable], ecx mov [active_screen_vtable], ecx
mov [active_screen_keybar], keybar_panels
; load libini.obj and kfar.ini ; load libini.obj and kfar.ini
mov eax, libini_name mov eax, libini_name
mov esi, ini_import mov esi, ini_import
@ -294,12 +335,13 @@ start:
add ebx, 3 add ebx, 3
and ebx, not 3 and ebx, not 3
mov [EditPlugInfo], ebx mov [EditPlugInfo], ebx
add ebx, editor_line.plugdata
imul ebx, max_height
add ebx, editor_data.basesize + 0xFFF
shr ebx, 12
mov [EditDataSize], ebx
.noini: .noini:
mov eax, [EditPlugInfo]
add eax, editor_line.plugdata
imul eax, max_height
add eax, editor_data.basesize + 0xFFF
shr eax, 12
mov [EditDataSize], eax
mov esi, def_left_dir mov esi, def_left_dir
mov edi, panel1_dir mov edi, panel1_dir
@@: @@:
@ -327,9 +369,7 @@ start:
call read_folder call read_folder
call draw_panel call draw_panel
event: event:
push 10 call get_event
pop eax
int 40h
dec eax dec eax
jz redraw jz redraw
dec eax dec eax
@ -418,6 +458,33 @@ if CHECK_FOR_LEAKS
end if end if
or eax, -1 or eax, -1
int 40h int 40h
get_event:
push ebx
mov ebx, [idle_interval]
cmp ebx, -1
jz .infinite
push 23
pop eax
int 40h
pop ebx
test eax, eax
jnz .ret
mov ebp, [active_screen_data]
mov eax, [active_screen_vtable]
mov eax, [eax+screen_vtable.OnIdle]
test eax, eax
jz get_event
call eax
jmp get_event
.infinite:
pop ebx
push 10
pop eax
int 40h
.ret:
ret
redraw: redraw:
; query kbd state from OS ; query kbd state from OS
mov al, 66 mov al, 66
@ -1034,6 +1101,12 @@ new_screen:
mov [active_screen], eax mov [active_screen], eax
mov [active_screen_vtable], edx mov [active_screen_vtable], edx
mov [active_screen_data], ebp mov [active_screen_data], ebp
or [idle_interval], -1
mov edx, [edx+screen_vtable.keybar]
test edx, edx
jz @f
mov [active_screen_keybar], edx
@@:
jmp draw_keybar jmp draw_keybar
next_screen: next_screen:
@ -1068,16 +1141,29 @@ delete_active_screen:
.norealloc: .norealloc:
pop ecx pop ecx
call pgfree call pgfree
and [active_screen], 0 dec [active_screen]
change_screen: change_screen:
pusha pusha
or [idle_interval], -1
mov eax, [active_screen] mov eax, [active_screen]
mov esi, [screens] mov esi, [screens]
mov ebp, [esi+eax*8+4] mov ebp, [esi+eax*8+4]
mov eax, [esi+eax*8] mov eax, [esi+eax*8]
push eax ebp
mov eax, [eax+screen_vtable.OnActivate]
test eax, eax
jz @f
call eax
@@:
pop ebp eax
mov [active_screen_vtable], eax mov [active_screen_vtable], eax
mov [active_screen_data], ebp mov [active_screen_data], ebp
mov edx, [eax+screen_vtable.keybar]
test edx, edx
jz @f
mov [active_screen_keybar], edx
@@:
call draw_keybar call draw_keybar
mov [cursor_size], cursor_normal_size mov [cursor_size], cursor_normal_size
call [eax+screen_vtable.OnRedraw] call [eax+screen_vtable.OnRedraw]
@ -2557,6 +2643,12 @@ end if
jmp .copydone jmp .copydone
.f3: .f3:
mov eax, [ebp + panel1_files - panel1_data]
mov ecx, [eax+ecx*4]
test byte [ecx], 10h
jnz .ret2
lea esi, [ebp + panel1_dir - panel1_data]
xor eax, eax
call view_file call view_file
.ret2: .ret2:
ret ret
@ -2694,6 +2786,7 @@ end if
stosb stosb
test al, al test al, al
jnz @b jnz @b
.ctrl_r.doread:
push [ebp + panel1_start - panel1_data] push [ebp + panel1_start - panel1_data]
call read_folder call read_folder
pop [ebp + panel1_start - panel1_data] pop [ebp + panel1_start - panel1_data]
@ -3855,8 +3948,7 @@ draw_keybar:
or al, 4 or al, 4
@@: @@:
imul eax, 6*12 imul eax, 6*12
mov esi, [active_screen_vtable] mov esi, [active_screen_keybar]
mov esi, [esi+screen_vtable.keybar]
add esi, eax add esi, eax
xor ecx, ecx xor ecx, ecx
inc ecx inc ecx
@ -7005,6 +7097,8 @@ cursor_size dd cursor_normal_size
cur_cursor_pos dd -1 cur_cursor_pos dd -1
old_cursor_pos dd -1 old_cursor_pos dd -1
idle_interval dd -1
active_panel dd panel1_data active_panel dd panel1_data
associations dd 0 associations dd 0
@ -7041,6 +7135,8 @@ ctrlkey_tests_num = 5
virtual at 0 virtual at 0
screen_vtable: screen_vtable:
.OnRedraw dd ? .OnRedraw dd ?
.OnActivate dd ?
.OnIdle dd ?
.OnKey dd ? .OnKey dd ?
.keybar dd ? .keybar dd ?
.getname dd ? .getname dd ?
@ -7050,6 +7146,8 @@ end virtual
panels_vtable: panels_vtable:
dd panels_OnRedraw dd panels_OnRedraw
dd 0
dd 0
dd panels_OnKey dd panels_OnKey
dd keybar_panels dd keybar_panels
dd panels_getname dd panels_getname
@ -7058,6 +7156,8 @@ panels_vtable:
viewer_vtable: viewer_vtable:
dd viewer_OnRedraw dd viewer_OnRedraw
dd 0
dd 0
dd viewer_OnKey dd viewer_OnKey
dd keybar_viewer dd keybar_viewer
dd viewer_getname dd viewer_getname
@ -7066,12 +7166,24 @@ viewer_vtable:
editor_vtable: editor_vtable:
dd editor_OnRedraw dd editor_OnRedraw
dd 0
dd 0
dd editor_OnKey dd editor_OnKey
dd keybar_editor dd keybar_editor
dd editor_getname dd editor_getname
dd editor_OnExit dd editor_OnExit
dd editor_IsHandleUsed dd editor_IsHandleUsed
filesearch_vtable:
dd filesearch_OnRedraw
dd filesearch_OnActivate
dd filesearch_OnIdle
dd filesearch_OnKey
dd 0
dd filesearch_getname
dd filesearch_OnExit
dd filesearch_IsHandleUsed
; additions to this table require changes in tools.inc::get_error_msg ; additions to this table require changes in tools.inc::get_error_msg
errors1: errors1:
dd error0msg dd error0msg
@ -7222,6 +7334,8 @@ panels_ctrlkeys:
dd panels_OnKey.shift_f5 dd panels_OnKey.shift_f5
dw 0x41, 0 dw 0x41, 0
dd panels_OnKey.f7 dd panels_OnKey.f7
dw 0x41, 0x100
dd panels_OnKey.alt_f7
dw 0x42, 0 dw 0x42, 0
dd panels_OnKey.f8 dd panels_OnKey.f8
dw 0x43, 0x100 dw 0x43, 0x100
@ -7295,6 +7409,10 @@ viewer_ctrlkeys:
dd viewer_OnKey.exit dd viewer_OnKey.exit
dw 0x3E, 0 dw 0x3E, 0
dd viewer_OnKey.f4 dd viewer_OnKey.f4
dw 0x41, 0
dd viewer_OnKey.f7
dw 0x41, 1
dd viewer_OnKey.shift_f7
dw 0x42, 0 dw 0x42, 0
dd viewer_OnKey.f8 dd viewer_OnKey.f8
dw 0x42, 1 dw 0x42, 1
@ -7318,6 +7436,10 @@ editor_ctrlkeys:
dd editor_OnKey.backspace dd editor_OnKey.backspace
dw 0x3C, 0 dw 0x3C, 0
dd editor_OnKey.f2 dd editor_OnKey.f2
dw 0x41, 0
dd editor_OnKey.f7
dw 0x41, 1
dd editor_OnKey.shift_f7
dw 0x43, 0x100 dw 0x43, 0x100
dd alt_f9 dd alt_f9
dw 0x44, 0 dw 0x44, 0
@ -7429,6 +7551,9 @@ dialog_edit_color db 30h
dialog_unmodified_edit_color db 38h dialog_unmodified_edit_color db 38h
dialog_normal_btn_color db 70h dialog_normal_btn_color db 70h
dialog_selected_btn_color db 30h dialog_selected_btn_color db 30h
dialog_list_color db 70h
dialog_selected_list_color db 0Fh
dialog_scroll_list_color db 70h
; <20>।ã¯à¥¦¤¥­¨ï ¨ ®è¨¡ª¨ ; <20>।ã¯à¥¦¤¥­¨ï ¨ ®è¨¡ª¨
warning_colors: warning_colors:
; !!! ¤®«¦­ë ¡ëâì ⥠¦¥ ¯®«ï ¨ ¢ ⮬ ¦¥ ¯®à浪¥, çâ® ¨ ¤«ï ®¡ëç­ëå ¤¨ «®£®¢ !!! ; !!! ¤®«¦­ë ¡ëâì ⥠¦¥ ¯®«ï ¨ ¢ ⮬ ¦¥ ¯®à浪¥, çâ® ¨ ¤«ï ®¡ëç­ëå ¤¨ «®£®¢ !!!
@ -7439,6 +7564,9 @@ warning_edit_color db 30h
warning_unmodified_edit_color db 38h warning_unmodified_edit_color db 38h
warning_normal_btn_color db 4Fh warning_normal_btn_color db 4Fh
warning_selected_btn_color db 70h warning_selected_btn_color db 70h
warning_list_color db 3Fh
warning_selected_list_color db 70h
warning_scroll_list_color db 3Fh
; Œ¥­î ; Œ¥­î
menu_normal_color db 3Fh menu_normal_color db 3Fh
menu_selected_color db 0Fh menu_selected_color db 0Fh
@ -7456,6 +7584,7 @@ cmdbar_normal_color db 7
cmdbar_prefix_color db 7 cmdbar_prefix_color db 7
; <20>à®á¬®âà騪 ; <20>à®á¬®âà騪
view_normal_color db 1Bh view_normal_color db 1Bh
view_selected_color db 30h
view_status_color db 30h view_status_color db 30h
view_arrows_color db 1Eh view_arrows_color db 1Eh
; <20>¥¤ ªâ®à ; <20>¥¤ ªâ®à
@ -7694,6 +7823,237 @@ QuickSearchDlg:
dd quick_search_buf dd quick_search_buf
dd 1Ch dd 1Ch
; ¤¨ «®£ ¯®¨áª  ¢ ä ©«¥ ¤«ï ¯à®á¬®âà騪  ¨ । ªâ®à 
find_in_file_dlgdata:
dd 1
.x dd -1
.y dd -1
.width dd ?
.height dd 7
dd 4, 2
dd aSearch
dd ?, ?
dd 0, 0
dd 8
; ‘âப  "ˆáª âì"
dd 1
dd 1,0,aSearchForLen,0
dd aSearchFor
dd 0
; ¯®«¥ । ªâ¨à®¢ ­¨ï á ⥪á⮬ ¤«ï ¯®¨áª 
dd 3
dd 1,1
.width2 dd ?
dd 1
dd SearchStringEditBuf
.flags0 dd 0xC
; £®à¨§®­â «ì­ë© à §¤¥«¨â¥«ì
dd 4
dd -1,2
dd -1,2
dd 0
dd 0
; ä« ¦®ª "“ç¨â뢠âì ॣ¨áâà"
dd 5
dd 1,3
dd -1,3
dd aCaseSensitive
.flags_case dd 18h ; default: search is case sensitive
; ä« ¦®ª "’®«ìª® æ¥«ë¥ á«®¢ "
dd 5
dd 1,4
dd -1,4
dd aWholeWords
.flags_whole dd 8 ; default: do NOT search whole words only
; £®à¨§®­â «ì­ë© à §¤¥«¨â¥«ì
dd 4
dd -1,5
dd -1,5
dd 0
dd 0
; ª­®¯ª  "ˆáª âì"
.search_btn:
dd 2
.search_x1 dd ?
dd 6
.search_x2 dd ?
dd 6
dd aSearchB
.flags1 dd 18h
; ª­®¯ª  "®â¬¥­¨âì"
dd 2
.cnl_x1 dd ?
dd 6
.cnl_x2 dd ?
dd 6
dd aCancelB
.flags2 dd 8
; ¯¥à¢ë© ¤¨ «®£ ¯®¨áª  ¢ ä ©« å (§ ¯à®á)
filesearch_query_template:
dd 1
.x dd ?
.y dd ?
.width dd ?
.height dd 9
dd 4, 2
dd aFileSearch
dd ?
dd 0
dd 0, 0
dd 10
; áâப -¯à¨£« è¥­¨¥ ¤«ï ¢¢®¤  ¬ áª¨
dd 1
dd 1,0,aFileMasksLen,0
dd aFileMasks
dd 0
; ¯®«¥ ¢¢®¤  ¤«ï ¬ áª¨
dd 3
dd 1, 1
.width2 dd ?
dd 1
.editptr1 dd ?
dd 0xC
; áâப -¯à¨£« è¥­¨¥ ¤«ï ⥪áâ  ¯®¨áª 
dd 1
dd 1,2,aContainingTextLen,2
dd aContainingText
dd 0
; ¯®«¥ ¢¢®¤  ¤«ï ⥪áâ  ¯®¨áª 
dd 3
dd 1, 3
.width3 dd ?
dd 3
.editptr2 dd ?
dd 8
; £®à¨§®­â «ì­ë© à §¤¥«¨â¥«ì
dd 4
dd -1,4
dd -1,4
dd 0
dd 0
; ä« ¦®ª "“ç¨â뢠âì ॣ¨áâà"
dd 5
dd 1,5
dd -1,5
dd aCaseSensitive
.flags_case dd ? ; will be initialized from find_in_file_dlgdata
; ä« ¦®ª "’®«ìª® æ¥«ë¥ á«®¢ "
dd 5
dd 1,6
dd -1,6
dd aWholeWords
.flags_whole dd ? ; will be initialized from find_in_file_dlgdata
; £®à¨§®­â «ì­ë© à §¤¥«¨â¥«ì
dd 4
dd -1,7
dd -1,7
dd 0
dd 0
; ª­®¯ª  "ˆáª âì"
.search_btn:
dd 2
.search_x1 dd ?
dd 8
.search_x2 dd ?
dd 8
dd aSearchB
dd 18h
; ª­®¯ª  "®â¬¥­¨âì"
dd 2
.cnl_x1 dd ?
dd 8
.cnl_x2 dd ?
dd 8
dd aCancelB
dd 8
.size = $ - filesearch_query_template
; ¢â®à®© ¤¨ «®£ ¯®¨áª  ¢ ä ©« å (᪠­¨à®¢ ­¨¥)
filesearch_search_template:
dd 1
.x dd ?
.y dd ?
.width dd ?
.height dd ?
dd 4, 2
.caption dd ?
dd ?
dd 0
dd 0, 0
dd 9
; ᯨ᮪ ­ ©¤¥­­ëå ä ©«®¢
dd 6
dd 0, 0
.width1 dd ?
.height1 dd ?
.data1 dd ?
dd 0
; £®à¨§®­â «ì­ë© à §¤¥«¨â¥«ì
dd 4
dd -1
.y2 dd ?
dd -1
dd ?
dd 0, 0
; áâப  "<22>®¨áª <string> ¢:" «¨¡® "<22>®¨áª § ª®­ç¥­..."
dd 1
dd 1
.y3 dd ?
.width3 dd ?
dd ?
.data3 dd ?
dd 0
; áâப  á ⥪ã饩 ¯ ¯ª®©
dd 1
.x4 dd ?
.y4 dd ?
.width4 dd ?
dd ?
.data4 dd ?
dd 0
; £®à¨§®­â «ì­ë© à §¤¥«¨â¥«ì
dd 4
dd -1
.y5 dd ?
dd -1
dd ?
dd 0, 0
; ª­®¯ª¨
.btn1:
dd 2
.btn1x1 dd ?
.btn1y dd ?
.btn1x2 dd ?
dd ?
dd aNewSearch
dd 8
.btn2:
dd 2
.btn2x1 dd ?
.btn2y dd ?
.btn2x2 dd ?
dd ?
dd aGoto
dd 1Ch
.btn3:
dd 2
.btn3x1 dd ?
.btn3y dd ?
.btn3x2 dd ?
dd ?
dd aView
dd 8
.btn4:
dd 2
.btn4x1 dd ?
.btn4y dd ?
.btn4x2 dd ?
dd ?
dd aCancelB2
dd 8
.size = $ - filesearch_search_template
RetryOrCancelBtn: RetryOrCancelBtn:
dd aRetry dd aRetry
dd a_Cancel dd a_Cancel
@ -7708,18 +8068,23 @@ DeleteOrCancelBtn:
dd a_Cancel dd a_Cancel
DeleteErrorBtn: DeleteErrorBtn:
dd aRetry dd aRetry
SkipOrCancelBtn:
dd aSkip dd aSkip
dd aSkipAll dd aSkipAll
dd a_Cancel dd a_Cancel
ContinueBtn: ContinueBtn:
dd aContinue dd aContinue
EditorExitBtn: EditorExitBtn:
dd aSave dd aSave
dd aDontSave dd aDontSave
dd aContinueEdit dd aContinueEdit
YesOrNoBtn:
dd aYes
dd aNo
aCannotOpenFile_ptr dd aCannotOpenFile aCannotOpenFile_ptr dd aCannotOpenFile
aCannotCreateThread_ptr dd aCannotCreateThread
ConfirmCancelMsg dd aConfirmCancel
EditConfigErr_ptr: EditConfigErr_ptr:
dd aEditConfigErr1 dd aEditConfigErr1
dd aEditConfigErr2 dd aEditConfigErr2
@ -7731,6 +8096,8 @@ aConfirmDeleteTextMax = $ - aConfirmDeleteText - 2
aDeleteFile db ' ä ©«',0 aDeleteFile db ' ä ©«',0
aCancelB db '[ Žâ¬¥­¨âì ]',0 aCancelB db '[ Žâ¬¥­¨âì ]',0
aCancelBLength = $ - aCancelB - 1 aCancelBLength = $ - aCancelB - 1
aCancelB2 db '[ Žâ¬¥­  ]',0
aCancelB2Length = $ - aCancelB2 - 1
aCopyCaption db 'Š®¯¨à®¢ ­¨¥',0 aCopyCaption db 'Š®¯¨à®¢ ­¨¥',0
aCopy db '[ Š®¯¨à®¢ âì ]',0 aCopy db '[ Š®¯¨à®¢ âì ]',0
aCopyLength = $ - aCopy - 1 aCopyLength = $ - aCopy - 1
@ -7745,6 +8112,8 @@ a_Cancel db '
a_Delete db '“¤ «¨âì',0 a_Delete db '“¤ «¨âì',0
aSkip db '<27>யãáâ¨âì',0 aSkip db '<27>யãáâ¨âì',0
aSkipAll db '<27>யãáâ¨âì ¢á¥',0 aSkipAll db '<27>யãáâ¨âì ¢á¥',0
aYes db '„ ',0
aNo db '<27>¥â',0
error0msg db '‘âà ­­®... <20>¥â ®è¨¡ª¨',0 error0msg db '‘âà ­­®... <20>¥â ®è¨¡ª¨',0
error1msg db '‘âà ­­®... <20>¥ ®¯à¥¤¥«¥­  ¡ §  ¨/¨«¨ à §¤¥« ¦ñá⪮£® ¤¨áª ',0 error1msg db '‘âà ­­®... <20>¥ ®¯à¥¤¥«¥­  ¡ §  ¨/¨«¨ à §¤¥« ¦ñá⪮£® ¤¨áª ',0
error2msg db '”ã­ªæ¨ï ­¥ ¯®¤¤¥à¦¨¢ ¥âáï ¤«ï ¤ ­­®© ä ©«®¢®© á¨á⥬ë',0 error2msg db '”ã­ªæ¨ï ­¥ ¯®¤¤¥à¦¨¢ ¥âáï ¤«ï ¤ ­­®© ä ©«®¢®© á¨á⥬ë',0
@ -7793,8 +8162,32 @@ aTables db '
aSelect db '<27>®¬¥â¨âì',0 aSelect db '<27>®¬¥â¨âì',0
aDeselect db '‘­ïâì',0 aDeselect db '‘­ïâì',0
aCannotOpenFile db 'Žè¨¡ª  ¯à¨ ®âªàë⨨ ä ©« ',0 aCannotOpenFile db 'Žè¨¡ª  ¯à¨ ®âªàë⨨ ä ©« ',0
aCannotCreateThread db 'Žè¨¡ª  ¯à¨ ᮧ¤ ­¨¨ ¯®â®ª ',0
aCannotSetFolder db '<27>¥ ¬®£ã § ©â¨ ¢ ¯ ¯ªã',0 aCannotSetFolder db '<27>¥ ¬®£ã § ©â¨ ¢ ¯ ¯ªã',0
aSearch db '<27>®¨áª',0 aSearch db '<27>®¨áª',0
aSearchB db '[ ˆáª âì ]',0
aSearchBLength = $ - aSearchB - 1
aSearchFor db 'ˆáª âì',0
aSearchForLen = $ - aSearchFor - 1
aCaseSensitive db '“ç¨â뢠âì ॣ¨áâà',0
aWholeWords db '’®«ìª® æ¥«ë¥ á«®¢ ',0
aReverseSearch db 'Ž¡à â­ë© ¯®¨áª',0
aStringNotFound db '‘âப  ­¥ ­ ©¤¥­ ',0
aFileSearch db '<27>®¨áª ä ©« ',0
aFileMasks db 'Ž¤­  ¨«¨ ­¥áª®«ìª® ¬ á®ª ä ©«®¢:',0
aFileMasksLen = $ - aFileMasks - 1
aContainingText db '‘®¤¥à¦ é¨å ⥪áâ:',0
aContainingTextLen = $ - aContainingText - 1
aSearchingIn db '<27>®¨áª "" ¢:',0
aSearchingInLen = $ - aSearchingIn - 1
aSearchDone db '<27>®¨áª § ª®­ç¥­. <20> ©¤¥­® ? ä ©«(®¢)',0
aSearchDoneLen = $ - aSearchDone - 1
aNewSearch db '[ <20>®¢ë© ¯®¨áª ]',0
aNewSearchLen = $ - aNewSearch - 1
aGoto db '[ <20>¥à¥©â¨ ]',0
aGotoLen = $ - aGoto - 1
aView db '[ ‘¬®âà¥âì ]',0
aViewLen = $ - aView - 1
aEditConfigErr1 db 'Žè¨¡ª  ¢ ª®­ä¨£ãà æ¨¨ ¯« £¨­®¢ ¤«ï । ªâ®à .',0 aEditConfigErr1 db 'Žè¨¡ª  ¢ ª®­ä¨£ãà æ¨¨ ¯« £¨­®¢ ¤«ï । ªâ®à .',0
aEditConfigErr2 db '<27>®¯à®¡ã©â¥ ã¡à âì «¨è­¨¥ ¯« £¨­ë.',0 aEditConfigErr2 db '<27>®¯à®¡ã©â¥ ã¡à âì «¨è­¨¥ ¯« £¨­ë.',0
aEditNoMemory db '” ©« ᫨誮¬ ¢¥«¨ª ¤«ï § £à㧪¨ ¢ । ªâ®à.',0 aEditNoMemory db '” ©« ᫨誮¬ ¢¥«¨ª ¤«ï § £à㧪¨ ¢ । ªâ®à.',0
@ -7806,6 +8199,9 @@ aSave db '
aDontSave db '<27>¥ á®åà ­ïâì',0 aDontSave db '<27>¥ á®åà ­ïâì',0
aContinueEdit db '<27>த®«¦¨âì । ªâ¨à®¢ ­¨¥',0 aContinueEdit db '<27>த®«¦¨âì । ªâ¨à®¢ ­¨¥',0
aCannotSaveToPlugin db '‘®åà ­¥­¨¥ ä ©«®¢ ­  ¯ ­¥«ïå ¯« £¨­®¢ ­¥ ¯®¤¤¥à¦¨¢ ¥âáï',0 aCannotSaveToPlugin db '‘®åà ­¥­¨¥ ä ©«®¢ ­  ¯ ­¥«ïå ¯« £¨­®¢ ­¥ ¯®¤¤¥à¦¨¢ ¥âáï',0
aCannotSearchOnPlugin db '<27>®¨áª ­  ¯ ­¥«ïå ¯« £¨­®¢ ­¥ ¯®¤¤¥à¦¨¢ ¥âáï',0
aCancelled db '„¥©á⢨¥ ¡ë«® ¯à¥à¢ ­®',0
aConfirmCancel db '‚ë ¤¥©á⢨⥫쭮 å®â¨â¥ ®â¬¥­¨âì ¤¥©á⢨¥?',0
else else
aDeleteCaption db 'Delete',0 aDeleteCaption db 'Delete',0
aConfirmDeleteText db 'Do you wish to delete',0 aConfirmDeleteText db 'Do you wish to delete',0
@ -7832,6 +8228,8 @@ a_Cancel db 'Cancel',0
a_Delete db 'Delete',0 a_Delete db 'Delete',0
aSkip db 'Skip',0 aSkip db 'Skip',0
aSkipAll db 'Skip all',0 aSkipAll db 'Skip all',0
aYes db 'Yes',0
aNo db 'No',0
error0msg db 'Strange... No error',0 error0msg db 'Strange... No error',0
error1msg db 'Strange... Hard disk base and/or partition not defined',0 error1msg db 'Strange... Hard disk base and/or partition not defined',0
error2msg db 'The file system does not support this function',0 error2msg db 'The file system does not support this function',0
@ -7880,8 +8278,30 @@ aTables db 'Tables',0
aSelect db 'Select',0 aSelect db 'Select',0
aDeselect db 'Deselect',0 aDeselect db 'Deselect',0
aCannotOpenFile db 'Cannot open the file',0 aCannotOpenFile db 'Cannot open the file',0
aCannotSetFolder db 'Cannot enter to folder',0 aCannotCreateThread db 'Cannot create a thread',0
aCannotSetFolder db 'Cannot enter to the folder',0
aSearch db 'Search',0 aSearch db 'Search',0
aSearchB db '[ Search ]',0
aSearchBLength = $ - aSearchB - 1
aSearchFor db 'Search for',0
aSearchForLen = $ - aSearch - 1
aCaseSensitive db 'Case sensitive',0
aWholeWords db 'Whole words',0
aReverseSearch db 'Reverse search',0
aStringNotFound db 'Could not find the string',0
aFileSearch db 'Find file',0
aFileMasks db 'A file mask or several file masks:',0
aContainingText db 'Containing text:',0
aSearchingIn db 'Searching "" in:',0
aSearchingInLen = $ - aSearchingIn - 1
aSearchDone db 'Search done. Found ? file(s)',0
aSearchDoneLen = $ - aSearchDone - 1
aNewSearch db '[ New search ]',0
aNewSearchLen = $ - aNewSearch - 1
aGoto db '[ Go to ]',0
aGotoLen = $ - aGoto - 1
aView db '[ View ]',0
aViewLen = $ - aView - 1
aEditConfigErr1 db 'Error in configuration of plugins for the editor.',0 aEditConfigErr1 db 'Error in configuration of plugins for the editor.',0
aEditConfigErr2 db 'Try to remove unnecessary plugins.',0 aEditConfigErr2 db 'Try to remove unnecessary plugins.',0
aLine db ' Line' aLine db ' Line'
@ -7892,6 +8312,8 @@ aSave db 'Save',0
aDontSave db 'Do not save',0 aDontSave db 'Do not save',0
aContinueEdit db 'Continue editing',0 aContinueEdit db 'Continue editing',0
aCannotSaveToPlugin db 'Saving is not supported for plugin panels',0 aCannotSaveToPlugin db 'Saving is not supported for plugin panels',0
aCancelled db 'Operation has been interrupted',0
aConfirmCancel db 'Do you really want to cancel it?',0
end if end if
aOk db 'OK',0 aOk db 'OK',0
@ -8263,6 +8685,7 @@ screens dd ?
num_screens dd ? num_screens dd ?
active_screen_vtable dd ? active_screen_vtable dd ?
active_screen_data dd ? active_screen_data dd ?
active_screen_keybar dd ?
default_attr dd ? default_attr dd ?
left_dotdot_entry rb 40+4 ; 40 bytes for attributes + '..' left_dotdot_entry rb 40+4 ; 40 bytes for attributes + '..'
@ -8273,12 +8696,20 @@ CopySourceTextBuf rb 512
CopyDestEditBuf rb 12+512+1 CopyDestEditBuf rb 12+512+1
.length = $ - CopyDestEditBuf - 13 .length = $ - CopyDestEditBuf - 13
SearchStringEditBuf rb 12
SearchString rb 253+1
SearchStringEditBuf.length = $ - SearchString - 1
db ? ; used for output (string -> "string")
enter_string_buf rb 12+512+1 enter_string_buf rb 12+512+1
bMemForImageValidData db ? bMemForImageValidData db ?
align 4 align 4
identical_table rb 256
tolower_table rb 256 tolower_table rb 256
isspace_table rb 256
composite_table rb 256
layout rb 128 layout rb 128
copy_buffer_size = 65536 copy_buffer_size = 65536

View File

@ -42,6 +42,7 @@ Alt+<
в котором можно вводить дальнейшие символы имени файла для уточнения, в котором можно вводить дальнейшие символы имени файла для уточнения,
а также Ctrl+Enter/Shift+Ctrl+Enter для перемещения к следующему/предыдущему а также Ctrl+Enter/Shift+Ctrl+Enter для перемещения к следующему/предыдущему
элементу панели, имя которого начинается с введённых букв элементу панели, имя которого начинается с введённых букв
Alt+F7 - вызов диалога поиска файлов
В просмотрщике: В просмотрщике:
Esc = F3 = F10 = Numpad5 - выход Esc = F3 = F10 = Numpad5 - выход
@ -66,6 +67,10 @@ Shift+F8 -
F12 - вызов меню экранов F12 - вызов меню экранов
Alt+F9 - разворачивание окна к максимально возможным размерам и Alt+F9 - разворачивание окна к максимально возможным размерам и
восстановление размеров восстановление размеров
F7 - поиск строки с текущей позиции в файле
(строка и настройки поиска задаются в появляющемся диалоге)
Shift+F7 - продолжение поиска строки
(используются последние заданные настройки поиска и строка)
В редакторе: В редакторе:
Esc = F10 - выход; если файл был модифицирован, последует вопрос о Esc = F10 - выход; если файл был модифицирован, последует вопрос о
@ -86,6 +91,10 @@ Ins -
F12 - вызов меню экранов F12 - вызов меню экранов
Alt+F9 - разворачивание окна к максимально возможным размерам и Alt+F9 - разворачивание окна к максимально возможным размерам и
восстановление размеров восстановление размеров
F7 - поиск строки с текущей позиции в файле
(строка и настройки поиска задаются в появляющемся диалоге)
Shift+F7 - продолжение поиска строки
(используются последние заданные настройки поиска и строка)
diamond diamond
mailto:diamondz@land.ru mailto:diamondz@land.ru

View File

@ -0,0 +1,203 @@
; in: ebx -> pattern (not empty zero-terminated string), esi -> translation table,
; dword [esp+4] = encoding, byte [esp+8] non-zero for whole words only
; out: edx and ecx -> preprocessed data
; when search will be done, edx must be pgfree()d
search_string_pre:
; FSM is used, number of states is limited by 256, so pattern length must be <= 255
; anyway, for big patterns FSM uses too many memory, so probably it is not best choice
; get pattern length, m
or ecx, -1
@@:
inc ecx
cmp byte [ecx+ebx], 0
jnz @b
cmp byte [esp+8], 0
jz @f
inc ecx
inc ecx
@@:
push ecx
; allocate m*257 bytes for FSM and prefix function
imul ecx, 257
call xpgalloc
pop ecx
test eax, eax
jnz @f
ret 8
@@:
shl ecx, 8
push eax
add eax, ecx
; calculate prefix function
xor ecx, ecx
mov byte [eax], cl
xor edi, edi
cmp byte [esp+4+8], 0
jnz .whole.prefixcalc
.prefixcalc:
inc edi
movzx edx, byte [ebx+edi]
mov dl, [esi+edx]
test dl, dl
jz .prefixdone
@@:
push eax
movzx eax, byte [ebx+ecx]
cmp dl, [esi+eax]
pop eax
jz @f
jecxz .prefixint
mov cl, byte [eax+ecx-1]
jmp @b
@@:
inc ecx
.prefixint:
mov [eax+edi], cl
jmp .prefixcalc
.whole.prefixcalc:
inc edi
movzx edx, byte [ebx+edi-1]
mov dl, [esi+edx]
test dl, dl
jz .whole.prefixdone
.whole.prefixloop:
jecxz .whole.testfirst
push eax
movzx eax, byte [ebx+ecx-1]
cmp dl, [esi+eax]
pop eax
jz @f
mov cl, byte [eax+ecx-1]
jmp .whole.prefixloop
.whole.testfirst:
cmp [isspace_table+edx], 0
jz .whole.prefixint
@@:
inc ecx
.whole.prefixint:
mov [eax+edi], cl
jmp .whole.prefixcalc
.whole.prefixdone:
jecxz @f
push eax
movzx eax, byte [ebx+ecx-1]
mov al, [esi+eax]
cmp [isspace_table+eax], 0
pop eax
jnz @f
mov cl, byte [eax+ecx-1]
jmp .whole.prefixdone
@@:
inc ecx
mov [eax+edi], cl
.prefixdone:
pop edx
; create reverse table for encoding+translation
push ebp
movzx ebp, byte [esp+8]
cmp ebp, encodings.unicode
jb @f
xor ebp, ebp ; no translations for Unicode encodings,
; they must be handled separately by caller
@@:
mov ecx, 256
@@:
push 0
loop @b
push ebx eax
mov ebx, esp
shl ebp, 7
xor eax, eax
.createrev:
dec cl
mov al, cl
jns @f
mov al, byte [encodings.tables+ebp+ecx-80h]
@@:
mov al, [esi+eax]
pushd [ebx+8+eax*4]
pushd ecx
mov [ebx+8+eax*4], esp
jnz .createrev
@@:
dec cl
mov al, [esi+ecx]
pushd [ebx+8+eax*4]
popd [ebx+8+ecx*4]
jnz @b
; create FSM
xor ecx, ecx
cmp byte [ebx+259*4+8], 0
mov eax, [ebx]
mov ebx, [ebx+4]
mov edi, edx
jz .fsmcalc
mov esi, isspace_table
push 256/4
pop ecx
rep movsd
inc ecx
.fsmcalc:
movzx esi, byte [eax+ecx]
push eax
push ecx
push 256/4
pop ecx
dec esi
js .fsmzero
shl esi, 8
add esi, edx
rep movsd
jmp .fsmnext
.fsmzero:
cmp byte [esp+261*4+256*8+8], 0
jnz .whole.fsmzero
xor eax, eax
rep stosd
jmp .fsmnext
.whole.fsmzero:
mov esi, edx
rep movsd
.fsmnext:
pop ecx
movzx esi, byte [ebx]
inc ecx
mov esi, [esp+4+8*256+8+esi*4]
@@:
test esi, esi
jz @f
lodsd
mov [edi-256+eax], cl
mov esi, [esi]
jmp @b
@@:
inc ebx
pop eax
cmp byte [ebx], 0
jnz .fsmcalc
cmp byte [esp+259*4+256*8+8], 0
jz .nowholefin
movzx esi, byte [eax+ecx]
push ecx
mov ecx, 256
push 256/4
pop ecx
dec esi
shl esi, 8
add esi, edx
rep movsd
pop ecx
inc ecx
xor eax, eax
.whole.fsmfin:
cmp [isspace_table+eax], ah
jz @f
mov byte [edi-256+eax], cl
@@:
inc al
jnz .whole.fsmfin
.nowholefin:
; ok, now edx -> FSM, cl = final state
add esp, 8*256+8+4*256
pop ebp
ret 8

View File

@ -15,6 +15,8 @@ viewer_data:
; & 4: big-endian unicode ; & 4: big-endian unicode
.bEofReached db ? .bEofReached db ?
rb 1 rb 1
.selected_start dq ?
.selected_len dq ?
align 200h align 200h
.filename rb 1024 .filename rb 1024
.hostname rb 1024 .hostname rb 1024
@ -23,22 +25,30 @@ viewer_data:
end virtual end virtual
view_file: view_file:
mov eax, [ebp + panel1_files - panel1_data] push eax ecx
mov ecx, [eax+ecx*4]
test byte [ecx], 10h
jz .file
ret
.file:
lea esi, [ebp + panel1_dir - panel1_data]
push ecx
mov ecx, viewer_data.size mov ecx, viewer_data.size
mov edx, viewer_vtable mov edx, viewer_vtable
call new_screen call new_screen
pop ecx pop ecx
test eax, eax test eax, eax
pop eax
jnz @f jnz @f
ret 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 eax, dword [esi+panel1_hPlugin-panel1_dir]
mov [ebp+viewer_data.hPlugin], eax mov [ebp+viewer_data.hPlugin], eax
test eax, eax test eax, eax
@ -63,10 +73,6 @@ view_file:
.nocopyhostname: .nocopyhostname:
mov eax, dword [esi+panel1_hFile-panel1_dir] mov eax, dword [esi+panel1_hFile-panel1_dir]
mov [ebp+viewer_data.hFile], eax mov [ebp+viewer_data.hFile], eax
mov [ebp+viewer_data.encoding], encodings.cp866
mov [ebp+viewer_data.flags], 0
and dword [ebp+viewer_data.col], 0
and dword [ebp+viewer_data.col+4], 0
lea edi, [ebp+viewer_data.filename] lea edi, [ebp+viewer_data.filename]
push edi push edi
@@: @@:
@ -86,6 +92,13 @@ view_file:
stosb stosb
test al, al test al, al
jnz @b 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 pop eax
push eax push eax
mov ebx, attrinfo mov ebx, attrinfo
@ -221,8 +234,7 @@ viewer_OnRedraw:
call viewer_draw_text call viewer_draw_text
ret ret
viewer_get_next_char: viewer_skip_unicode_marker:
pusha
cmp [ebp+viewer_data.encoding], encodings.unicode cmp [ebp+viewer_data.encoding], encodings.unicode
jnz @f jnz @f
cmp [bForHex], 0 cmp [bForHex], 0
@ -241,15 +253,9 @@ viewer_get_next_char:
.skip: .skip:
add [ebp+viewer_data.buf_pos], 2 add [ebp+viewer_data.buf_pos], 2
@@: @@:
mov eax, [ebp+viewer_data.buf_pos] ret
lea ecx, [ebp+viewer_data.buf]
add ecx, [ebp+viewer_data.buf_size] viewer_load_next:
cmp eax, ecx
jb .buffered
mov al, ' '
sub ecx, ebp
cmp ecx, viewer_data.buf + 16384
jb .err
mov eax, dword [ebp+viewer_data.buf_start] mov eax, dword [ebp+viewer_data.buf_start]
add eax, 8192 add eax, 8192
mov dword [ebp+viewer_data.buf_start], eax mov dword [ebp+viewer_data.buf_start], eax
@ -300,7 +306,22 @@ viewer_get_next_char:
add ebx, 16384-8192 add ebx, 16384-8192
mov [ebp+viewer_data.buf_size], ebx mov [ebp+viewer_data.buf_size], ebx
mov eax, [ebp+viewer_data.buf_pos] mov eax, [ebp+viewer_data.buf_pos]
cmp ecx, 16384-8192 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 jnz .buffered
.err: .err:
stc stc
@ -408,6 +429,13 @@ uni2ansi_char:
add al, 0xA0 add al, 0xA0
ret 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: fld_uint64:
fild qword [eax] fild qword [eax]
test byte [eax+7], 80h test byte [eax+7], 80h
@ -698,6 +726,7 @@ end if
div ecx div ecx
pop eax pop eax
sub ecx, edx sub ecx, edx
pop edx
add eax, ecx add eax, ecx
test [ebp+viewer_data.flags], 2 test [ebp+viewer_data.flags], 2
jnz @f jnz @f
@ -713,7 +742,6 @@ end if
call .write_char call .write_char
loop @b loop @b
pop ecx pop ecx
pop edx
jmp .1 jmp .1
.done: .done:
setc [ebp+viewer_data.bEofReached] setc [ebp+viewer_data.bEofReached]
@ -971,6 +999,24 @@ end if
.do: .do:
mov al, [esp] mov al, [esp]
mov ah, [view_normal_color] 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 stosw
.skip: .skip:
pop eax ecx pop eax ecx
@ -1585,6 +1631,179 @@ viewer_OnKey:
adc dword [ebp+viewer_data.cur_pos+4], 0 adc dword [ebp+viewer_data.cur_pos+4], 0
and dword [ebp+viewer_data.cur_pos], not 1 and dword [ebp+viewer_data.cur_pos], not 1
jmp .done_redraw_keybar 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: viewer_getname:
if lang eq ru if lang eq ru