Subversion Repositories Kolibri OS

Rev

Rev 7538 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;ª ª ãáâ஥­® ¤¥à¥¢®:
  2. ;¬ áᨢ, ­  ª®â®àë© ãª §ë¢ ¥â PTree ᮤ¥à¦¨â § ¯¨á¨ _tree
  3. ;
  4. ;0 0,szRoot
  5. ;1  1,dir1
  6. ;2  1,dir2
  7. ;3   2,dir21
  8. ;4   2,dir22
  9. ;5    3,dir221
  10. ;6   2,dir23
  11. ;7  1,dir3
  12. ;8  1,dir4
  13. ;9   2,dir41
  14.  
  15.  
  16.  
  17.  
  18. RAZD equ 1              ;‡­ ª à §¤¥«¨â¥«ï áâப
  19.  
  20. F_ONLY_READ     equ 1b
  21. F_HIDDEN        equ 10b
  22. F_SYSTEM        equ 100b
  23. F_LABEL         equ 1000b
  24. F_FOLDER        equ 10000b
  25. F_NOT_BACKUP    equ 100000b
  26.  
  27. TR_LINE_H equ 18
  28. TR_STEP_W equ 10
  29. NUM_READ_FILES = 26
  30. TR_BACKGROUND = 0EFF8FFh
  31.  
  32.  
  33.  
  34.  
  35. macro p2p r1,r2
  36. {
  37.         push    dword r2
  38.         pop     dword r1
  39. }
  40.  
  41. macro CopyStr strOut,strIn
  42. {
  43.         mov     edi,strOut
  44.         mov     esi,strIn
  45.     @@: lodsb
  46.         stosb
  47.         test    al,al
  48.         jnz     @b
  49. }
  50.  
  51.  
  52. struct _BDWK
  53.         flags           rd 1    ;bit0: only read , hidden , system , label , folder , not backup
  54.         encod           rb 1    ;0-ASCII, 1-UNICODE
  55.         res             rb 3
  56.         timeCreated     rd 1
  57.         dataCreated     rd 1
  58.         lastTimeAccess rd 1
  59.         lastDataAccess rd 1
  60.         lastTimeModify rd 1
  61.         lastDataModify rd 1
  62.         size            rq 1
  63.         name            rb 263
  64. ends
  65.  
  66. proc d_OutTree
  67.         pushad
  68.         pushfd
  69.  
  70.         mov     edi,[PTree]
  71.         dps '„¥à¥¢®:'
  72.         dnl
  73.    @@:  cmp     dword[edi+4],0
  74.         je      .exit
  75.         dph [edi]
  76.         dps ' '
  77.         dph [edi+4]
  78.         dps ' '
  79.         dpsP [edi+4]
  80.         dnl
  81.         add     edi,8
  82.         jmp     @b
  83.   .exit:
  84.  
  85.         popfd
  86.         popad
  87.         ret
  88. endp
  89.  
  90.  
  91.  
  92. struct _tree
  93.         open    rd 1    ;0, «¨¡® ª®«¨ç¥á⢮ ¯®¤ª â «®£®¢(ãç¨âë¢ ï ¯®¤ª â «®£¨ ®âªàëâëå ¯®¤ª â «®£®¢)
  94.         name    rd 1    ;㪠§ â¥«ì ­  áâப㠮⭮á¨â¥«ì­® PStrings
  95. ends
  96.  
  97.  
  98.  
  99.  
  100. uglobal
  101. ;-------------- file_tree.inc
  102.  
  103. openDir rb 1024         ;§¤¥áì ¯ãâì ¤«ï ç⥭¨ï ¯ ¯ª¨
  104. tmpStr rb 1024
  105.  
  106. treeDirBuf rb 32+304*NUM_READ_FILES
  107. PTree   rd 1    ;㪠§ â¥«ì ­  ¬ áᨢ áâàãªâãà _tree. ®á«¥¤­ïï - _tree.name = 0
  108. TreeSize rd 1
  109.  
  110. endg
  111.  
  112. iglobal
  113. ;------------- file_tree.inc
  114. szRoot db 'hd0',0
  115.  
  116. tree_info:
  117.   .x            dd 13
  118.   .y            dd 110
  119.   .w            dd 284
  120.   .h            dd 300
  121.   .numLines     dd 200/TR_LINE_H
  122.   .firstLine    dd 0
  123.  
  124. fiTree          dd 1
  125.   .numBlock     dd 0
  126.   .flags        dd 0
  127.   .numRead      dd NUM_READ_FILES
  128.   .buff         dd treeDirBuf;buf
  129.                 db 0
  130.   .path         dd openDir
  131.  
  132.  
  133. imgFree:
  134. ; file 'pic/free.raw'
  135. imgOk:
  136. ; file 'pic/ok.raw'
  137. imgMinus:
  138. ; file 'pic/minus.raw'
  139. imgPlus:
  140. ; file 'pic/plus.raw'
  141. i_end:
  142.  
  143. readFolder dd rdFoldforTree     ;äã­ªæ¨ï, ª®â®à®© ç¨â ¥âáï ¯ ¯ª 
  144.  
  145.  
  146. endg
  147.  
  148.  
  149. DDD123 = 0
  150.  
  151.  
  152. proc file_tree_Init
  153.         stdcall MM_AllocMem,4000
  154.         mov     [TVROOT],eax
  155.         mov     dword[eax],0
  156.         mov     dword[eax+4],4000
  157.  
  158.         mcall   68,12,4096
  159.         mov     [PTree],eax
  160.  
  161.         mov     [eax+_tree.open],dword 0
  162.         mov     [eax+_tree.name],dword szRoot
  163.         mov     [eax+8+_tree.open],dword 0
  164.         mov     [eax+8+_tree.name],dword 0
  165.  
  166.  
  167. DDD123 = 0
  168. if DDD123
  169.         mov     [1*8+eax+_tree.open],dword 1
  170.        mov     [1*8+eax+_tree.name],dword sz_d1
  171.         mov     [2*8+eax+_tree.open],dword 1
  172.         mov     [2*8+eax+_tree.name],dword sz_d2
  173.         mov     [3*8+eax+_tree.open],dword 2
  174.         mov     [3*8+eax+_tree.name],dword sz_d21
  175.         mov     [4*8+eax+_tree.open],dword 2
  176.         mov     [4*8+eax+_tree.name],dword sz_d22
  177.         mov     [5*8+eax+_tree.open],dword 3
  178.         mov     [5*8+eax+_tree.name],dword sz_d221
  179.         mov     [6*8+eax+_tree.open],dword 2
  180.        mov     [6*8+eax+_tree.name],dword sz_d23
  181.         mov     [7*8+eax+_tree.open],dword 1
  182.         mov     [7*8+eax+_tree.name],dword sz_d3
  183.         mov     [8*8+eax+_tree.open],dword 1
  184.         mov     [8*8+eax+_tree.name],dword sz_d4
  185.         mov     [9*8+eax+_tree.open],dword 2
  186.         mov     [9*8+eax+_tree.name],dword sz_d41
  187.         mov     [0Ah*8+eax+_tree.open],dword 0
  188.         mov     [0Ah*8+eax+_tree.name],dword 0
  189. end if
  190.         mov     [TreeSize],1
  191.  
  192. ;Fantomer      ;  mcall   68,12,4096
  193.       ;  mov     [PWoSearch],eax
  194.       ;  mov     dword[eax],searchPath
  195.       ;  mov     dword[eax+4],0
  196.         ret
  197. endp
  198. if DDD123
  199. sz_d1   db 'dir1',0
  200. sz_d2   db 'dir2',0
  201. sz_d21  db 'dir21',0
  202. sz_d22  db 'dir22',0
  203. sz_d221 db 'dir221',0
  204. sz_d23  db 'dir23',0
  205. sz_d3   db 'dir3',0
  206. sz_d4   db 'dir4',0
  207. sz_d41  db 'dir41',0
  208. end if
  209.  
  210. uglobal
  211.   bufImg rb 384*300*3
  212. endg
  213.  
  214. proc file_tree_Draw
  215. locals
  216.        tr_y     rd 1
  217.        tr_numLine rd 1
  218. endl
  219.  
  220.         mcall   13,<[tree_info.x],[tree_info.w]>,\
  221.                    <[tree_info.y],[tree_info.h]>,TR_BACKGROUND
  222.  
  223.         mov     [tr_numLine],0
  224.         p2p     [tr_y],[tree_info.y]
  225.         mov     eax,[PTree]
  226.         mov     eax,[eax+_tree.open]
  227.         inc     eax
  228.  
  229.  
  230.         mov     ecx,[TreeSize]
  231.     .drawLine:
  232.         push    ecx
  233.  
  234.         mov     edi,[tr_numLine]
  235.         shl     edi,3
  236.         add     edi,[PTree]
  237.  
  238.      ;   mov     eax,[edi+_tree.open]
  239.      ;   mov     bx,TR_LINE_H
  240.      ;   mul     bx
  241.      ;   add     eax,[tree_info.x]
  242.      ;   mpack   ebx,eax,[tr_y]
  243.  
  244. POPRDLJAKART = 4
  245.         mov     eax,[edi+_tree.open]
  246.         mov     bx,TR_STEP_W
  247.         mul     bx
  248.         add     eax,[tree_info.x]
  249.         mpack   edx,eax,[tr_y]
  250.         add     edx,POPRDLJAKART   ;¯®¯à ¢ª  ¤«ï ª à⨭®ª
  251.  
  252.         mov     eax,[edi+_tree.open]
  253.         inc     eax
  254.         cmp     eax,[edi+8+_tree.open]
  255.         je     @f
  256.         mov     ebx,imgPlus
  257.         jmp     .draw1
  258.       @@:
  259.         mov     ebx,imgMinus
  260.      .draw1:
  261.         mcall   7,,<9,9>
  262.  
  263.         push    edx
  264.  
  265.         ;mov     eax,edi
  266.         ;call    getPath
  267.         ;mov     ebx,eax
  268.         ;stdcall findVetka,eax
  269.         ;push    ecx
  270.         ;stdcall strCpy,ebx,
  271.         ;stdcall MM_DelMem,ebx
  272.         mov     ebx,edi
  273.         call    getFullPath
  274.         stdcall findVetka,openDir
  275.  
  276.         test    ecx,ecx
  277.         jnz     .l1
  278.         mov     ebx,imgOk
  279.         jmp     .l2
  280. .l1:
  281.         mov     ebx,imgFree
  282. .l2:
  283.  
  284.         pop     edx
  285.         add     edx,15 shl 16
  286.         mov     ebx,imgOk
  287.         mcall   7,,<9,9>
  288.         sub     edx,POPRDLJAKART   ;㡨ࠥ¬ ¯®¯à ¢ªã ¤«ï ª à⨭®ª
  289.  
  290.         lea     ebx,[edx+1+10*10000h]
  291.  
  292.  
  293.         mov     ecx,90000000h
  294.         or      ecx,[sc.work_text]
  295.  
  296.         mov     edx,[edi+_tree.name]
  297.         mcall   4
  298.  
  299.         add     [tr_y],TR_LINE_H
  300.         inc     [tr_numLine]
  301.  
  302.         mov     eax,[tree_info.y]
  303.         add     eax,[tree_info.h]
  304.         cmp     [tr_y],eax
  305.         jae     .end
  306.  
  307.         pop     ecx
  308.         dec     ecx
  309.         jnz     .drawLine
  310. .end:
  311.  
  312.         ret
  313. endp
  314.  
  315.  
  316.  
  317. proc file_tree_Mouse
  318. locals
  319.    m_x rd 1
  320. endl
  321.         ;mcall   37,0  ¡á®«îâ­ë¥ ª®®à¤¨­ âë ¬ëè¨
  322.  
  323.         mcall   37,2 ;ª­®¯ª¨
  324.         test    al,1
  325.         jz      .exit
  326.  
  327.  
  328.         mcall   37,1 ;ª®®à¤¨­ âë ®â­®á¨â¥«ì­® ®ª­ 
  329.         mov     bx,ax   ;y
  330.         shr     eax,16  ;x
  331.         mov     [m_x],eax
  332.  
  333.         cmp     eax,[tree_info.x]       ;®â¡à á뢠¥¬ ª«¨ª¨ ¢­¥ ¤¥à¥¢ 
  334.         jb      .exit
  335.  
  336.         sub     eax,[tree_info.x]
  337.         cmp     eax,[tree_info.w]
  338.         ja      .exit
  339.  
  340.         cmp     ebx,[tree_info.y]
  341.         jb      .exit
  342.         sub     ebx,[tree_info.y]
  343.         mov     edx,ebx
  344.         cmp     edx,[tree_info.h]
  345.         ja      .exit
  346.  
  347.         mov     eax,edx
  348.  
  349.         mov     bx,TR_LINE_H
  350.         xor     edx,edx
  351.         div     bx
  352.  
  353.         mov     ebx,[PTree]
  354.         lea     ebx,[ebx+eax*8]
  355.               ;eax=­®¬¥à áâப¨, ebx - 㪠§ â¥«ì ­  _tree,
  356.  
  357.                                 ;¯à®¯ã᪠¥¬ ¢á¥ ª«¨ª¨ ­¨¦¥ ¤¥à¥¢ 
  358.  
  359.         mov     edx,[TreeSize]
  360.         dec     edx
  361.         cmp     eax,edx
  362.         ja      .exit
  363.  
  364.         mov     eax,[ebx+_tree.open]
  365.         mov     dx,TR_STEP_W
  366.         mul     dx
  367.         add     eax,[tree_info.x]
  368.         cmp     eax,[m_x]
  369.         ja      .mark
  370.         add     eax,9
  371.         cmp     eax,[m_x]
  372.         jb      .mark
  373.  
  374.                                 ;¯à®¢¥à塞: § ªàëâì ¨«¨ ®âªàëâì ¯ ¯ªã
  375.         mov     edx,[ebx+_tree.open]
  376.         inc     edx
  377.         cmp     [ebx+_tree.open+8],edx
  378.         jne     @f
  379.         call    tree_closeFolder
  380.         call    file_tree_Draw
  381.         ret
  382.      @@:
  383.         call    tree_openFolder
  384.  
  385.         call    file_tree_Draw
  386.         jmp     .exit
  387.  .mark:
  388.         ;ª«¨ª ¯® áâப¥
  389.  
  390.  .exit:
  391.         ret
  392. endp
  393.  
  394.  
  395. ;-------------------------------------------------------------------------------
  396. ;---------------------- § ªà뢠¥â ¯ ¯ªã ----------------------------------------
  397. ;-------------------------------------------------------------------------------
  398. ; inp:  ebx - 㪠§ â¥«ì ­  _tree,
  399. ;-------------------------------------------------------------------------------
  400. proc tree_closeFolder
  401.  
  402.         mov     esi,[ebx+_tree.open]
  403.         lea     edi,[ebx+8]
  404.     @@:
  405.         cmp     [edi+_tree.open],esi
  406.         jbe     @f
  407.         stdcall MM_DelMem,[edi+_tree.name]
  408.         add     edi,8
  409.         jmp     @b
  410.     @@:
  411.  
  412.  
  413.         mov     esi,edi
  414.         lea     edi,[ebx+8]
  415.  
  416.         mov     eax,esi
  417.         sub     eax,edi
  418.         shr     eax,3
  419.         sub     [TreeSize],eax
  420.  
  421.                            ;ᤢ¨£ ¥¬ ¢á¥ áâàãªâãàë, ª®â®àë¥ ­¨¦¥ § ªà뢠¥¬®©, ¢¢¥àå
  422.     @@: movsd
  423.         lodsd
  424.         stosd
  425.         test    eax,eax
  426.         jnz     @b
  427.  
  428.         ret
  429. endp
  430.  
  431. ;-------------------------------------------------------------------------------
  432. ;-------------------- ®âªà뢠¥â ¯ ¯ªã ------------------------------------------
  433. ;-------------------------------------------------------------------------------
  434. ; inp:  eax=­®¬¥à áâப¨, ebx - 㪠§ â¥«ì ­  _tree,
  435. ;-------------------------------------------------------------------------------
  436.  
  437. proc tree_openFolder
  438. locals
  439.         p_treeOpen  rd 1
  440.         currLine rd 1
  441.         PTmpTree rd 1
  442.         endTmpTree rd 1
  443.         lEOF     rd 1
  444.         numFolds rd 1
  445.         openLine rd 1
  446.  
  447. endl
  448.         mov     [p_treeOpen],ebx
  449.   ; int3
  450.         call    getFullPath
  451.  
  452. ;----- —¨â ¥¬ ¯ ¯ªã ¨ § ¯®«­ï¥¬ tmpTree---------------------------------------------------------
  453.  
  454.         mcall   68,12,8192
  455.         mov     [PTmpTree],eax        ;¯ ¬ïâì ¤«ï ᯨ᪠ ª â «®£®¢
  456.  
  457.         mov     [lEOF],0
  458.         mov     [endTmpTree],0
  459.         mov     [numFolds],0
  460.  
  461.         mov     [fiTree.numBlock],0
  462.  
  463.  .stepLoadFold:                       ;ç⥭¨¥ ¯ ¯ª¨
  464. ;   dpsP [fiTree+21]
  465. ;   dnl
  466.  
  467.         mcall   70,fiTree
  468. ;        mov     eax, fiTree
  469. ;        call    [readFolder]
  470.  
  471.         test    eax,eax
  472.         je      @f
  473.         cmp     eax,6
  474.         jne     .err
  475.      @@:
  476.  
  477.         cmp     ebx,NUM_READ_FILES
  478.         je      @f
  479.         mov     [lEOF],1                ;áâ ¢¨¬ EOF
  480.    @@:
  481.         mov     ecx,ebx
  482.  
  483.         mov     edi,treeDirBuf+32
  484.  
  485.    .testRec:                        ;®¡à ¡®âª  § ¯¨á¥© ¢ treeDirBuf
  486.         push    ecx
  487.  
  488.         lea     eax,[edi+_BDWK.name]  ;®â¡à á뢠¥¬ ­¥ ¯ ¯ª¨ ¨ ¯ ¯ª¨ . ¨ ..
  489.         cmp     word[eax],'.'
  490.         je      .endtestRec
  491.  
  492.         cmp     word[eax],'..'
  493.         jne     @f
  494.         cmp     byte[eax+2],0
  495.         je      .endtestRec
  496.      @@:
  497.  
  498.        ; cmp     [edi+_BDWK.flags],F_FOLDER
  499.        ; jne     .endtestRec
  500.  
  501.         inc     [numFolds]
  502.         push    edi
  503.  
  504.         lea     esi,[edi+_BDWK.name]
  505.  
  506.  
  507.      ;;;;;;;;;   ;¤®¡ ¢«¥­¨¥ ¯ ¯ª¨ ¢ ᯨ᮪
  508.         mov     edi,esi       ;¯®«ãç ¥¬ ¤«¨­ã áâப¨
  509.         xor     al,al
  510.         mov     ecx,260
  511.         repne   scasb
  512.         mov     eax,260
  513.         sub     eax,ecx
  514.  
  515.         stdcall MM_AllocMem,eax
  516. ;dph eax
  517. ;dnl
  518.         mov     edi,eax
  519.         mov     ebx,[endTmpTree]
  520.         add     ebx,[PTmpTree]
  521.         mov     [ebx],eax
  522.         add     [endTmpTree],4
  523.  
  524.         mov     ecx,ebx      ;¥á«¨ ¬ «® ¬¥áâ  ¯®¤ § ¯¨á¨, â® ¯¥à¥à á¯à¥¤¥«¨âì
  525.         add     ecx,4        ;¡®«ìè¥ ¯ ¬ïâ¨
  526.         test    ecx,0FFFh
  527.         jz      @f
  528.         and     ecx,0FFFFF000h
  529.         add     ecx,1000h
  530.     @@: sub     ecx,4
  531.         cmp     ecx,ebx
  532.         jne     @f
  533.         mcall   68,20,,[PTmpTree]
  534.         mov     [PTmpTree],eax
  535.  
  536.     @@: lodsb
  537.         stosb
  538.         test    al,al
  539.         jnz     @b
  540.  
  541.  
  542.         pop     edi
  543.  
  544.     .endtestRec:
  545.         add     edi,304
  546.         pop     ecx
  547.         dec     ecx
  548.         jnz     .testRec
  549.  
  550.  
  551.         add     [fiTree.numBlock],NUM_READ_FILES
  552.  
  553.         cmp     [lEOF],1
  554.         jne     .stepLoadFold
  555.  
  556.         cmp     [numFolds],0
  557.         je      .exit
  558.       ;;;;;;;;;;;; ¢¯¨á뢠¥¬ ¢ ®á­®¢­®¥ ¤¥à¥¢®
  559.                            ;ᬥ頥¬ § ¯¨á¨ ¢­¨§, ç⮡ ¢¯¨á âì ­®¢ãî ¢¥âªã ¤¥à¥¢ 
  560.  
  561.         mov     esi,[PTree]
  562.         mov     eax,[TreeSize]
  563.         inc     eax
  564.         shl     eax,3
  565.         add     esi,eax
  566.  
  567.         mov     edi,esi
  568.         mov     eax,[numFolds]
  569.         shl     eax,3
  570.         add     edi,eax
  571.  
  572.         mov     eax,esi
  573.         sub     eax,[p_treeOpen]
  574.         shr     eax,2
  575.         mov     ecx,eax
  576.         add     esi,4
  577.         add     edi,4
  578.         std
  579.         rep     movsd
  580.         cld
  581.  
  582.                                 ;⥯¥àì § ¯¨á뢠¥¬ ¢ [PTree]
  583.         mov     ebx,[p_treeOpen]
  584.         mov     eax,[ebx+_tree.open]
  585.         inc     eax
  586.         mov     esi,[PTmpTree]
  587.         lea     edi,[ebx+8]
  588.         mov     ecx,[numFolds]
  589.     @@: mov     [edi+_tree.open],eax
  590.         p2p     [edi+_tree.name],[esi]
  591.         add     esi,4
  592.         add     edi,8
  593.         loop    @b
  594.  
  595.         mov     eax,[numFolds]
  596.         add     [TreeSize],eax
  597.  
  598. .exit:
  599.   .err:
  600.  
  601.         mcall   68,13,[PTmpTree]
  602.  
  603.    call d_OutTree
  604.         ret
  605. endp
  606.  
  607. ;-------------------------------------------------------------------------------
  608. ;--- ­ å®¤¨â ¯®«­ë© ¯ãâì ¤® í«¥¬¥­â  -------------------------------------------
  609. ;-------------------------------------------------------------------------------
  610. ;inp: ebx = Pointer to _tree.
  611. ;outp: openDir ᮤ¥à¦¨â ¯®«­ë© ¯ãâì (¯®á«¥ ¯®á«¥¤­¥© ¯ ¯ª¨ ¨¬¥¥âáï /)
  612. ;-------------------------------------------------------------------------------
  613. proc getFullPath
  614. ;­ã¦­® ¯à®¡¥¦ âìáï ®â ¯®á«¥¤­¥© ¯ ¯ª¨ ¢ ¯ã⨠¢¢¥àå, ¯® த¨â¥«ì᪨¬
  615. ;á­ ç «  § ¯¨á뢠¥¬ ¯ ¯ª¨ ¢ tmpStr, à §¤¥«ïï ¨å ᨬ¢®«®¬ RAZD, § â¥¬
  616. ;᪮¯¨p㥬 ¨å ¢ ®¡à â­®¬ ¯®à浪¥ ¢ £®â®¢ë© ¯ãâì ¢ openDir
  617.         push    ebx edi esi
  618.         mov     eax,[ebx+_tree.open]
  619.         mov     edi,tmpStr+1
  620.         mov     byte[edi-1],RAZD
  621.  
  622.         cmp     [ebx+_tree.name],0
  623.         je      .copyIn_openDir
  624.  
  625.         jmp     .addFoldToPath
  626.    .testLine:
  627.         cmp     [ebx+_tree.open],eax
  628.         jb      .addFoldToPath
  629.  
  630.         sub     ebx,8
  631.         cmp     ebx,[PTree]
  632.         jne     .testLine
  633.        ; jmp     .copyIn_openDir
  634.  
  635.    .addFoldToPath:
  636.         mov     byte[edi-1],RAZD
  637.         mov     esi,[ebx+_tree.name]
  638.     @@: lodsb
  639.         stosb
  640.         test    al,al
  641.         jnz     @b
  642.  
  643.         mov     eax,[ebx+_tree.open]
  644.         cmp     ebx,[PTree]
  645.         je      .copyIn_openDir
  646.  
  647.         cmp     ebx,[PTree]
  648.         jne     .testLine
  649.         sub     ebx,8
  650.         cmp     ebx,[PTree]
  651.         jne     .testLine
  652.  
  653.    .copyIn_openDir:
  654.         sub     edi,2
  655.         mov     edx,openDir+1
  656.         mov     byte[edx-1],'/'
  657.         mov     byte[edx],0
  658.         cmp     edi,tmpStr-1
  659.         je      .endConv
  660.     @@:
  661.         mov     al,RAZD
  662.         mov     ecx,1024
  663.         std
  664.         repne scasb
  665.         cld
  666.  
  667.         push    edi
  668.         add     edi,2
  669.         mov     eax,1024
  670.         sub     eax,ecx
  671.         mov     ecx,eax
  672.         mov     esi,edi
  673.         mov     edi,edx
  674.         rep movsb
  675.         mov     byte[edi-1],'/'
  676.         mov     byte[edi],0
  677.         mov     edx,edi
  678.         pop     edi
  679.  
  680.         cmp     edi,tmpStr-1
  681.         jne     @b
  682.      .endConv:
  683.  
  684.         pop     esi edi ebx
  685.         ret
  686. endp
  687.  
  688.  
  689. ;inp eax = Pointer to _tree
  690. ;outp eax = Pointer to string - full path
  691. ; ¬ïâì á ¨¬¥­¥¬ ®á¢®¡®¤¨âì!!!
  692. proc getPath
  693. locals
  694.         strTmp rb 256
  695.         reslt rd 1
  696. endl
  697.         push    ebx edi esi
  698.         mov     ebx,eax
  699.         mov     eax,[eax+_tree.open]
  700.         lea     edi,[strTmp+1]
  701.         mov     byte[edi-1],RAZD
  702.  
  703.         cmp     ebx,[PTree]
  704.         je      .copyIn_openDir
  705.         jmp     .addFoldToPath
  706.    .testLine:
  707.         cmp     [ebx+_tree.open],eax
  708.         jb      .addFoldToPath
  709.  
  710.         sub     ebx,8
  711.         cmp     ebx,[PTree]
  712.         jne     .testLine
  713.         jmp     .copyIn_openDir
  714.  
  715.    .addFoldToPath:
  716.         mov     byte[edi-1],RAZD
  717.         mov     esi,[ebx+_tree.name]
  718.     @@: lodsb
  719.         stosb
  720.         test    al,al
  721.         jnz     @b
  722.  
  723.         mov     eax,[ebx+_tree.open]
  724.         sub     ebx,8
  725.         cmp     ebx,[PTree]
  726.         jne     .testLine
  727.  
  728.    .copyIn_openDir:
  729.         lea     eax,[strTmp]
  730.         stdcall strLen,eax
  731.         stdcall MM_AllocMem,eax
  732.         mov     [reslt],eax
  733.         mov     edx,eax
  734.         inc     edx
  735.         sub     edi,2
  736.         mov     byte[edx-1],'/'
  737.         mov     byte[edx],0
  738.         lea     eax,[strTmp-1]
  739.         cmp     edi,eax
  740.         je      .endConv
  741.     @@:
  742.         mov     al,RAZD
  743.         mov     ecx,1024
  744.         std
  745.         repne scasb
  746.         cld
  747.  
  748.         push    edi
  749.         add     edi,2
  750.         mov     eax,1024
  751.         sub     eax,ecx
  752.         mov     ecx,eax
  753.         mov     esi,edi
  754.         mov     edi,edx
  755.         rep movsb
  756.         mov     byte[edi-1],'/'
  757.         mov     byte[edi],0
  758.         mov     edx,edi
  759.         pop     edi
  760.  
  761.         lea     eax,[strTmp-1]
  762.         cmp     edi,eax
  763.         jne     @b
  764.      .endConv:
  765.         mov     eax,[reslt]
  766.         pop     esi edi ebx
  767.         ret
  768. endp
  769.  
  770. ;####################################################################################################
  771. ;####################################################################################################
  772. ;####################################################################################################
  773. ;####################################################################################################
  774.  
  775.  
  776. ;tree_ ä㭪樨, åà ­ï騥 ®â¬¥ç¥­­ë¥ ¯ãâ¨. ¯®áâ஥­ë ¢ ¢¨¤¥ ¤¥à¥¢  ¯ ¯®ª\ä ©«®¢
  777. ;¢ ¯ ¬ï⨠åà ­ïâìáï ª ª ᯨ᮪ áâàãªâãà (usel)
  778.  
  779. ;tree_Add(path)
  780. ;¤®¡ ¢«ï¥â ¯ãâì ¢ ¤¥à¥¢® ®â¬¥ç¥­ëå ä ©«®¢
  781. ;¢ë¢®¤
  782. ;¥ å = 0 - ¤®¡ ¢«¥­®
  783. ;      1 - â ª®© ¯ãâì 㦥 ¥áâì
  784. ;     -1 - ­¥¢¥à­ë© ¯ãâì
  785. ;
  786. ;
  787. ;tree_Del(path)
  788.  
  789.  
  790.  
  791.  
  792.  
  793. ;####################################################################################################
  794. struct _vetka
  795.  
  796.         sizeused rd 1
  797.         sizebuf rd 1
  798. ends
  799.  
  800. struct _usel
  801.  
  802.         pName rd 1
  803.         pNext rd 1
  804. ends
  805.  
  806.  
  807. ;''''''''''''''''' ƒŽ’Ž‚€
  808. ;¤®¡ ¢«ï¥â ¯ãâì ¢ ¤¥à¥¢® ®â¬¥ç¥­ëå ä ©«®¢
  809. ;¢ë¢®¤
  810. ;¥ å = 0 - ¤®¡ ¢«¥­®
  811. ;      1 - â ª®© ¯ãâì 㦥 ¥áâì
  812. ;     -1 - ­¥¢¥à­ë© ¯ãâì
  813. proc tree_Add path:DWORD
  814. locals
  815.  numFolds rd 1
  816.  vetB rd 1
  817.  uselB rd 1
  818. endl
  819.         push    ebx edi esi
  820. ;int3
  821.         stdcall getNumFolds, [path]
  822.         cmp     eax,-1
  823.         je      .error
  824.  
  825.         mov     ecx,eax
  826.         inc     eax
  827.         mov     [numFolds],eax
  828.                                 ;¨é¥¬ ª â «®£, á ª®â®à®£® ­ ç¨­ ¥¬ ¤®¯¨á뢠­¨¥ ¤¥à¥¢ 
  829. .searchBegin:
  830.         push    ecx
  831.         mov     eax,[numFolds]
  832.         sub     eax,ecx
  833.         stdcall getFirstTailPath, [path], eax
  834.         push    eax
  835.         stdcall findVetka,eax
  836.         mov     ebx,ecx
  837.         mov     [vetB],eax
  838.         mov     [uselB],edx
  839.         pop     eax
  840.         stdcall MM_DelMem,eax
  841.         cmp     ebx,0
  842.         jne     .foundBegin
  843.         pop     ecx
  844.         loop    .searchBegin
  845.         jmp     .exitNotAdded
  846. .foundBegin:     ;¢ á⥪¥ ¥éñ ¥áå ®â ¯à®è«®£® loop'a
  847. ;int3
  848.         mov     eax,[uselB]
  849.         mov     ebx,[eax+_usel.pNext]
  850.         cmp     ebx,0
  851.         jne     @f
  852.         mov     ebx,eax
  853.         stdcall MM_AllocMem,4000
  854.         mov     [ebx+_usel.pNext],eax
  855.         mov     dword[eax],0
  856.         mov     dword[eax+4],4000
  857.         mov     ebx,eax
  858. @@:
  859.         mov     eax,ebx
  860.         add     [eax+_vetka.sizeused],8
  861.         mov     edx,[eax+_vetka.sizebuf]
  862.         sub     edx,8
  863.         cmp     [eax+_vetka.sizeused],edx
  864.         jb      .noOverflow
  865.  
  866.         add     edx,8
  867.         push    eax             ;㢥«¨ç¨¢ ¥¬ à §¬¥à ¡ãä¥à 
  868.         push    edx             ;ä㭪樨 realloc ­¥â - ¯®â®¬ã â ª®¥ ¨§¢à é¥­¨¥ - Fantom
  869.         add     edx,4000
  870.         mov     esi,eax
  871.         stdcall MM_AllocMem, edx
  872.         mov     ebx,eax
  873.         mov     edi,eax
  874.         pop     ecx
  875.         shr     ecx,2
  876.         rep movsd
  877.         pop     eax
  878.         stdcall MM_DelMem,eax
  879.         mov     eax,ebx
  880.  
  881. .noOverflow:
  882.         mov     ebx, [eax+_vetka.sizeused]
  883.         lea     ebx, [ebx+eax]
  884.                                 ;ebx = PU_      - usel
  885.                                 ;eax = P_       - vetka
  886.         mov     eax,[numFolds]
  887.         sub     eax,[esp]                ;- ¢ á⥪¥ ¢áñ ¥éñ ¥áå ®â .searchBegin
  888.         dec     eax
  889.         stdcall getFoldByNum ,[path], eax
  890.         mov     [ebx+_usel.pName],eax
  891.         mov     [ebx+_usel.pNext],0
  892.  
  893. ;call D_OutTree
  894. ;dps '--------------------------------'
  895. ;dnl
  896.         pop     ecx
  897.         dec     ecx
  898.         jnz     .searchBegin
  899.         mov     eax, 0
  900.         jmp     .exit
  901. .exitNotAdded:
  902.         mov     eax,1
  903.         jmp     .exit
  904. .error:
  905.         mov     eax,-1
  906.  
  907. .exit:
  908. ;dps '-- ˆ’Žƒ ------------------------'
  909. ;dnl
  910. ;call D_OutTree
  911.         pop     esi edi ebx
  912.         ret
  913. endp
  914.  
  915. DDt dd 0
  916.  
  917. ;-------------------------------------------------------------------------------
  918. ; „‹Ÿ Ž’‹€„Šˆ
  919. proc D_OutTree
  920.         mov     eax,[TVROOT]
  921.         call    D_OutTree2
  922.         ret
  923. endp
  924.  
  925. proc D_OutTree2
  926.         inc     [DDt]
  927.         mov     ecx,[eax]
  928.         shr     ecx,3
  929.         add     eax,8
  930. .loop:
  931.         push    eax ecx
  932.         mov     ecx,[DDt]
  933. .space: dps ' '
  934.         loop    .space
  935.  
  936.         dpsP    [eax]
  937.       dps '    '
  938.       dph  dword[eax+4]
  939.         dnl
  940.         cmp     dword[eax+4],0
  941.         je      @f
  942.         mov     eax,[eax+4]
  943.         call    D_OutTree2
  944.        @@:
  945.         pop     ecx eax
  946.         add     eax,8
  947.         loop    .loop
  948.         dec     [DDt]
  949.  
  950.         ret
  951. endp
  952. ;-------------------------------------------------------------------------------
  953.  
  954.  
  955. ;tree_Del(path)
  956. ;           ¥á«¨ ¢ 㪠§ ­­®¬ 㧫¥ ¥áâì 㪠§ â¥«ì ­  ¢¥âªã, â®
  957. ;             treeDelIn(path)
  958. ;           㤠«¨âì 㪠§ ­­ë© 㧥«
  959. ;           ¥á«¨ ®­ ­¥ ¯®á«¥¤­¨© ¢ ᯨ᪥, â®
  960. ;             ¥á«¨ ®­ ­¥ á⮨⠯®á«¥¤­¨¬, â®
  961. ;                á¤¢¨­ãâì ¢á¥ ¯®á«¥¤ãî騥 áâàãªâãàë 㧥« ¢¢¥àå ­  8
  962. ;last_elem:  ¨­ ç¥
  963. ;             㤠«¨âì íâã ¢¥âªã
  964. ;             tree_Del(¯ãâì - 1 í«¥¬¥­â)
  965.  
  966. ;treeDelIn(path)
  967. ;        ¥á«¨ íâ® ¢¥âª , â®
  968. ;          ¯®ª  ¥áâì 㧫ë {
  969. ;            ¥á«¨ ã 㧫  ¥áâì ¢¥âª , â®
  970. ;              treeDelIn(¯ãâì ¤® ⥪ã饣® 㧫 )
  971. ;            ¨­ ç¥
  972. ;              ®á¢®¡®¤¨âì ¯ ¬ïâì á ¨¬¥­¥¬
  973. ;          }
  974. ;ƒŽ’Ž‚
  975. ;return:
  976. ;eax = 0 - success, -1 - error
  977. proc tree_Del path:DWORD
  978. locals
  979.  PU rd 1
  980.  P rd 1
  981.  path2 rb 256
  982. endl
  983. ;int3
  984.         push    ebx edi esi
  985.         stdcall findVetka,[path]
  986.         test    ecx,ecx
  987.         jne     .err
  988.         mov     edi,edx
  989.         mov     esi,eax
  990.         cmp     [edi+_usel.pNext],dword 0
  991.         je      @f
  992.         mov     eax,edi
  993.         push    edi esi
  994.         call treeDelIn
  995.         pop     esi edi
  996. @@:
  997.         stdcall MM_DelMem,[edi+_usel.pName]
  998.         mov     eax,[esi+_vetka.sizeused]
  999.         cmp     eax,8
  1000.         je      .last_elem
  1001.  
  1002.         add     eax,esi ; - last _usel
  1003.         cmp     edi,eax  ;if last _usel, then do not
  1004.         je      @f
  1005.         push    esi
  1006.         sub     eax,edi ;move all _usel up
  1007.         shr     eax,2
  1008.         mov     ecx,eax
  1009.         mov     esi,edi
  1010.         add     esi,8
  1011.         rep     movsd
  1012.         pop     esi
  1013.  
  1014. @@:     sub     dword [esi+_vetka.sizeused],8
  1015.         jmp     .exit
  1016.  
  1017. .last_elem:
  1018.         stdcall MM_DelMem,esi
  1019.         stdcall findUselMinusOne,[path]
  1020.         cmp     ecx,0
  1021.         jne     .exit
  1022.         mov     [edx+_usel.pNext],0
  1023. .exit:
  1024.         xor     eax,eax
  1025.         pop     esi edi ebx
  1026.         ret
  1027.  
  1028. .err:
  1029.         or      eax,-1
  1030.         pop     esi edi ebx
  1031.         ret
  1032.  
  1033. endp
  1034.  
  1035. ;!!!!   ­¥ á®åà ­ï¥â ॣ¨áâàë
  1036.  
  1037. ;input: eax = pointer to _usel
  1038. proc treeDelIn
  1039.         ;mov     eax,[eax+_usel.pNext]  ;®¯ á­®, ­® ¨ â ª ¢¥§¤¥ ¯à®¢¥àï¥âáï ¯¥à¥¤ ¢ë§®¢®¬
  1040.         ;cmp     eax,0
  1041.         ;je      .exit
  1042.  
  1043.         lea     ebx,[eax+8]
  1044.         mov     ecx,[eax]
  1045.         shr     ecx,3   ;ª®«¨ç¥á⢮ 㧫®¢
  1046. .loop:
  1047.         push    ecx
  1048.         mov     eax,[ebx+_usel.pNext]
  1049.         test    eax,eax
  1050.         jz      @f
  1051.         push    ebx
  1052.         call    treeDelIn
  1053.         pop     ebx
  1054.     @@:
  1055.         stdcall MM_DelMem,[ebx+_usel.pName]
  1056.         stdcall MM_DelMem,[ebx+_usel.pNext]
  1057.         add     ebx,8
  1058.         pop     ecx
  1059.         dec     ecx
  1060.         jnz     .loop
  1061. .exit:
  1062.  
  1063.         ret
  1064. endp
  1065.  
  1066. ; """""""""""""""" ƒŽ’Ž‚€
  1067. ;path = /hd0/1/kol      -folder
  1068. ;TV1 -> us'hd0' -> us'1' -> us'kol'
  1069. ;path = /hd0/1/mtldr    -file
  1070. ;path = /rd/1/kernel.mnt - file in ramdisk
  1071.  
  1072. ;­ å®¤¨â ¢¥âªã ¢ ª®â®à®© ­ å®¤¨âáï 㧥« á ­ã¦­®© ­ ¬ ¯ ¯ª®©
  1073. ;¢ë¢®¤:
  1074. ;eax - ¢¥âª 
  1075. ;edx - 㧥«, ª®â®àë© ­ ©¤¥­ ¯®á«¥¤­¨¬, â. ¥. ¤«ï ¯ã⨠/rd/1/lib/qwe ¡ã¤¥â 㧥« lib, â ª ª ª ä ©«  qwe ­¥â
  1076. ;ecx - 0 - ­ã¦­ë© ¢¥âª /㧥« ãᯥ譮 ­ ©¤¥­
  1077. ;      1 - ­ã¦­ë© ¢¥âª /㧥« ­¥ ­ ©¤¥­ - ­  ¢ë室¥ ¯®á«¥¤­¨© ­ ©¤¥­ë© 㧥«
  1078. ;      2 - ­¥¢¥à­ë© ¯ à ¬¥âà
  1079. proc findVetka path:DWORD
  1080. locals
  1081.         curFold rd 1
  1082.         num_f rd 1
  1083.         old_vetk rd 1
  1084.         old_usel rd 1
  1085. endl
  1086. ;int3
  1087.         mov     eax, [TVROOT]
  1088.         cmp     dword[eax],0
  1089.         jne     @f
  1090.         mov     edx, 0
  1091.         mov     ecx,2
  1092.         xor     eax,eax
  1093.         ret
  1094.      @@:
  1095.         push    ebx edi esi
  1096.         mov     [num_f], 0
  1097.         xor     edx, edx
  1098.         stdcall getFoldByNum, [path], 0
  1099.         test    eax, eax
  1100.         jz      .error2
  1101. ;dpsP eax
  1102. ;dnl
  1103.  
  1104.         mov     [curFold], eax
  1105.         mov     esi, [TVROOT]
  1106. .goLoop:
  1107.         mov     ebx, 8
  1108.         mov     ecx, [esi]
  1109.         shr     ecx, 3               ;á⮫쪮 ¢ TVROOT áâàãªâãà usel
  1110. .loop:
  1111.         push    ecx
  1112.         stdcall strCmp, [curFold], [esi+ebx]
  1113.         test    al, al
  1114.         jz      .find
  1115.         add     ebx, 8
  1116.         pop     ecx
  1117.         loop    .loop
  1118.         jmp     .error1
  1119.  
  1120. .find:
  1121.         pop     eax     ; ¢ë஢­ï«¨
  1122.         inc     [num_f]
  1123.         stdcall MM_DelMem, [curFold]
  1124.         stdcall getFoldByNum, [path], [num_f]
  1125.         test    eax, eax
  1126.         jz      .end
  1127.         mov     [curFold], eax
  1128.  
  1129.  
  1130.         cmp     dword[esi+ebx+4], 0
  1131.         jz      .error
  1132.         lea     eax, [esi+ebx]
  1133.         mov     [old_vetk],esi
  1134.         mov     [old_usel],eax
  1135.         mov     esi, [esi+ebx+4]
  1136.         jmp     .goLoop
  1137. .end:
  1138.  
  1139.         mov     eax, esi
  1140.         lea     edx, [esi+ebx]
  1141.         xor     ecx,ecx
  1142.         jmp     .exit
  1143.  
  1144. .error:
  1145.         stdcall MM_DelMem, [curFold]
  1146.         mov     eax, esi
  1147.         lea     edx, [esi+ebx]
  1148.         mov     ecx,1
  1149.         jmp     .exit
  1150. .error1:
  1151.         stdcall MM_DelMem, [curFold]
  1152.         mov     eax, [old_vetk]
  1153.         mov     edx, [old_usel]
  1154.         mov     ecx,1
  1155.         jmp     .exit
  1156. .error2:
  1157.         stdcall MM_DelMem, [curFold]
  1158.         mov     eax, 0
  1159.         mov     edx, 0
  1160.         mov     ecx,2
  1161.  
  1162. .exit:
  1163.         pop     esi edi ebx
  1164.         ret
  1165. endp
  1166.  
  1167.           ;ƒŽ’Ž‚€
  1168. ;­ å®¤¨â 㧥«, ª®â®àë© ááë« ¥âáï ­  § ¤ ­­ë© 㧥«
  1169. ;¢¥à­ñâ ¢ edx usel, ¤«ï ¯à¥¤¯®á«¥¤­¥© ¯ ¯ª¨ ¢ ¯ãâ¨
  1170. ;eax - ¢¥âª , ¢ ª®â®à®© íâ®â 㧥«
  1171. ;¥áå - áâ âãá(0, 1, 2, -1)
  1172. proc findUselMinusOne path:DWORD
  1173. locals
  1174.   path2 rb 256
  1175. endl
  1176.         push    ebx edi esi
  1177.  
  1178.         stdcall strLen,[path]
  1179.         cmp     eax,255
  1180.         ja      .err
  1181.         lea     eax,[path2]
  1182.         stdcall strCpy,[path],eax
  1183.  
  1184.         lea     edi,[path2]
  1185.         xor     al,al
  1186.         mov     ecx,256
  1187.         repne scasb             ;           V
  1188.         test    ecx,ecx         ;/hd0/1/kol
  1189.         jz      .err   ;⮫쪮 ®¤­  ¯ ¯ª 
  1190.         sub     ecx,255
  1191.         xor     ecx,-1
  1192.         inc     ecx
  1193.         sub     edi,2
  1194.         cmp     byte [edi], '/'
  1195.         jne     @f
  1196.         dec     edi
  1197.         dec     ecx
  1198.         @@:
  1199.         mov     al,'/'
  1200.         std
  1201.         repne   scasb
  1202.         cld
  1203.         test    ecx,ecx
  1204.         jz      .err   ; ⮫쪮 ®¤­  ¯ ¯ª 
  1205.  
  1206.         inc     edi
  1207.         mov     byte[edi],0
  1208.  
  1209.         lea     eax,[path2]
  1210.         stdcall findVetka,eax
  1211.         jmp     @f
  1212. .err:
  1213.         xor     eax,eax
  1214.         xor     edx,edx
  1215.         or     ecx,-1
  1216. @@:
  1217.         pop     esi edi ebx
  1218.         ret
  1219. endp
  1220.  
  1221. ;--------------ƒ®â®¢ 
  1222. ;­ å®¤¨â 㧥« ¤«ï § ¤ ­­®£® ª â «®£  ¢ ¯ãâ¨
  1223. ;eax = Pointer to _vetka
  1224. ;edx = Pointer to _usel
  1225. ;ecx = status (0 - success,             1 - found path not full,
  1226. ;              2 - path not corrected, -1 - only one folder in path)
  1227.  
  1228. proc findUselByNum path:DWORD,num:DWORD
  1229. locals
  1230.   path2 rb 256
  1231. endl
  1232.         push    ebx edi esi
  1233.  
  1234.         stdcall getNumFolds,[path]
  1235.         cmp     eax,[num]
  1236.         jl      .err
  1237.  
  1238.         xor     ebx,ebx
  1239.         lea     edi,[path2]
  1240.         mov     esi,[path]
  1241.         cmp     byte[esi],'/'
  1242.         jne     .l2
  1243.         dec     ebx
  1244. .l2:    lodsb
  1245.         stosb
  1246.         cmp     al,'/'
  1247.         jne     @f
  1248.         inc     ebx
  1249.         cmp     ebx,[num]
  1250.         ja      .go
  1251.       @@:
  1252.         test    al,al
  1253.         jnz     .l2
  1254.  
  1255. .go:
  1256.         mov     byte[esi-1],0
  1257.         lea     eax,[path2]
  1258.         stdcall findVetka,eax
  1259.         jmp     @f
  1260. .err:
  1261.         xor     eax,eax
  1262.         xor     edx,edx
  1263.         or      ecx,-1
  1264. @@:
  1265.         pop     esi edi ebx
  1266.         ret
  1267. endp
  1268.  
  1269. ;''''''''''''''' ƒŽ’Ž‚€
  1270. ;‚®§¢à é ¥â ¨¬ï ä ©« /ª â «®£  ¨§ ¢á¥£® ¯ãâ¨
  1271. ; --- !!!  ¬ïâì ­ã¦­® ¡ã¤¥â ®á¢®¡®¤¨âì
  1272. proc getName path:DWORD
  1273.         push    esi edi
  1274.  
  1275.         stdcall strLen,[path]
  1276.         mov     edi,[path]
  1277.         add     edi,eax
  1278.         sub     edi,2
  1279.         cmp     byte[edi],'/'
  1280.         jne     @f
  1281.         dec     edi
  1282. @@:
  1283.         mov     ecx,eax
  1284.         mov     al,'/'
  1285.         std
  1286.         repne scasb
  1287.         cld
  1288.         add     edi,2
  1289.         stdcall strLen,edi
  1290.         mov     esi,eax
  1291.         stdcall MM_AllocMem, ecx
  1292.         push    eax
  1293.         add     esi,eax
  1294.         stdcall strCpy,edi, eax
  1295.         cmp     byte[esi-2],'/'
  1296.         jne     @f
  1297.         mov     byte[esi-2],0
  1298. @@:
  1299.         pop     eax
  1300.         pop     edi esi
  1301.         ret
  1302. endp
  1303.  
  1304.  
  1305.  
  1306. ; """""""""""""""" ƒŽ’Ž‚€
  1307. proc strCpy src:DWORD,dest:DWORD
  1308.         push    esi edi
  1309.         mov     edi,[dest]
  1310.         mov     esi,[src]
  1311. @@:     lodsb
  1312.         stosb
  1313.         test    al,al
  1314.         jnz     @b
  1315.         pop     edi esi
  1316.         ret
  1317. endp
  1318.  
  1319. ; """""""""""""""" ƒŽ’Ž‚€
  1320. ; á ãçñ⮬ § ¢¥àè î饣® 0
  1321. proc strLen strz:DWORD
  1322.         push    edi
  1323.         mov     edi,[strz]
  1324.         xor     al,al
  1325.         mov     ecx,1024
  1326.         repnz   scasb
  1327.         mov     eax,1024
  1328.         sub     eax,ecx
  1329.         pop     edi
  1330.         ret
  1331. endp
  1332.  
  1333. ; """""""""""""""" ƒŽ’Ž‚€
  1334. proc strCmp src1:DWORD, src2:DWORD
  1335.         push    esi edi
  1336.         mov     edi, [src1]
  1337.         mov     esi, [src2]
  1338.         mov     eax, 1
  1339. @@:     test    al, al
  1340.         jz      .end
  1341.         lodsb
  1342.         scasb
  1343.         jz      @b
  1344.  
  1345.         ja      .low
  1346.         mov     eax, 1
  1347.         jmp     @f
  1348. .low:
  1349.         mov     eax, -1
  1350. @@:
  1351.         pop     edi esi
  1352.         ret
  1353. .end:
  1354.         xor     eax,eax
  1355.         jmp     @b
  1356. endp
  1357.  
  1358.  
  1359. ; """""""""""""""" ƒŽ’Ž‚€
  1360. ;¢®§à é ¥â ¨¬ï ¯ ¯ª¨ ¨§ ¢á¥£® ¯ã⨠¯® ¥£® ­®¬¥àã.
  1361. ;! ‘çñâ ­ ç¨­ ¥âáï á 0
  1362. ; --- !!!  ¬ïâì ­ã¦­® ¡ã¤¥â ®á¢®¡®¤¨âì
  1363. proc getFoldByNum strz:DWORD, num:DWORD
  1364.         push    ebx edi esi
  1365.  
  1366.         mov     esi, [strz]
  1367.         mov     ecx, 1024
  1368.         stdcall MM_AllocMem, 256
  1369.         mov     ebx, eax
  1370.         cmp     byte[esi], '/'
  1371.         jne     @f
  1372.         inc     esi
  1373.      @@:
  1374.  
  1375. .find_begin:
  1376.         cmp     [num], 0
  1377.         jz      .copy
  1378.  
  1379.     @@: lodsb
  1380.         cmp     al, '/'
  1381.         je      @f
  1382.         cmp     al, 0
  1383.         je      .error
  1384.         loop    @b
  1385.     @@: dec     [num]
  1386.         jmp     .find_begin
  1387.  
  1388. .copy:
  1389.         ;dec     esi
  1390.         mov     edi, ebx
  1391.         mov     byte[edi], 1 ;íâ® ¬¥âª  ⮣®, çâ® ­¨ ®¤¨­ ¡ ©â ­¥ § ¯¨á ­
  1392.     @@:
  1393.         lodsb
  1394.         cmp     al, '/'
  1395.         je      @f
  1396.         cmp     al, 0
  1397.         je      @f
  1398.         stosb
  1399.         loop    @b
  1400.     @@:
  1401.         cmp     byte[edi], 1
  1402.         jne     @f
  1403. .error:
  1404.         stdcall MM_DelMem, ebx
  1405.         xor     ebx, ebx
  1406.         jmp     .end
  1407.       @@:
  1408.         xor     al, al
  1409.         stosb
  1410. .end:
  1411.         mov     eax, ebx
  1412.         pop     esi edi ebx
  1413.         ret
  1414. endp
  1415.  
  1416.  
  1417. ; """""""""""""""" ƒŽ’Ž‚€
  1418. ;¢®§à é ¥â ª®«¨ç¥á⢮ í«¥¬¥­â®¢
  1419. ;ret: eax = Num or -1
  1420. proc getNumFolds path:DWORD
  1421.         push    ebx edi esi
  1422.  
  1423.         stdcall strLen,[path]
  1424.         cmp     eax,255
  1425.         ja      .err
  1426.  
  1427.         xor     ebx,ebx
  1428.         mov     esi,[path]
  1429.         cmp     byte[esi],'/'
  1430.         jne     .l1
  1431.         dec     ebx
  1432. .l1:    lodsb
  1433.         cmp     al,'/'
  1434.         jne     @f
  1435.         inc     ebx
  1436.       @@:
  1437.         test    al,al
  1438.         jnz     .l1
  1439.  
  1440.         cmp     [esi-2],byte '/'
  1441.         je      @f
  1442.         inc     ebx
  1443. @@:
  1444.  
  1445.         mov     eax,ebx
  1446.         jmp     .exit
  1447. .err:
  1448.         or      eax,-1
  1449. .exit:
  1450.         pop     esi edi ebx
  1451.         ret
  1452. endp
  1453.  
  1454.  
  1455. ;''''''''''''''''ƒŽ’Ž‚€
  1456. ;¢®§¢à é ¥â ç áâì ¯ãâ¨: ¯¥à¢ë¥ num ª â «®£®¢
  1457. ;ret: “ª § â¥«ì ­  áâபã.
  1458. ; --- !!!  ¬ïâì ­ã¦­® ¡ã¤¥â ®á¢®¡®¤¨âì
  1459. proc getFirstTailPath path:DWORD, num:DWORD
  1460.         push    ebx edi esi
  1461.  
  1462.         cmp     [num],0
  1463.         je      .err
  1464.  
  1465.  
  1466.         stdcall strLen,[path]
  1467.         cmp     eax,255
  1468.         ja      .err
  1469.  
  1470.         stdcall MM_AllocMem, eax
  1471.         mov     edi,eax
  1472.         push    eax
  1473.  
  1474.  
  1475.         xor     ebx,ebx
  1476.         mov     esi,[path]
  1477.         cmp     byte[esi],'/'
  1478.         jne     .l1
  1479. .l1:    lodsb
  1480.         stosb
  1481.         cmp     al,'/'
  1482.         jne     @f
  1483.         inc     ebx
  1484.         cmp     ebx,[num]
  1485.         ja      .endloop
  1486.       @@:
  1487.         test    al,al
  1488.         jnz     .l1
  1489. .endloop:
  1490.  
  1491.         cmp     [esi-2],byte '/'
  1492.         je      @f
  1493.         mov     byte[edi-1],0
  1494.         jmp     .l2
  1495. @@:
  1496.         mov     byte[edi-2],0
  1497. .l2:
  1498.  
  1499.         pop     eax
  1500.         jmp     .exit
  1501. .err:
  1502.  
  1503.         or      eax,-1
  1504.  
  1505. .exit:
  1506.  
  1507.         pop     esi edi ebx
  1508.         ret
  1509. endp
  1510.  
  1511.  
  1512. proc TESTINIT
  1513. ;---- ç⮡ë áâàãâãàë ¬¥­¥¤¦¥à  ¯ ¬ï⨠¡ë«¨ ¢ ­®à¬¥ ­ã¦­® ¨¬¥­­® ¨¬ ¢ë¤¥«¨âì ¯ ¬ïâì ¯®¤ íâ® ¤¥à¥¢®
  1514.  
  1515. ;;TEST                            getFoldByNum
  1516. ;tstStr db '/hd0/1/dqw',0
  1517. ;        stdcall getFoldByNum,tstStr,2
  1518. ;        dpsP eax
  1519. ;        dps '|'
  1520. ;        dnl
  1521. ;        ret
  1522.         stdcall MM_AllocMem,4000
  1523.         mov     [TVROOT],eax
  1524.         stdcall MM_AllocMem,4000
  1525.         mov     [Tus1+4],eax
  1526.         stdcall MM_AllocMem,4000
  1527.         mov     [Tus2+4],eax
  1528.  
  1529.         stdcall MM_AllocMem,4
  1530.         mov     [Tus1],eax
  1531.         stdcall MM_AllocMem,4
  1532.         mov     [Tus2],eax
  1533.         stdcall MM_AllocMem,4
  1534.         mov     [Tus3],eax
  1535.  
  1536.         stdcall strCpy,sname1,[Tus1]
  1537.         stdcall strCpy,sname2,[Tus2]
  1538.         stdcall strCpy,sname3,[Tus3]
  1539.  
  1540.         mov     esi,TvetkaHD0
  1541.         mov     edi,[TVROOT]
  1542.         mov     ecx,4
  1543.         rep     movsd
  1544.  
  1545.         mov     esi,Tvetka1
  1546.         mov     edi,[Tus1+4]
  1547.         mov     ecx,4
  1548.         rep     movsd
  1549.  
  1550.         mov     esi,TvetkaKOL
  1551.         mov     edi,[Tus2+4]
  1552.         mov     ecx,4
  1553.         rep     movsd
  1554.  
  1555.  
  1556. ;int3
  1557. ;        stdcall tree_Add,strTets1
  1558.        ; stdcall tree_Add,strTets2
  1559.        ; stdcall tree_Add,strTets3
  1560. ;dps '----------'
  1561. ;dnl
  1562. ;call D_OutTree
  1563.  
  1564. ;        stdcall tree_Del,strTets2
  1565. ;dps '----------'
  1566. ;dnl
  1567. ;call D_OutTree
  1568. ;dps '-------------------------'
  1569. ;dnl
  1570.     ;    stdcall getFoldByNum,strTets,0
  1571. ;mov     edi,eax
  1572. ;dpsP edi
  1573. ;dnl
  1574.      ;int3
  1575.         mov     eax,[PTree]
  1576.         lea     eax, [5*8+eax+_tree.open]
  1577.         call GetPath
  1578.       dpsP eax
  1579.       dnl
  1580.         ret
  1581. endp
  1582.  
  1583.  
  1584. ;;TEST
  1585. strTets1 db '/hd0/kol/asd1',0
  1586. strTets2 db '/hd0/kol/asd2',0
  1587. strTets3 db '/hd0/kol/asd3',0
  1588.  
  1589. TvetkaHD0:
  1590.         dd 2*4
  1591.         dd 4000
  1592.  
  1593.  Tus1:
  1594.         dd sname1
  1595.         dd Tvetka1
  1596. ;---------------------
  1597.  
  1598.  
  1599.  
  1600. Tvetka1:
  1601.         dd 2*4
  1602.         dd 4000
  1603.  
  1604.  Tus2:
  1605.         dd sname2
  1606.         dd TvetkaKOL
  1607. ;---------------------
  1608.  
  1609.  
  1610. TvetkaKOL:
  1611.         dd 2*4
  1612.         dd 4000
  1613.  
  1614.  Tus3:
  1615.         dd sname3
  1616.         dd 0
  1617. ;---------------------
  1618.  
  1619. sname1 db 'hd0',0
  1620. sname2 db '1',0
  1621. sname3 db 'kol',0
  1622.  
  1623. _TBUFSIZE dd 4000 - $
  1624.  
  1625.  
  1626. TVROOT rd 1
  1627.  
  1628. ;¡ã¤¥â ¡ãä¥à ®â¬¥ç¥­­ëå ä ©«®¢/¯ ¯®ª
  1629. ;®âªàëâì ¯ ¯ªã
  1630. ; ¥á«¨ ®­  ®â¬¥ç¥­  ¢áï, â® ­¨ç¥£® ­¥ ¤¥« âì
  1631. ; ¥á«¨ ¢ ­¥© ã¡à âì £ «ªã, â® ¤®¡ ¢¨âì ¢ ᯨ᮪ ®â¬¥ç¥­­ëå ¢á¥ ®áâ «ì­ë¥,
  1632. ;              ¯ ¯ªã ã¡à âì ¨§ ᯨ᪠
  1633. ; ¥á«¨ ¯®áâ ¢¨âì £ «ªã ­  ¯®á«¥¤­¥¬ ­¥ ¢ë¤¥«¥­­®¬ ä ©«¥, â® ­¨ç¥£®. ¯à®áâ® ¤®¡ ¢¨âì ¥£® ¢ ᯨ᮪,¬ ­¨¯ã«ï樨 á ¯ ¯ª ¬¨ ­¥§ ç¥¬
  1634. ;
  1635.  
  1636. ;vetka:
  1637. ; sizeused
  1638. ; sizebuf(def - 4000)
  1639. ; array of usel
  1640. ;
  1641. ; --- ॠ«¨§ æ¨ï ---
  1642. ;¤¥à¥¢® ¢ë¤¥«¥­­ëå ®¡ê¥ªâ®¢:
  1643. ; 㧥« (usel):
  1644. ;   pName - ¤¢á«®¢® - 㪠§ â¥«ì ­  áâப㠨¬ï 㧫 
  1645. ;   pNext - ¤¢á«®¢® - 㪠§ â¥«ì ­  vetka ¨«¨ 0
  1646.  
  1647.  
  1648. ;vetka {2*8,4000-2*8,
  1649. ;usel [Program_Files,0],
  1650. ;usel [Doc,v2]
  1651. ;}
  1652. ;v2:
  1653. ;vetka {1*8,4000-8,
  1654. ;usel [fold1,0]
  1655. ;}
  1656.