Subversion Repositories Kolibri OS

Rev

Rev 997 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. virtual at 0
  2. viewer_data:
  3.         .hPlugin        dd      ?
  4.         .hFile          dd      ?
  5.         .buf_start      dq      ?
  6.         .cur_pos        dq      ?
  7.         .filesize       dq      ?
  8.         .buf_pos        dd      ?
  9.         .buf_size       dd      ?
  10.         .col            dq      ?
  11.         .hWorkFile      dd      ?
  12.         .encoding       db      ?
  13.         .flags          db      ?       ; & 1: hex mode
  14.                                         ; & 2: unwrap
  15.                                         ; & 4: big-endian unicode
  16.         .bEofReached    db      ?
  17.                         rb      1
  18.         .selected_start dq      ?
  19.         .selected_len   dq      ?
  20.         align 200h
  21.         .filename       rb      1024
  22.         .hostname       rb      1024
  23.         .buf            rb      16384
  24.         .size = $
  25. end virtual
  26.  
  27. view_file:
  28.         push    eax ecx
  29.         mov     ecx, viewer_data.size
  30.         mov     edx, viewer_vtable
  31.         call    new_screen
  32.         pop     ecx
  33.         test    eax, eax
  34.         pop     eax
  35.         jnz     @f
  36.         ret
  37. @@:
  38.         test    eax, eax
  39.         jz      .frompanel
  40.         and     dword [ebp+viewer_data.hPlugin], 0
  41.         and     dword [ebp+viewer_data.hFile], 0
  42.         mov     byte [ebp+viewer_data.hostname], 0
  43.         lea     edi, [ebp+viewer_data.filename]
  44.         push    edi
  45. @@:
  46.         lodsb
  47.         stosb
  48.         test    al, al
  49.         jnz     @b
  50.         jmp     .namecopied
  51. .frompanel:
  52.         mov     eax, dword [esi+panel1_hPlugin-panel1_dir]
  53.         mov     [ebp+viewer_data.hPlugin], eax
  54.         test    eax, eax
  55.         jz      .nocopyhostname
  56.         lea     edi, [ebp+viewer_data.hostname]
  57.         push    esi
  58.         mov     eax, dword [esi+panel1_parents-panel1_dir]
  59.         mov     esi, dword [esi+panel1_parents_sz-panel1_dir]
  60.         add     esi, eax
  61. @@:
  62.         dec     esi
  63.         cmp     byte [esi-1], 0
  64.         jz      @f
  65.         cmp     byte [esi-1], '/'
  66.         jnz     @b
  67. @@:
  68.         lodsb
  69.         stosb
  70.         test    al, al
  71.         jnz     @b
  72.         pop     esi
  73. .nocopyhostname:
  74.         mov     eax, dword [esi+panel1_hFile-panel1_dir]
  75.         mov     [ebp+viewer_data.hFile], eax
  76.         lea     edi, [ebp+viewer_data.filename]
  77.         push    edi
  78. @@:
  79.         lodsb
  80.         test    al, al
  81.         jz      @f
  82.         stosb
  83.         jmp     @b
  84. @@:
  85.         lea     esi, [ecx+40]
  86.         cmp     byte [edi-1], '/'
  87.         jz      @f
  88.         mov     al, '/'
  89.         stosb
  90. @@:
  91.         lodsb
  92.         stosb
  93.         test    al, al
  94.         jnz     @b
  95. .namecopied:
  96.         xor     eax, eax
  97.         mov     [ebp+viewer_data.encoding], al ;encodings.cp866 = 0
  98.         mov     [ebp+viewer_data.flags], al
  99.         mov     dword [ebp+viewer_data.col], eax
  100.         mov     dword [ebp+viewer_data.col+4], eax
  101.         call    viewer_clear_selection
  102.         pop     eax
  103.         mov     ebx, attrinfo
  104.         mov     [ebx+21], eax
  105.         mov     [readinfo.name], eax
  106. .attr_retry:
  107.         mov     edx, [ebp+viewer_data.hPlugin]
  108.         test    edx, edx
  109.         jz      .attr_native
  110.         push    ebp
  111.         push    dword [ebx+16]
  112.         push    eax
  113.         push    [ebp+viewer_data.hFile]
  114.         call    [edx+PluginInfo.getattr]
  115.         pop     ebp
  116.         jmp     .attr_common
  117. .attr_native:
  118.         push    70
  119.         pop     eax
  120.         int     40h
  121. .attr_common:
  122.         test    eax, eax
  123.         jz      @f
  124.         lea     ebx, [ebp+viewer_data.filename]
  125.         push    ebx
  126.         push    aCannotReadFile
  127.         call    get_error_msg
  128.         push    eax
  129.         mov     eax, esp
  130.         push    RetryOrCancelBtn
  131.         push    2
  132.         push    eax
  133.         push    3
  134.         call    SayErr
  135.         add     esp, 3*4
  136.         mov     ebx, attrinfo
  137.         test    eax, eax
  138.         jz      .attr_retry
  139.         pop     eax
  140.         jmp     delete_active_screen
  141. @@:
  142.         mov     eax, dword [attrinfo.attr+32]
  143.         mov     dword [ebp+viewer_data.filesize], eax
  144.         mov     eax, dword [attrinfo.attr+36]
  145.         mov     dword [ebp+viewer_data.filesize+4], eax
  146.         mov     ebx, readinfo
  147.         xor     eax, eax
  148.         mov     dword [ebx+readinfo.first-readinfo], eax
  149.         mov     dword [ebx+readinfo.first+4-readinfo], eax
  150.         mov     dword [ebp+viewer_data.buf_start], eax
  151.         mov     dword [ebp+viewer_data.buf_start+4], eax
  152.         mov     dword [ebp+viewer_data.cur_pos], eax
  153.         mov     dword [ebp+viewer_data.cur_pos+4], eax
  154.         mov     [ebx+readinfo.size-readinfo], 16384
  155.         lea     eax, [ebp+viewer_data.buf]
  156.         mov     [readinfo.data], eax
  157.         mov     [ebp+viewer_data.buf_pos], eax
  158.         mov     eax, [ebp+viewer_data.hPlugin]
  159.         test    eax, eax
  160.         jz      .retry
  161.         push    ebx ebp
  162.         push    O_READ
  163.         push    dword [readinfo.name]
  164.         push    [ebp+viewer_data.hFile]
  165.         call    [eax+PluginInfo.open]
  166.         pop     ebp ebx
  167.         mov     [ebp+viewer_data.hWorkFile], eax
  168.         test    eax, eax
  169.         jnz     .retry
  170. ..openerr_in_screen:
  171.         push    ContinueBtn
  172.         push    1
  173.         push    aCannotOpenFile_ptr
  174.         push    1
  175.         call    SayErr
  176.         jmp     delete_active_screen
  177. .retry:
  178.         mov     eax, [ebp+viewer_data.hPlugin]
  179.         test    eax, eax
  180.         jz      .read_native
  181.         push    ebp
  182.         push    16384
  183.         push    [ebx+readinfo.data-readinfo]
  184.         push    [ebp+viewer_data.hWorkFile]
  185.         call    [eax+PluginInfo.read]
  186.         pop     ebp
  187.         cmp     eax, -1
  188.         jz      .readok         ; let's hope that plugin says error itself
  189.         mov     [ebp+viewer_data.buf_size], eax
  190.         mov     ebx, eax
  191.         jmp     .readok
  192. .read_native:
  193.         push    70
  194.         pop     eax
  195.         int     40h
  196.         mov     [ebp+viewer_data.buf_size], ebx
  197.         test    eax, eax
  198.         jz      .readok
  199.         cmp     eax, 6
  200.         jz      .readok
  201. .readerr:
  202.         lea     ebx, [ebp+viewer_data.filename]
  203.         push    ebx
  204.         push    aCannotReadFile
  205.         call    get_error_msg
  206.         push    eax
  207.         mov     eax, esp
  208.         push    RetryOrCancelBtn
  209.         push    2
  210.         push    eax
  211.         push    3
  212.         call    SayErr
  213.         add     esp, 3*4
  214.         mov     ebx, readinfo
  215.         test    eax, eax
  216.         jz      .attr_retry
  217.         jmp     delete_active_screen
  218. .readok:
  219.         cmp     ebx, 2
  220.         jb      .nounicode
  221.         cmp     word [ebp+viewer_data.buf], 0xFEFF
  222.         jz      @f
  223.         cmp     word [ebp+viewer_data.buf], 0xFFFE
  224.         jnz     .nounicode
  225.         or      byte [ebp+viewer_data.flags], 4
  226. @@:
  227.         mov     [ebp+viewer_data.encoding], encodings.unicode
  228. .nounicode:
  229. viewer_OnRedraw:
  230.         or      [cursor_x], -1
  231.         or      [cursor_y], -1
  232.         call    viewer_set_keybar
  233.         call    viewer_draw_text
  234.         ret
  235.  
  236. viewer_skip_unicode_marker:
  237.         cmp     [ebp+viewer_data.encoding], encodings.unicode
  238.         jnz     @f
  239.         cmp     [bForHex], 0
  240.         jnz     @f
  241.         cmp     dword [ebp+viewer_data.buf_start], 0
  242.         jnz     @f
  243.         cmp     dword [ebp+viewer_data.buf_start+4], 0
  244.         jnz     @f
  245.         lea     eax, [ebp+viewer_data.buf]
  246.         cmp     eax, [ebp+viewer_data.buf_pos]
  247.         jnz     @f
  248.         cmp     word [eax], 0xFFFE
  249.         jz      .skip
  250.         cmp     word [eax], 0xFEFF
  251.         jnz     @f
  252. .skip:
  253.         add     [ebp+viewer_data.buf_pos], 2
  254. @@:
  255.         ret
  256.  
  257. viewer_load_next:
  258.         mov     eax, dword [ebp+viewer_data.buf_start]
  259.         add     eax, 8192
  260.         mov     dword [ebp+viewer_data.buf_start], eax
  261.         mov     edx, dword [ebp+viewer_data.buf_start+4]
  262.         adc     edx, 0
  263.         mov     dword [ebp+viewer_data.buf_start+4], edx
  264.         add     eax, 16384-8192
  265.         adc     edx, 0
  266.         mov     dword [readinfo.first], eax
  267.         mov     dword [readinfo.first+4], edx
  268.         mov     dword [readinfo.size], 8192
  269.         lea     edi, [ebp+viewer_data.buf]
  270.         lea     esi, [edi+8192]
  271.         mov     ecx, (16384-8192)/4
  272.         rep     movsd
  273.         mov     [readinfo.data], edi
  274.         lea     eax, [ebp+viewer_data.filename]
  275.         mov     [readinfo.name], eax
  276. .readretry:
  277.         mov     ebx, readinfo
  278.         mov     eax, [ebp+viewer_data.hPlugin]
  279.         test    eax, eax
  280.         jz      .native
  281.         push    ecx ebp
  282.         push    8192
  283.         push    [ebx+readinfo.data-readinfo]
  284.         push    [ebp+viewer_data.hWorkFile]
  285.         call    [eax+PluginInfo.read]
  286.         pop     ebp ecx
  287.         mov     ebx, eax
  288.         cmp     eax, -1
  289.         jnz     .readok
  290.         xor     ebx, ebx
  291.         jmp     .readok
  292. .native:
  293.         push    70
  294.         pop     eax
  295.         int     40h
  296.         test    eax, eax
  297.         jz      .readok
  298.         cmp     eax, 6
  299.         jz      .readok
  300. .readerr:
  301.         call    ask_retry_ignore
  302.         jz      .readretry
  303. .readok:
  304.         sub     [ebp+viewer_data.buf_pos], 8192
  305.         add     ebx, 16384-8192
  306.         mov     [ebp+viewer_data.buf_size], ebx
  307.         mov     eax, [ebp+viewer_data.buf_pos]
  308.         cmp     ebx, 16384-8192
  309.         ret
  310.  
  311. viewer_get_next_char:
  312.         pusha
  313.         call    viewer_skip_unicode_marker
  314.         mov     eax, [ebp+viewer_data.buf_pos]
  315.         lea     ecx, [ebp+viewer_data.buf]
  316.         add     ecx, [ebp+viewer_data.buf_size]
  317.         cmp     eax, ecx
  318.         jb      .buffered
  319.         mov     al, ' '
  320.         sub     ecx, ebp
  321.         cmp     ecx, viewer_data.buf + 16384
  322.         jb      .err
  323.         call    viewer_load_next
  324.         jnz     .buffered
  325. .err:
  326.         stc
  327.         popa
  328.         ret
  329. .buffered:
  330.         cmp     [ebp+viewer_data.encoding], encodings.unicode
  331.         jz      .unicode
  332.         mov     al, [eax]
  333. .done:
  334.         mov     [esp+28], al
  335.         inc     [ebp+viewer_data.buf_pos]
  336.         clc
  337.         popa
  338.         ret
  339.  
  340. .unicode:
  341.         inc     [ebp+viewer_data.buf_pos]
  342.         cmp     [bForHex], 0
  343.         jnz     @f
  344.         call    read_unicode_char
  345.         jmp     .done
  346. @@:
  347.         mov     ax, [eax]
  348.         mov     [esp+29], ah
  349.         jmp     .done
  350.  
  351. viewer_get_prev_char:
  352.         pusha
  353.         lea     ecx, [ebp+viewer_data.buf]
  354.         cmp     [ebp+viewer_data.buf_pos], ecx
  355.         ja      .buffered
  356.         mov     eax, dword [ebp+viewer_data.buf_start]
  357.         mov     edx, dword [ebp+viewer_data.buf_start+4]
  358.         test    eax, eax
  359.         jnz     @f
  360.         test    edx, edx
  361.         jnz     @f
  362.         stc
  363.         jmp     .ret
  364. @@:
  365.         sub     eax, 8192
  366.         sbb     edx, 0
  367.         jnc     @f
  368.         xor     eax, eax
  369.         xor     edx, edx
  370. @@:
  371.         call    viewer_seek
  372.         add     [ebp+viewer_data.buf_pos], 8192
  373. .buffered:
  374.         mov     eax, [ebp+viewer_data.buf_pos]
  375.         dec     eax
  376.         cmp     [ebp+viewer_data.encoding], encodings.unicode
  377.         jz      .unicode
  378.         mov     [ebp+viewer_data.buf_pos], eax
  379.         mov     al, [eax]
  380.         mov     [esp+28], al
  381. .done:
  382.         clc
  383. .ret:
  384.         popa
  385.         ret
  386.  
  387. .unicode:
  388.         dec     eax
  389.         mov     [ebp+viewer_data.buf_pos], eax
  390.         call    read_unicode_char
  391.         jmp     .done
  392.  
  393. read_unicode_char:
  394.         mov     ax, [eax]
  395. uni2ansi_char:
  396.         test    [ebp+viewer_data.flags], 4
  397.         jz      @f
  398.         xchg    al, ah
  399. @@:
  400.         cmp     ax, 0x80
  401.         jb      .ret
  402.         cmp     ax, 0x401
  403.         jz      .yo1
  404.         cmp     ax, 0x451
  405.         jz      .yo2
  406.         cmp     ax, 0x410
  407.         jb      .unk
  408.         cmp     ax, 0x440
  409.         jb      .rus1
  410.         cmp     ax, 0x450
  411.         jb      .rus2
  412. .unk:
  413.         mov     al, ' '
  414. .ret:
  415.         ret
  416. .yo1:
  417.         mov     al, 'Ё'
  418.         ret
  419. .yo2:
  420.         mov     al, 'ё'
  421.         ret
  422. .rus1:
  423. ; 0x410-0x43F -> 0x80-0xAF
  424.         add     al, 0x70
  425.         ret
  426. .rus2:
  427. ; 0x440-0x44F -> 0xE0-0xEF
  428.         add     al, 0xA0
  429.         ret
  430.  
  431. viewer_clear_selection:
  432.         and     dword [ebp+viewer_data.selected_start], 0
  433.         and     dword [ebp+viewer_data.selected_start+4], 0
  434.         and     dword [ebp+viewer_data.selected_len], 0
  435.         and     dword [ebp+viewer_data.selected_len+4], 0
  436.         ret
  437.  
  438. fld_uint64:
  439.         fild    qword [eax]
  440.         test    byte [eax+7], 80h
  441.         jz      .ret
  442.         fadd    [@f]
  443. .ret:
  444.         ret
  445. @@      dq      18446744073709551616.0 ;0x10000000000000000
  446.  
  447. viewer_draw_text:
  448.         call    viewer_seek_to_current
  449.         xor     eax, eax
  450.         xor     edx, edx
  451.         call    get_console_ptr
  452.         mov     ah, [view_status_color]
  453.         mov     ecx, [cur_width]
  454.         sub     ecx, 44
  455.         cmp     ecx, 20
  456.         jae     @f
  457.         mov     cl, 20
  458. @@:
  459.         call    viewedit_draw_filename
  460.         add     ecx, 11
  461.         rep     stosw
  462.         movzx   esi, [ebp+viewer_data.encoding]
  463.         lea     esi, [encodings.names+esi*8]
  464.         push    edi esi
  465.         dec     edi
  466.         dec     edi
  467.         std
  468.         add     esi, 8
  469. @@:
  470.         dec     esi
  471.         cmp     byte [esi], ' '
  472.         jz      @b
  473. @@:
  474.         lodsb
  475.         stosw
  476.         cmp     esi, [esp]
  477.         jae     @b
  478.         cld
  479.         pop     esi edi
  480.         mov     al, ' '
  481.         mov     cl, 13
  482.         rep     stosw
  483.         std
  484.         push    edi
  485.         mov     edx, dword [ebp+viewer_data.filesize+4]
  486.         mov     eax, dword [ebp+viewer_data.filesize]
  487.         mov     cl, 10
  488. @@:
  489.         push    eax
  490.         mov     eax, edx
  491.         xor     edx, edx
  492.         div     ecx
  493.         xchg    eax, [esp]
  494.         div     ecx
  495.         xchg    eax, edx
  496.         add     al, '0'
  497.         mov     ah, [view_status_color]
  498.         stosw
  499.         xchg    eax, edx
  500.         pop     edx
  501.         test    eax, eax
  502.         jnz     @b
  503.         test    edx, edx
  504.         jnz     @b
  505.         mov     al, ' '
  506.         mov     ah, [view_status_color]
  507.         stosw
  508.         cld
  509.         pop     edi
  510.         inc     edi
  511.         inc     edi
  512.         mov     al, ' '
  513.         mov     cl, 5
  514.         rep     stosw
  515. if lang eq ru
  516.         mov     al, 'К'
  517.         stosw
  518.         mov     al, 'о'
  519.         stosw
  520.         mov     al, 'л'
  521.         stosw
  522. else
  523.         mov     al, 'C'
  524.         stosw
  525.         mov     al, 'o'
  526.         stosw
  527.         mov     al, 'l'
  528.         stosw
  529. end if
  530.         mov     al, ' '
  531.         stosw
  532.         push    edi
  533.         mov     eax, dword [ebp+viewer_data.col]
  534.         mov     edx, dword [ebp+viewer_data.col+4]
  535.         test    edx, edx
  536.         jnz     .col_big
  537.         cmp     eax, 100000
  538.         jae     .col_big
  539.         mov     cl, 10
  540.         push    -'0'
  541. @@:
  542.         div     ecx
  543.         push    edx
  544.         xor     edx, edx
  545.         test    eax, eax
  546.         jnz     @b
  547. @@:
  548.         pop     eax
  549.         add     eax, '0'
  550.         jz      .col_done
  551.         mov     ah, [view_status_color]
  552.         stosw
  553.         jmp     @b
  554. .col_big:
  555.         push    eax
  556.         mov     al, '.'
  557.         mov     ah, [view_status_color]
  558.         stosw
  559.         stosw
  560.         stosw
  561.         xor     eax, eax
  562.         xchg    eax, edx
  563.         mov     cl, 100
  564.         div     ecx
  565.         pop     eax
  566.         div     ecx
  567.         mov     cl, 10
  568.         xor     eax, eax
  569.         xchg    eax, edx
  570.         div     ecx
  571.         add     al, '0'
  572.         mov     ah, [view_status_color]
  573.         stosw
  574.         mov     al, dl
  575.         add     al, '0'
  576.         stosw
  577. .col_done:
  578.         pop     ecx
  579.         add     ecx, 10*2
  580.         sub     ecx, edi
  581.         shr     ecx, 1
  582.         mov     al, ' '
  583.         mov     ah, [view_status_color]
  584.         rep     stosw
  585.         finit
  586.         fldcw   [fpu_cw]
  587.         mov     [tmp], 100
  588.         lea     eax, [ebp+viewer_data.filesize]
  589.         cmp     dword [eax], 0
  590.         jnz     @f
  591.         cmp     dword [eax+4], 0
  592.         jz      .size_zero
  593. @@:
  594.         call    fld_uint64
  595.         lea     eax, [ebp+viewer_data.cur_pos]
  596.         call    fld_uint64
  597.         fdivrp
  598.         fimul   [_100d]
  599.         fistp   [tmp]
  600. .size_zero:
  601.         mov     byte [edi-2], '%'
  602.         sub     edi, 4
  603.         mov     eax, [tmp]
  604.         mov     cl, 10
  605. @@:
  606.         xor     edx, edx
  607.         div     ecx
  608.         xchg    eax, edx
  609.         add     al, '0'
  610.         mov     [edi], al
  611.         sub     edi, 2
  612.         xchg    eax, edx
  613.         test    eax, eax
  614.         jnz     @b
  615.         xor     eax, eax
  616.         push    1
  617.         pop     edx
  618.         call    get_console_ptr
  619.         test    [ebp+viewer_data.flags], 1
  620.         jnz     .DrawHex
  621.         push    2
  622.         pop     edx
  623.         xor     ecx, ecx
  624.         mov     dword [scrpos], ecx
  625.         mov     dword [scrpos+4], ecx
  626.         mov     dword [viewer_right_side], ecx
  627.         mov     dword [viewer_right_side+4], ecx
  628. .1:
  629.         call    viewer_get_next_char
  630.         jc      .done
  631. .2:
  632.         cmp     al, 0xD
  633.         jz      .newline
  634.         cmp     al, 0xA
  635.         jz      .newline
  636.         cmp     ecx, [cur_width]
  637.         jb      .no_newline
  638.         test    [ebp+viewer_data.flags], 2
  639.         jnz     .no_newline
  640. .newline:
  641.         push    eax
  642.         mov     ecx, dword [scrpos]
  643.         mov     eax, dword [scrpos+4]
  644.         sub     ecx, dword [ebp+viewer_data.col]
  645.         sbb     eax, dword [ebp+viewer_data.col+4]
  646.         ja      .line_filled
  647.         jb      .line_full
  648.         cmp     ecx, [cur_width]
  649.         ja      .line_filled
  650.         jmp     @f
  651. .line_full:
  652.         xor     ecx, ecx
  653. @@:
  654.         test    ecx, ecx
  655.         jnz     @f
  656.         mov     eax, dword [scrpos]
  657.         or      eax, dword [scrpos+4]
  658.         jz      @f
  659.         inc     ecx
  660. @@:
  661.         sub     ecx, [cur_width]
  662.         neg     ecx
  663.         mov     al, ' '
  664.         mov     ah, [view_normal_color]
  665.         rep     stosw
  666. .line_filled:
  667.         mov     eax, dword [scrpos]
  668.         sub     eax, dword [viewer_right_side]
  669.         mov     eax, dword [scrpos+4]
  670.         sbb     eax, dword [viewer_right_side+4]
  671.         jb      @f
  672.         mov     eax, dword [scrpos]
  673.         mov     dword [viewer_right_side], eax
  674.         mov     eax, dword [scrpos+4]
  675.         mov     dword [viewer_right_side+4], eax
  676. @@:
  677.         xor     ecx, ecx
  678.         mov     dword [scrpos], ecx
  679.         mov     dword [scrpos+4], ecx
  680.         inc     edx
  681.         pop     eax
  682.         cmp     edx, [cur_height]
  683.         jae     .done
  684. .no_newline:
  685.         cmp     al, 0xD
  686.         jz      .3
  687.         cmp     al, 0xA
  688.         jz      .3
  689. .4:
  690.         test    al, al
  691.         jns     @f
  692.         movzx   esi, [ebp+viewer_data.encoding]
  693.         cmp     esi, encodings.unicode
  694.         jz      @f
  695.         shl     esi, 7
  696.         movzx   eax, al
  697.         mov     al, [encodings.tables-80h+esi+eax]
  698. @@:
  699.         cmp     al, 9
  700.         jz      .tab
  701.         call    .write_char
  702.         inc     ecx
  703.         jns     .1
  704.         push    edx
  705.         mov     eax, ecx
  706.         xor     edx, edx
  707.         div     [viewer_tabsize]
  708.         mov     ecx, edx
  709.         pop     edx
  710.         jmp     .1
  711. .3:
  712.         mov     bl, al
  713.         call    viewer_get_next_char
  714.         jc      .done
  715.         xor     bl, al
  716.         cmp     bl, 0xA xor 0xD
  717.         jz      .1
  718.         jmp     .2
  719. .tab:
  720.         push    edx
  721.         push    ecx
  722.         mov     eax, ecx
  723.         mov     ecx, [viewer_tabsize]
  724.         xor     edx, edx
  725.         div     ecx
  726.         pop     eax
  727.         sub     ecx, edx
  728.         pop     edx
  729.         add     eax, ecx
  730.         test    [ebp+viewer_data.flags], 2
  731.         jnz     @f
  732.         cmp     eax, [cur_width]
  733.         jbe     @f
  734.         sub     eax, [cur_width]
  735.         sub     ecx, eax
  736.         mov     eax, [cur_width]
  737. @@:
  738.         push    eax
  739.         mov     al, ' '
  740. @@:
  741.         call    .write_char
  742.         loop    @b
  743.         pop     ecx
  744.         jmp     .1
  745. .done:
  746.         setc    [ebp+viewer_data.bEofReached]
  747. .done2:
  748.         inc     edx
  749.         cmp     edx, [cur_height]
  750.         jnc     @f
  751.         mov     eax, dword [ebp+viewer_data.cur_pos]
  752.         or      eax, dword [ebp+viewer_data.cur_pos+4]
  753.         jz      @f
  754.         call    viewer_seek_to_current
  755.         call    viewer_prev_newline
  756.         jmp     viewer_draw_text
  757. @@:
  758.         push    edi
  759.         xor     eax, eax
  760.         mov     edx, [cur_height]
  761.         dec     edx
  762.         call    get_console_ptr
  763.         mov     ecx, edi
  764.         pop     edi
  765.         sub     ecx, edi
  766.         shr     ecx, 1
  767.         mov     al, ' '
  768.         mov     ah, [view_normal_color]
  769.         rep     stosw
  770.         cmp     [ebp+viewer_data.bEofReached], 0
  771.         jz      @f
  772.         xor     edx, edx
  773.         mov     eax, [cur_width]
  774.         sub     eax, 4
  775.         call    get_console_ptr
  776.         mov     ah, [view_status_color]
  777.         mov     al, '1'
  778.         stosw
  779.         mov     al, '0'
  780.         stosw
  781.         stosw
  782. @@:
  783.         call    draw_image
  784.         ret
  785. .DrawHex:
  786.         xor     esi, esi
  787.         mov     [ebp+viewer_data.bEofReached], 0
  788. .line:
  789.         mov     al, ' '
  790.         mov     ah, [view_normal_color]
  791.         push    edi
  792.         mov     ecx, [cur_width]
  793.         rep     stosw
  794.         mov     ebx, edi
  795.         pop     edi
  796.         mov     [bForHex], 1
  797.         call    viewer_get_next_char
  798.         mov     [bForHex], 0
  799.         jc      .hexdone
  800.         push    eax
  801.         push    edi
  802.         add     edi, 36*2
  803.         mov     al, 0xB3
  804.         mov     ah, [view_normal_color]
  805.         call    .safechar
  806.         pop     edi
  807.         mov     eax, dword [ebp+viewer_data.cur_pos]
  808.         mov     edx, dword [ebp+viewer_data.cur_pos+4]
  809.         push    esi
  810.         shl     esi, 4
  811.         add     eax, esi
  812.         adc     edx, 0
  813.         pop     esi
  814.         push    eax
  815.         mov     al, dl
  816.         shr     eax, 4
  817.         and     al, 0xF
  818.         call    .hex_digit
  819.         mov     al, dl
  820.         and     al, 0xF
  821.         call    .hex_digit
  822.         pop     eax
  823.         push    8
  824.         pop     ecx
  825.         add     edi, 7*2
  826.         std
  827. @@:
  828.         push    eax
  829.         and     al, 0xF
  830.         call    .hex_digit
  831.         pop     eax
  832.         shr     eax, 4
  833.         loop    @b
  834.         cld
  835.         add     edi, 9*2
  836.         mov     al, ':'
  837.         mov     ah, [view_normal_color]
  838.         stosw
  839.         mov     al, ' '
  840.         stosw
  841.         xor     ecx, ecx
  842.         pop     eax
  843.         jmp     @f
  844. .hexchar:
  845.         mov     [bForHex], 1
  846.         call    viewer_get_next_char
  847.         mov     [bForHex], 0
  848.         jc      .hexdone
  849. @@:
  850.         cmp     [ebp+viewer_data.encoding], encodings.unicode
  851.         jz      .hexchar_unicode
  852.         push    eax
  853.         shr     al, 4
  854.         call    .hex_digit
  855.         pop     eax
  856.         push    eax
  857.         and     al, 0xF
  858.         call    .hex_digit
  859.         mov     al, ' '
  860.         call    .safechar
  861.         pop     eax
  862.         push    edi
  863.         add     edi, 48*2
  864.         push    ecx
  865.         shl     ecx, 2
  866.         sub     edi, ecx
  867.         pop     ecx
  868.         cmp     ecx, 8
  869.         jb      @f
  870.         sub     edi, 4
  871. @@:
  872.         test    al, al
  873.         jns     @f
  874.         movzx   edx, [ebp+viewer_data.encoding]
  875.         shl     edx, 7
  876.         movzx   eax, al
  877.         mov     al, [encodings.tables+eax+edx-80h]
  878.         mov     ah, [view_normal_color]
  879. @@:
  880.         call    .safechar
  881.         pop     edi
  882.         inc     ecx
  883.         cmp     ecx, 8
  884.         jnz     @f
  885.         mov     al, 0xB3
  886.         call    .safechar
  887.         mov     al, ' '
  888.         call    .safechar
  889. @@:
  890.         cmp     ecx, 16
  891.         jnz     .hexchar
  892.         jmp     .hexchar_nextline
  893. .hexchar_unicode:
  894.         push    eax
  895.         shr     eax, 12
  896.         call    .hex_digit
  897.         pop     eax
  898.         push    eax
  899.         shr     eax, 8
  900.         and     al, 0xF
  901.         call    .hex_digit
  902.         pop     eax
  903.         push    eax
  904.         shr     al, 4
  905.         call    .hex_digit
  906.         pop     eax
  907.         push    eax
  908.         and     al, 0xF
  909.         call    .hex_digit
  910.         mov     al, ' '
  911.         mov     ah, [view_normal_color]
  912.         call    .safechar
  913.         pop     eax
  914.         push    edi
  915.         add     edi, 38*2
  916.         push    ecx
  917.         shl     ecx, 3
  918.         sub     edi, ecx
  919.         pop     ecx
  920.         cmp     ecx, 4
  921.         jb      @f
  922.         sub     edi, 4
  923. @@:
  924.         call    uni2ansi_char
  925.         mov     ah, [view_normal_color]
  926.         call    .safechar
  927.         pop     edi
  928.         inc     ecx
  929.         cmp     ecx, 4
  930.         jnz     @f
  931.         mov     al, 0xB3
  932.         call    .safechar
  933.         mov     al, ' '
  934.         call    .safechar
  935. @@:
  936.         cmp     ecx, 8
  937.         jnz     .hexchar
  938. .hexchar_nextline:
  939.         mov     edi, ebx
  940.         add     esi, 3
  941.         mov     edx, esi
  942.         cmp     esi, [cur_height]
  943.         jae     .done2
  944.         dec     esi
  945.         dec     esi
  946.         jmp     .line
  947. .hexdone:
  948.         mov     [ebp+viewer_data.bEofReached], 1
  949.         mov     edi, ebx
  950.         lea     edx, [esi+2]
  951.         jmp     .done2
  952.  
  953. .hex_digit:
  954.         push    eax
  955.         cmp     al, 10
  956.         sbb     al, 69h
  957.         das
  958.         mov     ah, [view_normal_color]
  959.         call    .safechar
  960.         pop     eax
  961.         ret
  962. .safechar:
  963.         cmp     edi, ebx
  964.         jae     @f
  965.         stosw
  966. @@:
  967.         ret
  968. .write_char:
  969.         push    ecx eax
  970.         mov     ecx, dword [scrpos]
  971.         mov     eax, dword [scrpos+4]
  972.         sub     ecx, dword [ebp+viewer_data.col]
  973.         sbb     eax, dword [ebp+viewer_data.col+4]
  974.         jb      .left
  975.         ja      .skip
  976.         test    ecx, ecx
  977.         jnz     @f
  978.         mov     eax, dword [scrpos]
  979.         or      eax, dword [scrpos+4]
  980.         jnz     .skip
  981. @@:
  982.         cmp     ecx, [cur_width]
  983.         ja      .skip
  984.         jb      .do
  985.         mov     al, '>'
  986.         mov     [edi-2], al
  987.         mov     al, [view_arrows_color]
  988.         mov     [edi-1], al
  989.         jmp     .skip
  990. .left:
  991.         mov     eax, dword [scrpos]
  992.         or      eax, dword [scrpos+4]
  993.         jnz     .skip
  994.         mov     al, '<'
  995.         mov     ah, [view_arrows_color]
  996.         stosw
  997.         jmp     .skip
  998. .do:
  999.         mov     al, [esp]
  1000.         mov     ah, [view_normal_color]
  1001.         push    edx
  1002.         mov     ecx, [ebp+viewer_data.buf_pos]
  1003.         sub     ecx, ebp
  1004.         sub     ecx, viewer_data.buf + 1
  1005.         xor     edx, edx
  1006.         add     ecx, dword [ebp+viewer_data.buf_start]
  1007.         adc     edx, dword [ebp+viewer_data.buf_start+4]
  1008.         sub     ecx, dword [ebp+viewer_data.selected_start]
  1009.         sbb     edx, dword [ebp+viewer_data.selected_start+4]
  1010.         cmp     edx, dword [ebp+viewer_data.selected_len+4]
  1011.         ja      .color_ok
  1012.         jb      @f
  1013.         cmp     ecx, dword [ebp+viewer_data.selected_len]
  1014.         jae     .color_ok
  1015. @@:
  1016.         mov     ah, [view_selected_color]
  1017. .color_ok:
  1018.         pop     edx
  1019.         stosw
  1020. .skip:
  1021.         pop     eax ecx
  1022.         add     dword [scrpos], 1
  1023.         adc     dword [scrpos+4], 0
  1024.         ret
  1025.  
  1026. viewedit_draw_filename:
  1027.         lea     esi, [ebp+viewer_data.filename]
  1028.         xor     edx, edx
  1029.         cmp     [ebp+viewer_data.hPlugin], edx
  1030.         mov     dl, 3
  1031.         jz      .5
  1032.         mov     dl, 1
  1033. .5:
  1034.         lodsb
  1035.         cmp     al, '/'
  1036.         jnz     @f
  1037.         dec     edx
  1038.         jz      .6
  1039. @@:
  1040.         stosw
  1041.         loop    .5
  1042. .6:
  1043.         dec     ecx
  1044.         stosw
  1045.         push    esi
  1046. @@:
  1047.         inc     esi
  1048.         cmp     byte [esi-1], 0
  1049.         jnz     @b
  1050.         sub     esi, [esp]
  1051.         dec     esi
  1052.         cmp     ecx, esi
  1053.         jae     .7
  1054.         mov     al, '.'
  1055.         stosw
  1056.         stosw
  1057.         stosw
  1058.         sub     ecx, 3
  1059.         sub     esi, ecx
  1060.         add     [esp], esi
  1061. .7:
  1062.         pop     esi
  1063. @@:
  1064.         lodsb
  1065.         test    al, al
  1066.         jz      @f
  1067.         dec     ecx
  1068.         stosw
  1069.         jmp     @b
  1070. @@:
  1071.         mov     al, ' '
  1072.         ret
  1073.  
  1074. viewer_seek_to_current:
  1075.         mov     eax, dword [ebp+viewer_data.cur_pos]
  1076.         mov     edx, dword [ebp+viewer_data.cur_pos+4]
  1077. viewer_seek:
  1078.         push    eax edx
  1079.         sub     eax, dword [ebp+viewer_data.buf_start]
  1080.         sbb     edx, dword [ebp+viewer_data.buf_start+4]
  1081.         jb      .prev
  1082.         ja      .next
  1083.         cmp     eax, 16384
  1084.         jae     .next
  1085.         lea     eax, [ebp+viewer_data.buf+eax]
  1086.         mov     [ebp+viewer_data.buf_pos], eax
  1087.         pop     edx eax
  1088.         ret
  1089. .prev:
  1090.         inc     edx
  1091.         jnz     .read_full
  1092.         and     eax, not 511
  1093.         cmp     eax, -16384
  1094.         jbe     .read_full
  1095.         lea     edi, [ebp+viewer_data.buf+16384-4]
  1096.         lea     esi, [edi+eax]
  1097.         lea     ecx, [eax+16384]
  1098.         push    ecx
  1099.         shr     ecx, 2
  1100.         std
  1101.         rep     movsd
  1102.         cld
  1103.         pop     ecx
  1104.         add     dword [ebp+viewer_data.buf_start], eax
  1105.         adc     dword [ebp+viewer_data.buf_start+4], -1
  1106.         neg     eax
  1107.         cmp     dword [ebp+viewer_data.buf_size], ecx
  1108.         jb      .doread
  1109.         mov     dword [ebp+viewer_data.buf_size], ecx
  1110.         jmp     .doread
  1111. .read_full:
  1112.         pop     edx eax
  1113.         push    eax edx
  1114.         and     eax, not 511
  1115.         sub     eax, 8192-512
  1116.         sbb     edx, 0
  1117.         jnc     @f
  1118.         xor     eax, eax
  1119.         xor     edx, edx
  1120. @@:
  1121.         mov     dword [ebp+viewer_data.buf_start], eax
  1122.         mov     dword [ebp+viewer_data.buf_start+4], edx
  1123.         and     dword [ebp+viewer_data.buf_size], 0
  1124.         mov     eax, 16384
  1125. .doread:
  1126.         mov     ebx, readinfo
  1127.         push    dword [ebp+viewer_data.buf_start]
  1128.         pop     dword [ebx+4]
  1129.         push    dword [ebp+viewer_data.buf_start+4]
  1130.         pop     dword [ebx+8]
  1131.         mov     [ebx+12], eax
  1132.         lea     eax, [ebp+viewer_data.buf]
  1133.         mov     [ebx+16], eax
  1134.         lea     eax, [ebp+viewer_data.filename]
  1135.         mov     [ebx+21], eax
  1136.         call    .q
  1137.         cmp     ebx, [readinfo.size]
  1138.         jnz     @f
  1139.         add     ebx, [ebp+viewer_data.buf_size]
  1140. @@:
  1141. .ret:
  1142.         mov     [ebp+viewer_data.buf_size], ebx
  1143.         pop     edx eax
  1144.         sub     eax, dword [ebp+viewer_data.buf_start]
  1145.         lea     eax, [ebp+eax+viewer_data.buf]
  1146.         mov     [ebp+viewer_data.buf_pos], eax
  1147.         ret
  1148. .next:
  1149.         or      eax, 511
  1150.         sub     eax, 16384-1
  1151.         sbb     edx, 0
  1152.         jnz     .read_full
  1153.         cmp     eax, 16384
  1154.         jae     .read_full
  1155.         cmp     [ebp+viewer_data.buf_size], 16384
  1156.         jb      .read_full
  1157.         lea     edi, [ebp+viewer_data.buf]
  1158.         lea     esi, [edi+eax]
  1159.         mov     ecx, 16384
  1160.         sub     ecx, eax
  1161.         shr     ecx, 2
  1162.         rep     movsd
  1163.         add     dword [ebp+viewer_data.buf_start], eax
  1164.         adc     dword [ebp+viewer_data.buf_start+4], 0
  1165.         mov     ebx, readinfo
  1166.         mov     [ebx+16], edi
  1167.         sub     edi, ebp
  1168.         sub     edi, viewer_data.buf
  1169.         mov     edx, dword [ebp+viewer_data.buf_start]
  1170.         add     edx, edi
  1171.         mov     [ebx+4], edx
  1172.         mov     edx, dword [ebp+viewer_data.buf_start+4]
  1173.         adc     edx, 0
  1174.         mov     [ebx+8], edx
  1175.         mov     [ebx+12], eax
  1176.         lea     eax, [ebp+viewer_data.filename]
  1177.         mov     [ebx+21], eax
  1178.         call    .q
  1179.         sub     ebx, [readinfo.size]
  1180.         add     ebx, 16384
  1181.         jmp     .ret
  1182.  
  1183. .q:
  1184.         mov     ebx, readinfo
  1185.         mov     eax, [ebp+viewer_data.hPlugin]
  1186.         test    eax, eax
  1187.         jz      .native
  1188.         push    ebp
  1189.         push    dword [ebx+12]
  1190.         push    dword [ebx+16]
  1191.         push    [ebp+viewer_data.hWorkFile]
  1192.         push    eax
  1193.         push    dword [ebx+8]
  1194.         push    dword [ebx+4]
  1195.         push    [ebp+viewer_data.hWorkFile]
  1196.         call    [eax+PluginInfo.setpos]
  1197.         pop     eax
  1198.         call    [eax+PluginInfo.read]
  1199.         pop     ebp
  1200.         mov     ebx, eax
  1201.         cmp     eax, -1
  1202.         jnz     @f
  1203.         xor     ebx, ebx
  1204. @@:
  1205.         ret
  1206. .native:
  1207.         push    70
  1208.         pop     eax
  1209.         int     40h
  1210.         test    eax, eax
  1211.         jz      .readok
  1212.         cmp     eax, 6
  1213.         jz      .readok
  1214. .readerr:
  1215.         call    ask_retry_ignore
  1216.         jz      .q
  1217. .readok:
  1218.         ret
  1219.  
  1220. ask_retry_ignore:
  1221.         push    esi
  1222.         lea     esi, [ebp+viewer_data.filename]
  1223.         push    esi
  1224.         push    aCannotReadFile
  1225.         call    get_error_msg
  1226.         push    eax
  1227.         mov     eax, esp
  1228.         push    RetryOrIgnoreBtn
  1229.         push    2
  1230.         push    eax
  1231.         push    3
  1232.         call    SayErr
  1233.         add     esp, 3*4
  1234.         pop     esi
  1235.         test    eax, eax
  1236.         ret
  1237.  
  1238. viewer_set_curpos:
  1239.         mov     eax, [ebp+viewer_data.buf_pos]
  1240.         sub     eax, ebp
  1241.         sub     eax, viewer_data.buf
  1242.         xor     edx, edx
  1243.         add     eax, dword [ebp+viewer_data.buf_start]
  1244.         adc     edx, dword [ebp+viewer_data.buf_start+4]
  1245.         mov     dword [ebp+viewer_data.cur_pos], eax
  1246.         mov     dword [ebp+viewer_data.cur_pos+4], edx
  1247.         ret
  1248.  
  1249. viewer_next_newline:
  1250.         test    [ebp+viewer_data.flags], 1
  1251.         jz      .nohex
  1252.         push    8
  1253.         pop     ecx
  1254.         cmp     [ebp+viewer_data.encoding], encodings.unicode
  1255.         jz      @f
  1256.         add     ecx, ecx
  1257. @@:
  1258.         call    viewer_get_next_char
  1259.         jc      @f
  1260.         loop    @b
  1261.         call    viewer_set_curpos
  1262.         clc
  1263. @@:     ret
  1264. .nohex:
  1265.         xor     ecx, ecx
  1266. @@:
  1267.         call    viewer_get_next_char
  1268.         jc      .ret
  1269.         cmp     al, 0xD
  1270.         jz      .1
  1271.         cmp     al, 0xA
  1272.         jz      .1
  1273.         cmp     al, 9
  1274.         jz      .tab
  1275.         inc     ecx
  1276. .next:
  1277.         test    [ebp+viewer_data.flags], 2
  1278.         jnz     @b
  1279.         cmp     ecx, [cur_width]
  1280.         jbe     @b
  1281.         call    viewer_get_prev_char
  1282.         jmp     .2
  1283. .tab:
  1284.         push    ecx
  1285.         mov     eax, ecx
  1286.         mov     ecx, [viewer_tabsize]
  1287.         xor     edx, edx
  1288.         div     ecx
  1289.         sub     ecx, edx
  1290.         add     [esp], ecx
  1291.         pop     ecx
  1292.         jmp     .next
  1293. .1:
  1294.         mov     cl, al
  1295.         call    viewer_get_next_char
  1296.         jc      .ret
  1297.         xor     cl, al
  1298.         cmp     cl, 0xD xor 0xA
  1299.         jz      .2
  1300.         dec     [ebp+viewer_data.buf_pos]
  1301.         cmp     [ebp+viewer_data.encoding], encodings.unicode
  1302.         jnz     .2
  1303.         dec     [ebp+viewer_data.buf_pos]
  1304. .2:
  1305.         clc
  1306. .ret:
  1307.         pushf
  1308.         call    viewer_set_curpos
  1309.         popf
  1310.         ret
  1311.  
  1312. viewer_prev_newline:
  1313.         test    [ebp+viewer_data.flags], 1
  1314.         jz      .nohex
  1315.         push    8
  1316.         pop     ecx
  1317.         cmp     [ebp+viewer_data.encoding], encodings.unicode
  1318.         jz      @f
  1319.         add     ecx, ecx
  1320. @@:
  1321.         call    viewer_get_prev_char
  1322.         jc      @f
  1323.         loop    @b
  1324. @@:     call    viewer_set_curpos
  1325.         ret
  1326. .nohex:
  1327.         mov     eax, 8192
  1328.         push    eax
  1329.         cdq
  1330.         div     [cur_width]
  1331.         pop     eax
  1332.         sub     eax, edx
  1333.         mov     edx, eax
  1334.         call    viewer_get_prev_char
  1335.         jc      .0
  1336.         dec     edx
  1337.         cmp     al, 0xD
  1338.         jz      .2
  1339.         cmp     al, 0xA
  1340.         jnz     .3
  1341. .2:
  1342.         mov     cl, al
  1343.         call    viewer_get_prev_char
  1344.         jc      .0
  1345.         dec     edx
  1346.         xor     cl, al
  1347.         cmp     cl, 0xD xor 0xA
  1348.         jnz     .3
  1349. @@:
  1350.         call    viewer_get_prev_char
  1351.         jc      .0
  1352.         dec     edx
  1353.         jz      .0
  1354. .3:
  1355.         cmp     al, 0xD
  1356.         jz      .1
  1357.         cmp     al, 0xA
  1358.         jnz     @b
  1359. .1:
  1360.         call    viewer_get_next_char
  1361. .0:
  1362.         push    dword [ebp+viewer_data.cur_pos+4]
  1363.         push    dword [ebp+viewer_data.cur_pos]
  1364.         call    viewer_set_curpos
  1365. @@:
  1366.         push    dword [ebp+viewer_data.cur_pos+4]
  1367.         push    dword [ebp+viewer_data.cur_pos]
  1368.         call    viewer_next_newline
  1369.         jc      .ret3
  1370.         mov     eax, dword [ebp+viewer_data.cur_pos]
  1371.         mov     edx, dword [ebp+viewer_data.cur_pos+4]
  1372.         sub     eax, [esp+8]
  1373.         sbb     edx, [esp+12]
  1374.         jae     .ret3
  1375.         pop     eax
  1376.         pop     eax
  1377.         jmp     @b
  1378. .ret3:
  1379.         pop     dword [ebp+viewer_data.cur_pos]
  1380.         pop     dword [ebp+viewer_data.cur_pos+4]
  1381. .ret:
  1382.         pop     eax
  1383.         pop     eax
  1384.         jmp     viewer_seek_to_current
  1385.  
  1386. viewer_set_keybar:
  1387.         mov     eax, keybar_viewer
  1388. if lang eq ru
  1389.         test    [ebp+viewer_data.flags], 1
  1390.         jnz     .hex
  1391.         mov     dword [eax+(4-1)*6], 'Код '
  1392.         mov     word [eax+(4-1)*6+4], '  '
  1393.         jmp     @f
  1394. .hex:
  1395.         mov     dword [eax+(4-1)*6], 'Текс'
  1396.         mov     word [eax+(4-1)*6+4], 'т '
  1397. @@:
  1398.         test    [ebp+viewer_data.flags], 2
  1399.         jnz     .unwrap
  1400.         mov     dword [eax+6], 'Разв'
  1401.         mov     word [eax+6+4], 'ер'
  1402.         jmp     @f
  1403. .unwrap:
  1404.         mov     dword [eax+6], 'Свер'
  1405.         mov     word [eax+6+4], 'н '
  1406. @@:
  1407. else
  1408.         test    [ebp+viewer_data.flags], 1
  1409.         jnz     .hex
  1410.         mov     dword [eax+(4-1)*6], 'Hex '
  1411. ;        mov     word [eax+(4-1)*6+4], '  '
  1412.         jmp     @f
  1413. .hex:
  1414.         mov     dword [eax+(4-1)*6], 'Text'
  1415. ;        mov     word [eax+(4-1)*6+4], '  '
  1416. @@:
  1417.         test    [ebp+viewer_data.flags], 2
  1418.         jnz     .unwrap
  1419.         mov     dword [eax+6], 'Unwr'
  1420.         mov     word [eax+6+4], 'ap'
  1421.         jmp     @f
  1422. .unwrap:
  1423.         mov     dword [eax+6], 'Wrap'
  1424.         mov     word [eax+6+4], '  '
  1425. @@:
  1426. end if
  1427.         movzx   esi, [ebp+viewer_data.encoding]
  1428.         dec     esi
  1429.         jz      @f
  1430.         push    1
  1431.         pop     esi
  1432. @@:
  1433.         lea     esi, [encodings.names+esi*8]
  1434.         lea     edi, [eax+keybar_cp-keybar_viewer]
  1435.         movsd
  1436.         movsw
  1437.         jmp     draw_keybar
  1438.  
  1439. viewer_OnExit:
  1440.         mov     edx, [ebp+viewer_data.hPlugin]
  1441.         test    edx, edx
  1442.         jz      @f
  1443.         and     [ebp+viewer_data.hPlugin], 0
  1444.         push    edx ebp
  1445.         push    [ebp+viewer_data.hWorkFile]
  1446.         call    [edx+PluginInfo.close]
  1447.         pop     ebp edx
  1448.         mov     ebx, [ebp+viewer_data.hFile]
  1449.         call    close_handle_if_unused
  1450. @@:
  1451.         ret
  1452.  
  1453. viewer_IsHandleUsed:
  1454. editor_IsHandleUsed:
  1455.         cmp     edx, [ebp+viewer_data.hPlugin]
  1456.         jnz     @f
  1457.         cmp     ebx, [ebp+viewer_data.hFile]
  1458. @@:
  1459.         ret
  1460.  
  1461. viewer_OnKey:
  1462.         mov     esi, viewer_ctrlkeys
  1463.         jmp     process_ctrl_keys
  1464. .exit:
  1465.         call    viewer_OnExit
  1466.         jmp     delete_active_screen
  1467. .down:
  1468.         cmp     [ebp+viewer_data.bEofReached], 0
  1469.         jnz     .ret
  1470.         call    viewer_seek_to_current
  1471.         call    viewer_next_newline
  1472.         jc      .ret
  1473.         call    viewer_draw_text
  1474.         ret
  1475. .pgdn:
  1476.         cmp     [ebp+viewer_data.bEofReached], 0
  1477.         jnz     .ret
  1478.         call    viewer_seek_to_current
  1479.         mov     ebx, [cur_height]
  1480.         sub     ebx, 3
  1481. @@:
  1482.         call    viewer_next_newline
  1483.         jc      .ret
  1484.         dec     ebx
  1485.         jnz     @b
  1486.         call    viewer_draw_text
  1487.         ret
  1488. .up:
  1489.         call    viewer_seek_to_current
  1490.         call    viewer_prev_newline
  1491.         call    viewer_draw_text
  1492.         ret
  1493. .pgup:
  1494.         call    viewer_seek_to_current
  1495.         mov     ebx, [cur_height]
  1496.         sub     ebx, 3
  1497. @@:
  1498.         call    viewer_prev_newline
  1499.         dec     ebx
  1500.         jnz     @b
  1501. .done_redraw:
  1502.         call    viewer_draw_text
  1503. .ret:
  1504.         ret
  1505. .f8:
  1506.         movzx   esi, [ebp+viewer_data.encoding]
  1507.         dec     [ebp+viewer_data.encoding]
  1508.         jz      .done_redraw_keybar
  1509.         mov     [ebp+viewer_data.encoding], 1
  1510.         jmp     .done_redraw_keybar
  1511. .f2:
  1512.         xor     [ebp+viewer_data.flags], 2
  1513. .done_redraw_keybar:
  1514.         call    viewer_set_keybar
  1515.         jmp     .done_redraw
  1516. .f4:
  1517.         xor     [ebp+viewer_data.flags], 1
  1518.         pushf
  1519.         call    viewer_set_keybar
  1520.         popf
  1521.         jnz     .tohex
  1522.         push    1
  1523.         pop     eax
  1524.         cmp     [ebp+viewer_data.encoding], encodings.unicode
  1525.         jnz     @f
  1526.         add     eax, eax
  1527. @@:
  1528.         add     dword [ebp+viewer_data.cur_pos], eax
  1529.         adc     dword [ebp+viewer_data.cur_pos+4], 0
  1530.         call    viewer_seek_to_current
  1531.         call    viewer_prev_newline
  1532.         jmp     .done_redraw
  1533. .tohex:
  1534.         and     byte [ebp+viewer_data.cur_pos], 0xF0
  1535.         jmp     .done_redraw
  1536. .home:
  1537.         xor     eax, eax
  1538.         mov     dword [ebp+viewer_data.cur_pos], eax
  1539.         mov     dword [ebp+viewer_data.cur_pos+4], eax
  1540.         mov     dword [ebp+viewer_data.col], eax
  1541.         mov     dword [ebp+viewer_data.col+4], eax
  1542.         jmp     .done_redraw
  1543. .end:
  1544.         mov     eax, dword [ebp+viewer_data.filesize]
  1545.         mov     edx, dword [ebp+viewer_data.filesize+4]
  1546.         and     al, 0xF0
  1547.         mov     dword [ebp+viewer_data.cur_pos], eax
  1548.         mov     dword [ebp+viewer_data.cur_pos+4], edx
  1549.         and     dword [ebp+viewer_data.col], 0
  1550.         and     dword [ebp+viewer_data.col+4], 0
  1551.         jmp     .done_redraw
  1552. .right:
  1553.         add     dword [ebp+viewer_data.col], 1
  1554.         adc     dword [ebp+viewer_data.col+4], 0
  1555.         jnc     .done_redraw
  1556.         sub     dword [ebp+viewer_data.col], 1
  1557.         sbb     dword [ebp+viewer_data.col+4], 0
  1558.         ret
  1559. .left:
  1560.         sub     dword [ebp+viewer_data.col], 1
  1561.         sbb     dword [ebp+viewer_data.col+4], 0
  1562.         jnc     .done_redraw
  1563.         add     dword [ebp+viewer_data.col], 1
  1564.         adc     dword [ebp+viewer_data.col+4], 0
  1565.         ret
  1566. .ctrl_left:
  1567.         test    [ebp+viewer_data.flags], 1
  1568.         jnz     .ctrl_left_hex
  1569.         sub     dword [ebp+viewer_data.col], 20
  1570.         sbb     dword [ebp+viewer_data.col+4], 0
  1571.         jnc     .done_redraw
  1572. .ctrl_shift_left:
  1573.         and     dword [ebp+viewer_data.col], 0
  1574.         and     dword [ebp+viewer_data.col+4], 0
  1575.         jmp     .done_redraw
  1576. .ctrl_left_hex:
  1577.         call    viewer_seek_to_current
  1578.         call    viewer_get_prev_char
  1579.         jc      @f
  1580.         call    viewer_set_curpos
  1581.         jmp     .done_redraw
  1582. .ctrl_right:
  1583.         test    [ebp+viewer_data.flags], 1
  1584.         jnz     .ctrl_right_hex
  1585.         add     dword [ebp+viewer_data.col], 20
  1586.         adc     dword [ebp+viewer_data.col+4], 0
  1587.         jnc     .done_redraw
  1588.         sub     dword [ebp+viewer_data.col], 20
  1589.         sbb     dword [ebp+viewer_data.col+4], 0
  1590. @@:     ret
  1591. .ctrl_right_hex:
  1592.         call    viewer_seek_to_current
  1593.         call    viewer_get_next_char
  1594.         call    viewer_set_curpos
  1595.         jmp     .done_redraw
  1596. .ctrl_shift_right:
  1597.         test    [ebp+viewer_data.flags], 1
  1598.         jnz     @b
  1599.         mov     eax, dword [viewer_right_side]
  1600.         mov     edx, dword [viewer_right_side+4]
  1601.         sub     eax, [cur_width]
  1602.         sbb     edx, 0
  1603.         jnc     @f
  1604.         xor     eax, eax
  1605.         xor     edx, edx
  1606. @@:
  1607.         mov     dword [ebp+viewer_data.col], eax
  1608.         mov     dword [ebp+viewer_data.col+4], edx
  1609.         jmp     .done_redraw
  1610. .shift_f8:
  1611.         mov     ecx, encodings.menu.1
  1612.         mov     al, [ebp+viewer_data.encoding]
  1613. @@:
  1614.         cmp     byte [ecx-1], al
  1615.         jz      @f
  1616.         mov     ecx, [ecx]
  1617.         jmp     @b
  1618. @@:
  1619.         push    1
  1620.         push    aTables
  1621.         push    ecx
  1622.         call    menu
  1623.         cmp     eax, -1
  1624.         jz      .ret
  1625.         mov     al, [eax-1]
  1626.         mov     [ebp+viewer_data.encoding], al
  1627.         cmp     al, encodings.unicode
  1628.         jnz     .done_redraw_keybar
  1629.         add     dword [ebp+viewer_data.cur_pos], 1
  1630.         adc     dword [ebp+viewer_data.cur_pos+4], 0
  1631.         and     dword [ebp+viewer_data.cur_pos], not 1
  1632.         jmp     .done_redraw_keybar
  1633. .f7:
  1634.         call    viewer_clear_selection
  1635.         call    find_in_file_dlg
  1636.         jz      .shift_f7
  1637. .ret2:
  1638.         ret
  1639. .shift_f7:
  1640. ; search string SearchString in file starting from current position
  1641.         cmp     byte [SearchString], 0
  1642.         jz      .ret2
  1643.         mov     eax, dword [ebp+viewer_data.selected_start]
  1644.         mov     edx, dword [ebp+viewer_data.selected_start+4]
  1645.         inc     eax
  1646.         jnz     @f
  1647.         inc     edx
  1648. @@:
  1649.         cmp     dword [ebp+viewer_data.selected_len], 0
  1650.         jnz     @f
  1651.         cmp     dword [ebp+viewer_data.selected_len+4], 0
  1652.         jnz     @f
  1653.         mov     eax, dword [ebp+viewer_data.cur_pos]
  1654.         mov     edx, dword [ebp+viewer_data.cur_pos+4]
  1655. @@:
  1656.         call    viewer_clear_selection
  1657.         call    viewer_seek
  1658.         call    viewer_skip_unicode_marker
  1659.         mov     esi, tolower_table
  1660.         test    [find_in_file_dlgdata.flags_case], 10h
  1661.         jz      @f
  1662.         mov     esi, identical_table
  1663. @@:
  1664.         mov     ebx, SearchString
  1665.         test    [find_in_file_dlgdata.flags_whole], 10h
  1666.         setnz   al
  1667.         push    eax
  1668.         push    dword [ebp+viewer_data.encoding]
  1669.         call    search_string_pre
  1670.         mov     esi, [ebp+viewer_data.buf_pos]
  1671.         lea     ebx, [ebp+viewer_data.buf]
  1672.         add     ebx, [ebp+viewer_data.buf_size]
  1673.         mov     edi, edx
  1674.         cmp     esi, ebx
  1675.         jb      @f
  1676.         sub     ebx, ebp
  1677.         cmp     ebx, viewer_data.buf + 16384
  1678.         jnz     .f7.notfound
  1679.         pusha
  1680.         call    viewer_load_next
  1681.         popa
  1682.         jz      .f7.notfound
  1683.         mov     esi, [ebp+viewer_data.buf_pos]
  1684.         lea     ebx, [ebp+viewer_data.buf]
  1685.         add     ebx, [ebp+viewer_data.buf_size]
  1686. @@:
  1687.         test    [find_in_file_dlgdata.flags_whole], 10h
  1688.         jz      .search_loop
  1689.         cmp     dword [ebp+viewer_data.buf_start], 0
  1690.         jnz     @f
  1691.         cmp     dword [ebp+viewer_data.buf_start+4], 0
  1692.         jnz     @f
  1693.         lea     eax, [ebp+viewer_data.buf]
  1694.         cmp     [ebp+viewer_data.buf_pos], eax
  1695.         jz      .f7.startspace
  1696. @@:
  1697.         xor     eax, eax
  1698.         call    viewer_get_prev_char
  1699.         inc     esi
  1700.         cmp     [isspace_table+eax], 0
  1701.         jz      .search_loop
  1702. .f7.startspace:
  1703.         add     edi, 256
  1704. .search_loop:
  1705. ; edx -> FSM, ecx = last state, edi = current state,
  1706. ; esi = buf_pos, ebx = end of buffer
  1707. ; get current symbol
  1708.         movzx   eax, byte [esi]
  1709. ; calculate next state
  1710.         movzx   edi, byte [edi+eax]
  1711. ; done?
  1712.         cmp     edi, ecx
  1713.         jz      .f7.found
  1714. .search_loop_next:
  1715. ; no; proceed to next symbol
  1716.         shl     edi, 8
  1717.         add     esi, 1
  1718.         add     edi, edx
  1719.         cmp     esi, ebx
  1720.         jb      .search_loop
  1721.         sub     ebx, ebp
  1722.         cmp     ebx, viewer_data.buf + 16384
  1723.         jnz     .f7.notfound
  1724.         mov     [ebp+viewer_data.buf_pos], esi
  1725.         pusha
  1726.         call    viewer_load_next
  1727.         popa
  1728.         jz      .f7.notfoundt
  1729.         mov     esi, [ebp+viewer_data.buf_pos]
  1730.         lea     ebx, [ebp+viewer_data.buf]
  1731.         add     ebx, [ebp+viewer_data.buf_size]
  1732.         jmp     .search_loop
  1733. .f7.notfoundt:
  1734. ; last chance - if we are looking for a whole word, EOF is ok for last symbol
  1735.         test    [find_in_file_dlgdata.flags_whole], 10h
  1736.         jz      .f7.notfound
  1737.         movzx   edi, byte [edi+' ']
  1738.         inc     esi
  1739.         cmp     edi, ecx
  1740.         jz      .f7.found
  1741. .f7.notfound:
  1742.         call    search_failed
  1743.         jmp     .done_redraw
  1744. .f7.found:
  1745.         push    ecx
  1746.         mov     ecx, edx
  1747.         call    pgfree
  1748.         mov     [ebp+viewer_data.buf_pos], esi
  1749.         call    viewer_set_curpos
  1750.         pop     ecx
  1751.         mov     dword [ebp+viewer_data.selected_len], ecx
  1752.         and     dword [ebp+viewer_data.selected_len+4], 0
  1753.         dec     ecx
  1754.         sub     eax, ecx
  1755.         sbb     edx, 0
  1756.         mov     dword [ebp+viewer_data.selected_start], eax
  1757.         mov     dword [ebp+viewer_data.selected_start+4], edx
  1758.         inc     eax
  1759.         jnz     @f
  1760.         inc     edx
  1761. @@:
  1762.         test    [find_in_file_dlgdata.flags_whole], 10h
  1763.         jz      @f
  1764.         sub     dword [ebp+viewer_data.selected_len], 2
  1765.         sbb     dword [ebp+viewer_data.selected_len+4], 0
  1766.         mov     dword [ebp+viewer_data.selected_start], eax
  1767.         mov     dword [ebp+viewer_data.selected_start+4], edx
  1768.         inc     eax
  1769.         jnz     @f
  1770.         inc     edx
  1771. @@:
  1772.         mov     dword [ebp+viewer_data.cur_pos], eax
  1773.         mov     dword [ebp+viewer_data.cur_pos+4], edx
  1774.         call    viewer_seek
  1775.         call    viewer_prev_newline
  1776.         jmp     .done_redraw
  1777.  
  1778. search_failed:
  1779.         mov     ecx, edx
  1780.         call    pgfree
  1781.         mov     eax, SearchString-1
  1782.         push    dword [eax-3]
  1783.         push    eax
  1784.         mov     byte [eax], '"'
  1785. @@:
  1786.         inc     eax
  1787.         cmp     byte [eax], 0
  1788.         jnz     @b
  1789.         mov     word [eax], '"'
  1790.         xchg    eax, [esp]
  1791.         push    eax
  1792.         push    aStringNotFound
  1793.         mov     eax, esp
  1794.         push    ContinueBtn
  1795.         push    1
  1796.         push    eax
  1797.         push    2
  1798.         push    aSearch
  1799.         call    SayErrTitle
  1800.         pop     eax
  1801.         pop     eax
  1802.         pop     ecx
  1803.         mov     byte [ecx], 0
  1804.         pop     dword [eax-3]
  1805.         ret
  1806.  
  1807. viewer_getname:
  1808. if lang eq ru
  1809.         mov     eax, 'Прос'
  1810.         stosd
  1811.         mov     eax, 'мотр'
  1812.         stosd
  1813.         mov     eax, '    '
  1814.         stosd
  1815.         stosb
  1816. else
  1817.         mov     eax, 'View'
  1818.         stosd
  1819.         mov     eax, '    '
  1820.         stosd
  1821.         stosd
  1822.         stosb
  1823. end if
  1824.         jmp     viewedit_getname
  1825. editor_getname:
  1826. if lang eq ru
  1827.         mov     eax, 'Реда'
  1828.         stosd
  1829.         mov     eax, 'ктор'
  1830.         stosd
  1831.         mov     eax, '    '
  1832.         stosd
  1833.         stosb
  1834. else
  1835.         mov     eax, 'Edit'
  1836.         stosd
  1837.         mov     eax, '    '
  1838.         stosd
  1839.         stosd
  1840.         stosb
  1841. end if
  1842. viewedit_getname:
  1843.         sub     ecx, 13
  1844.         cmp     [ebp+viewer_data.hPlugin], 0
  1845.         jz      .native
  1846.         lea     esi, [ebp+viewer_data.hostname]
  1847.         push    ecx edi
  1848.         shr     ecx, 1
  1849. @@:
  1850.         lodsb
  1851.         test    al, al
  1852.         jz      @f
  1853.         stosb
  1854.         loop    @b
  1855. @@:
  1856.         sub     edi, [esp]
  1857.         sub     [esp+4], edi
  1858.         add     [esp], edi
  1859.         pop     edi ecx
  1860.         lea     esi, [ebp+viewer_data.filename]
  1861.         jmp     .main
  1862. .native:
  1863.         lea     esi, [ebp+viewer_data.filename]
  1864.         push    3
  1865.         pop     edx
  1866. @@:
  1867.         lodsb
  1868.         stosb
  1869.         dec     ecx
  1870.         test    al, al
  1871.         jz      .ret
  1872.         cmp     al, '/'
  1873.         jnz     @b
  1874.         dec     edx
  1875.         jnz     @b
  1876. .main:
  1877.         push    esi
  1878. @@:
  1879.         lodsb
  1880.         test    al, al
  1881.         jnz     @b
  1882.         sub     esi, [esp]
  1883.         dec     esi
  1884.         cmp     esi, ecx
  1885.         jbe     @f
  1886.         mov     al, '.'
  1887.         stosb
  1888.         stosb
  1889.         stosb
  1890.         sub     ecx, 3
  1891.         sub     esi, ecx
  1892.         add     [esp], esi
  1893. @@:
  1894.         pop     esi
  1895. @@:
  1896.         lodsb
  1897.         stosb
  1898.         test    al, al
  1899.         jnz     @b
  1900. .ret:
  1901.         ret
  1902.