Subversion Repositories NedoOS

Rev

Rev 655 | Rev 841 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1. MAXSEARCHFILENAME=64
  2. MAXSEARCHTEXT=64
  3.  
  4. FOUNDFILESFNSZ=80
  5. FOUNDFILESMAX=20
  6. FOUNDFILESTABLE=0x8000
  7. FOUNDFILESTABLE_END=0x8000+(FOUNDFILESMAX*FOUNDFILESFNSZ)
  8.  
  9. editcmd_2
  10.         call ifcmdnonempty_typedigit
  11. editcmd_F2
  12.         call setdrawtablesneeded
  13.         ld hl,editcmd_reprintall_noreaddir
  14.         push hl
  15.         OS_NEWPAGE
  16.         ld a,e
  17.         ld (findpg),a
  18.         ld hl,nvfind_freepg
  19.         push hl
  20. nvfind_redrawloop
  21.         ld a,(findpg)
  22.         ld e,a
  23.         SETPG32KLOW
  24.         call nvfind_reprintmenu
  25.  
  26. nvfind_mainloop
  27.         ld a,2
  28. nvfind_yieldkeep
  29.         ld (nvview_wasnokey),a
  30.         YIELDKEEP
  31.         ld a,55+128 ;"or a"
  32.         ld (nvview_wasyield),a
  33. nvfind_mainloop_nokey
  34.         GETKEY_ ;OS_GETKEYNOLANG
  35.         ld a,c ;keynolang
  36.         ;cp NOKEY
  37.         jr nz,nvfind_mainloop_keyq
  38. ;если два раза подряд нет события, то делаем YIELD, иначе YIELDKEEP
  39. nvfind_wasnokey=$+1
  40.         ld a,1
  41.         dec a
  42.         jr nz,nvfind_yieldkeep
  43. ;рисовать панельку только при отсутствии события после YIELD
  44. nvfind_wasyield=$
  45.         scf
  46.         call c,nvfind_panel
  47.         YIELD
  48.         ld a,55 ;"scf"
  49.         ld (nvfind_wasyield),a
  50.         jr nvfind_mainloop_nokey
  51. nvfind_mainloop_keyq
  52.         cp key_redraw
  53.         jr z,nvfind_redrawloop
  54.         cp key_esc
  55.         ret z
  56.         cp key_F3
  57.         jp z,nvfind_view
  58.         ld hl,nvfind_mainloop
  59.         push hl
  60.         cp key_enter
  61.         jp z,nvfind_enter
  62.         cp key_tab
  63.         jp z,nvfind_tab
  64.         cp key_up
  65.         jp z,nvfind_up
  66.         cp key_down
  67.         jp z,nvfind_down
  68.         cp key_left
  69.         jp z,nvfind_left
  70.         cp key_right
  71.         jp z,nvfind_right
  72.         cp key_backspace
  73.         jp z,nvfind_backspace
  74.  
  75.         cp 0x20
  76.         ret c ;прочие системные кнопки не нужны
  77. nvfind_typein
  78. ;keeps ix
  79.         ld e,a
  80.         ld a,(nvfind_curtab)
  81.         or a
  82.         jr nz,nvfind_typein_cursearchtext
  83.  
  84. nvfind_typein_cursearchfilename
  85.         call nvfind_gettext
  86.         call strlen ;hl=length
  87.         ld bc,MAXSEARCHFILENAME
  88.         or a
  89.         sbc hl,bc
  90.         ret nc ;некуда вводить
  91.         call nvfind_calctextaddr ;hl=addr, a=curx
  92.         inc a
  93.         call nvfind_setx
  94.         jp strinsch
  95.  
  96. nvfind_typein_cursearchtext
  97.         call nvfind_gettext
  98.         call strlen ;hl=length
  99.         ld bc,MAXSEARCHTEXT
  100.         or a
  101.         sbc hl,bc
  102.         ret nc ;некуда вводить
  103.         call nvfind_calctextaddr ;hl=addr, a=curx
  104.         inc a
  105.         call nvfind_setx
  106.         jp strinsch
  107.  
  108. nvfind_gettext
  109.         ld a,(nvfind_curtab)
  110.         or a
  111.         ld hl,cursearchtext
  112.         jr nz,nvfind_gettext_cursearchtext
  113.         ld hl,cursearchfilename
  114. nvfind_gettext_cursearchtext
  115.         ret
  116.  
  117. nvfind_getx
  118.         ld a,(nvfind_curtab)
  119.         or a
  120.         ld a,(nvfind_curtextx)
  121.         jr nz,nvfind_getx_cursearchtext
  122.         ld a,(nvfind_curx)
  123. nvfind_getx_cursearchtext
  124.         ret
  125.  
  126. nvfind_setx
  127.         ld c,a
  128.         ld a,(nvfind_curtab)
  129.         or a
  130.         ld a,c
  131.         jr nz,nvfind_setx_cursearchtext
  132.         ld (nvfind_curx),a
  133.         ret
  134. nvfind_setx_cursearchtext
  135.         ld (nvfind_curtextx),a
  136.         ret
  137.  
  138. nvfind_view
  139.         ld a,(nvfind_curfoundfiles)
  140.         or a
  141.         ret z
  142.         call nvfind_findselectedname
  143.         ex de,hl
  144.         call nvview
  145.         jp nvfind_redrawloop
  146.  
  147. nvfind_left
  148.         call nvfind_getx
  149.         or a
  150.         ret z
  151.         dec a
  152.         jp nvfind_setx
  153.  
  154. nvfind_right
  155.         call nvfind_gettext
  156.         call strlen ;hl=length
  157.         call nvfind_getx
  158.         cp l
  159.         ret z
  160.         inc a
  161.         jp nvfind_setx
  162.  
  163. nvfind_up
  164.         ld de,_COLOR
  165.         call nvfind_printbigcursor
  166.         ld a,(nvfind_curfoundfile)
  167.         or a
  168.         ret z
  169.         dec a
  170.         ld (nvfind_curfoundfile),a
  171.         ret
  172.  
  173. nvfind_down
  174.         ld de,_COLOR
  175.         call nvfind_printbigcursor
  176.         ld a,(nvfind_curfoundfile)
  177.         ld hl,nvfind_curfoundfiles
  178.         inc a
  179.         cp (hl)
  180.         ret z
  181.         ld (nvfind_curfoundfile),a
  182.         ret
  183.  
  184. nvfind_tab
  185.         ld hl,nvfind_curtab
  186.         ld a,(hl)
  187.         xor 1
  188.         ld (hl),a
  189.         ret
  190.  
  191. nvfind_backspace
  192.         call nvfind_calctextaddr ;hl=addr, a=curx
  193.         or a
  194.         ret z
  195.         ld a,(nvfind_curtab)
  196.         or a
  197.         jr nz,nvfind_backspace_cursearchtext
  198.         ld de,nvfind_curx
  199.         ld a,(de)
  200.         dec a
  201.         ld (de),a
  202.         jp strdelch
  203. nvfind_backspace_cursearchtext
  204.         ld de,nvfind_curtextx
  205.         ld a,(de)
  206.         dec a
  207.         ld (de),a
  208.         jp strdelch
  209.  
  210. nvfind_enter
  211.         ld (nvfind_sp),sp
  212.         call nvfind_reprintmenu
  213.        
  214.         xor a
  215.         ld (nvfind_curfoundfiles),a
  216.         ld (nvfind_curfoundfile),a
  217.         ld hl,FOUNDFILESTABLE
  218.         ld (nvfind_curfoundnameaddr),hl
  219.  
  220.         ld de,0x0400
  221.         SETXY_
  222.  
  223.         ld hl,emptypath
  224.         ld de,nvfind_curpath
  225.         call strcopy
  226.  
  227.         call nvfind_loaddir
  228. nvfind_break
  229. nvfind_sp=$+1
  230.         ld sp,0
  231. ;select from list
  232.  
  233.         ret
  234.  
  235.         macro STRPUSH
  236. ;hl=string addr
  237.         xor a
  238.         push af
  239.          ld a,(hl)
  240.          inc hl
  241.          or a
  242.          push af
  243.         jr nz,$-4
  244.         pop af
  245. ;в стеке лежит \0, текст (без терминатора)
  246.         endm
  247.        
  248.         macro STRPOP
  249. ;hl=string addr
  250.         ld d,h
  251.         ld e,l
  252.          pop af
  253.          ld (hl),a
  254.          inc hl
  255.          or a
  256.         jr nz,$-4
  257.         ex de,hl
  258.         call strmirror
  259.         endm
  260.        
  261. strmirror
  262. ;hl=string addr
  263.         ld d,h
  264.         ld e,l
  265.         call strlen
  266.         ld b,h
  267.         ld c,l
  268.          ld a,b
  269.          or c
  270.          ret z
  271. ;de=начало, bc=hl=длина
  272.         ;ld h,b
  273.         ;ld l,c
  274.         add hl,de ;hl=конец+1
  275.         srl b
  276.         rr c ;bc=wid/2
  277. mirrorbytes0
  278.         dec hl
  279.         ld a,(de)
  280.         ldi
  281.         dec hl
  282.         ld (hl),a
  283.         jp pe,mirrorbytes0
  284.         ret      
  285.  
  286. nvfind_loaddir
  287.         ld de,emptypath;nvfind_curpath
  288.         OS_OPENDIR
  289.        
  290.         ld bc,0 ;file#
  291. nvfind_loaddir0
  292.         push bc
  293.         call loaddir_filinfo
  294.         pop bc
  295.         inc bc
  296.         jp c,nvfind_loaddirq
  297.         jr z,nvfind_loaddir0
  298.         ld hl,filinfo+FILINFO_FATTRIB
  299.         ld a,(hl)
  300.         and FATTRIB_DIR
  301.         jr z,nvfind_loaddir_ndir
  302.          ld hl,filinfo+FILINFO_FNAME
  303.          ld a,'.'
  304.          cp (hl)
  305.          jr nz,nvfind_loaddir_subdir
  306.          inc hl
  307.          cp (hl)
  308.          jr z,nvfind_loaddir0
  309. nvfind_loaddir_subdir
  310.         push bc
  311. ;open subdir
  312.         ld hl,nvfind_curpath
  313.         STRPUSH
  314.         ld hl,nvfind_curpath
  315.         call strfindeol
  316.         ex de,hl
  317.         ld hl,filinfo+FILINFO_FNAME
  318.         call strcopy ;out: hl,de after terminator
  319.         ex de,hl
  320.         dec hl
  321.         ld (hl),'/'
  322.         inc hl ;curpath = oldcurpath+dir+'/'
  323.         ld (hl),0
  324.         ;ld de,nvfind_curpath
  325.         ;OS_OPENDIR
  326.         ;jr $
  327.        
  328.         ld de,filinfo+FILINFO_FNAME
  329.         OS_CHDIR
  330.  
  331.         call nvfind_loaddir
  332.  
  333.         ld de,tdotdot
  334.         OS_CHDIR
  335.  
  336. ;reopen dir
  337.         ld hl,nvfind_curpath
  338.         STRPOP
  339.         ld de,nvfind_curpath
  340.         OS_OPENDIR
  341.         pop bc
  342.         push bc
  343. nvfind_loaddir_recreread0
  344.         push bc
  345.         call loaddir_filinfo
  346.         pop bc
  347.         dec bc
  348.         ld a,b
  349.         or c
  350.         jr nz,nvfind_loaddir_recreread0
  351.         pop bc
  352.         jr nvfind_loaddir0
  353. nvfind_loaddir_ndir
  354.         push bc
  355.         ld de,cursearchfilename
  356.         ld hl,filinfo+FILINFO_FNAME
  357.         call nvfind_compare
  358.         jr z,nvfind_loaddir_ok
  359.         ld de,cursearchfilename
  360.         ld hl,filinfo+FILINFO_LNAME
  361.         call nvfind_compare
  362.         jr nz,nvfind_loaddir_fail
  363. nvfind_loaddir_ok
  364.         call nvfind_found
  365.        
  366. nvfind_loaddir_fail
  367.         pop bc ;file#
  368.         jp nvfind_loaddir0
  369. nvfind_loaddirq
  370.         ret
  371.  
  372.  
  373. nvfind_found
  374. ;TODO generate curpath/hlname
  375.         push hl
  376.         ld hl,nvfind_curpath
  377.         call strfindeol
  378.         pop de
  379.         push hl
  380.         ;ld (hl),'/'
  381.         ;inc hl
  382.         ex de,hl
  383.         call strcopy
  384.         ld hl,nvfind_curpath
  385.         ld (nvfind_curfilename),hl
  386.         ld a,(cursearchtext)
  387.         or a
  388.         jr z,nvfind_foundnosearchinfile
  389.  
  390. ;open file with name=HL
  391.         ex de,hl
  392.         OS_OPENHANDLE
  393.         ld a,b
  394.         ld (nvfind_curhandle),a
  395.        
  396.         call nvfind_searchinfile
  397.         push af
  398. nvfind_curhandle=$+1
  399.         ld b,0
  400.         OS_CLOSEHANDLE
  401.         pop af
  402.         jr nz,nvfind_found_q
  403.        
  404. nvfind_foundnosearchinfile
  405. nvfind_curfoundnameaddr=$+1
  406.         ld de,0
  407.         ld hl,FOUNDFILESTABLE_END
  408.         or a
  409.         sbc hl,de
  410.         jp z,nvfind_break
  411.         ld hl,(nvfind_curfilename)
  412.         ld bc,FOUNDFILESFNSZ
  413.         ldir
  414.         ld (nvfind_curfoundnameaddr),de
  415.         ld hl,nvfind_curfoundfiles
  416.         inc (hl)
  417.  
  418.         call prcrlf
  419. nvfind_curfilename=$+1
  420.         ld hl,0
  421.         ld c,0 ;x
  422.         call prtext
  423.         call clearrestofline
  424.        
  425.         GETKEY_
  426.         cp key_esc
  427.         jp z,nvfind_break
  428. nvfind_found_q
  429.         pop hl
  430.         ld (hl),0
  431.         ret
  432.  
  433. nvfind_searchinfile
  434. ;out: NZ=not found, Z=found, hl=place after
  435. ;сначала cursearchbuf=searchbuf, грузим туда два сегмента
  436.         call nvfind_loadsegment
  437. nvfind_searchinfile0
  438.         call nvfind_loadsegment ;запасной сегмент впереди
  439.         call nvfind_searchinsegment
  440.         jr c,nvfind_searchinfileq
  441.         jr nz,nvfind_searchinfile0
  442. nvfind_searchinfileq
  443.         ret
  444.  
  445. nvfind_searchinsegment
  446. ;out: CY=end of file(NZ); else NZ=not found, Z=found, hl=place after
  447. cursearchbuf=$+1
  448.         ld hl,searchbuf
  449. nvfind_cursize=$+1
  450.         ld bc,128
  451. nvfind_searchinsegment_retry
  452.         ld a,b
  453.         or c
  454.         jr z,nvfind_searchinsegment_eof
  455.         ld de,cursearchtext
  456.         ld a,(de)
  457.         cpir
  458.          scf
  459.          ccf
  460.         ret nz ;NZ,NC
  461.          ld (nvfind_searchinsegment_tempaddr),hl
  462.         dec hl ;for use inc l later
  463. nvfind_searchinsegment0
  464.         inc l
  465.         inc de
  466.         ld a,(de)
  467.         or a
  468.         ret z ;Z,NC
  469.         xor (hl)
  470.         jr z,nvfind_searchinsegment0
  471. nvfind_searchinsegment_tempaddr=$+1
  472.          ld hl,0
  473.          jr nvfind_searchinsegment_retry
  474.         ;ret ;NZ,NC
  475. nvfind_searchinsegment_eof
  476.         sub 1
  477.         ret ;CY,NZ
  478.  
  479. nvfind_loadsegment
  480. nvfind_nextsize=$+1
  481.         ld hl,0
  482.         ld (nvfind_cursize),hl
  483.         ld a,(nvfind_curhandle)
  484.         ld b,a
  485.         ld hl,SEARCHBUF_SZ
  486.         ld de,(cursearchbuf)
  487.         OS_READHANDLE
  488. ;hl=true size
  489.         ld (nvfind_nextsize),hl
  490.         ld hl,cursearchbuf
  491.         ld a,(hl)
  492.         xor 128
  493.         ld (hl),a
  494.         ret
  495.  
  496. nvfind_compare
  497. ;de=search string
  498. ;hl=test string
  499. ;out: Z=ok, NZ=fail
  500.         push hl
  501.         call nvfind_compare0
  502.         pop hl
  503.         ret
  504. nvfind_compare0
  505.         ld a,(de)
  506.         cp '*'
  507.         ret z
  508.         cp '?'
  509.         jr z,nvfind_compare_skip
  510.          or 0x20
  511.         xor (hl)
  512.         jr z,nvfind_compare_skip
  513.         cp 0x20
  514.         ret nz
  515.         ld a,(de)
  516.         or a
  517.         ret z
  518. nvfind_compare_skip
  519.         inc hl
  520.         inc de
  521.         jr nvfind_compare0
  522.  
  523. nvfind_calctextaddr
  524.         ld a,(nvfind_curtab)
  525.         or a
  526.         jr z,nvfind_calctextaddr_cursearchfilename
  527.         ld hl,cursearchtext
  528. nvfind_curtextx=$+1
  529.         ld a,0
  530.         jp cmdcalctextaddr_hlbase_ax ;hl=addr, a=x
  531.        
  532. nvfind_calctextaddr_cursearchfilename
  533.         ld hl,cursearchfilename
  534. nvfind_curx=$+1
  535.         ld a,0
  536.         jp cmdcalctextaddr_hlbase_ax ;hl=addr, a=x
  537.  
  538. nvfind_findselectedname
  539.         ld hl,FOUNDFILESTABLE
  540.         ld de,FOUNDFILESFNSZ
  541. nvfind_curfoundfile=$+1
  542.         ld b,0
  543.         inc b
  544.         dec b
  545.         ret z ;hl=name
  546.         add hl,de
  547.         djnz $-1
  548. ;hl=name
  549.         ret
  550.  
  551. nvfind_printbigcursor
  552. ;de=color
  553. nvfind_curfoundfiles=$+1
  554.         ld a,0
  555.         or a
  556.         ret z
  557.         call nv_setcolor
  558.         ld a,(nvfind_curfoundfile)
  559.         add a,5
  560.         ld d,a
  561.         ld e,0
  562.         SETXY_
  563.         call nvfind_findselectedname
  564.         ld c,0 ;x
  565.         call prtext
  566.         ld de,_COLOR
  567.         jp nv_setcolor
  568.  
  569. nvfind_panel
  570.         ld de,_CURSORCOLOR
  571.         call nvfind_printbigcursor
  572. nvfind_curtab=$+1
  573.         ld a,0
  574.         or a
  575.         jp z,nvfind_prcursearchfilename
  576.         jp nvfind_prcursearchtext
  577.  
  578. nvfind_prcursearchfilename
  579.         ld de,0x0100
  580.         push de
  581.         SETXY_
  582.         ld c,0 ;x
  583.         ld hl,cursearchfilename
  584.         call prtext
  585.         call clearrestofline
  586.         call nvfind_getx
  587.         pop de
  588.         ld e,a
  589.         SETXY_
  590.         ret
  591.  
  592. nvfind_prcursearchtext
  593.         ld de,0x0300
  594.         push de
  595.         SETXY_
  596.         ld c,0 ;x
  597.         ld hl,cursearchtext
  598.         call prtext
  599.         call clearrestofline
  600.         call nvfind_getx
  601.         pop de
  602.         ld e,a
  603.         SETXY_
  604.         ret
  605.  
  606. nvfind_reprintmenu
  607.         ld de,0
  608.         SETXY_
  609.         CLS_
  610.        
  611.         ld de,0x0000
  612.         SETXY_
  613.         ld c,0 ;x
  614.         ld hl,tsearchfilename
  615.         call prtext
  616.         call nvfind_prcursearchfilename
  617.  
  618.         ld de,0x0200
  619.         SETXY_
  620.         ld c,0 ;x
  621.         ld hl,tsearchtext
  622.         call prtext
  623.         call nvfind_prcursearchtext
  624.        
  625.         ld de,0x0400
  626.         SETXY_
  627.         ld c,0 ;x
  628.         ld hl,tresults
  629.         call prtext
  630.        
  631.         ld hl,FOUNDFILESTABLE
  632.         ld a,(nvfind_curfoundfiles)
  633. nvfind_reprintmenu_files0
  634.         or a
  635.         ret z
  636.         push af
  637.         push hl
  638.         call prcrlf
  639.         pop hl
  640.         push hl
  641.         ld c,0 ;x
  642.         call prtext
  643.         pop hl
  644.         ld bc,FOUNDFILESFNSZ
  645.         add hl,bc
  646.         pop af
  647.         dec a
  648.         jr nvfind_reprintmenu_files0
  649.  
  650. nvfind_freepg
  651. findpg=$+1
  652.         ld e,0
  653.         OS_DELPAGE
  654.         ret
  655.  
  656. strfindeol
  657.         xor a
  658.         ld b,a
  659.         ld c,a
  660.         cpir
  661.         dec hl
  662.         ret
  663.  
  664. tsearchfilename
  665.         db "Search filename:",0
  666.  
  667. cursearchfilename
  668.         ds MAXSEARCHFILENAME+1
  669.  
  670. tsearchtext
  671.         db "Search text:",0
  672.  
  673. tresults
  674.         db "Results:",0
  675.  
  676. cursearchtext
  677.         ds MAXSEARCHTEXT+1
  678.  
  679. nvfind_curpath
  680.         ds MAXPATH_sz
  681.  
  682.