Subversion Repositories Kolibri OS

Rev

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

  1. $Revision$
  2. ;-------------------------------------------------------------------------
  3. ;
  4. ;    Замена имен файлов
  5. ;
  6. ;
  7. ;     SPraid
  8. ;
  9. ;-------------------------------------------------------------------------
  10.  
  11. iglobal
  12. ; pointer to memory for path replace table,
  13. ; size of one record is 128 bytes: 64 bytes for search pattern + 64 bytes for replace string
  14.  
  15. ; start with one entry: sys -> <sysdir>
  16. full_file_name_table dd sysdir_name
  17. .size           dd      1
  18.  
  19. tmp_file_name_size dd   1
  20. endg
  21.  
  22. uglobal
  23. ; Parser_params will initialize: sysdir_name = "sys", sysdir_path = <sysdir>
  24. sysdir_name     rb      64
  25. sysdir_path     rb      64
  26. tmp_file_name_table dd  ?
  27. endg
  28.  
  29. ; берет параметры bx_from_load и инициализирует замену для /sys
  30. Parser_params:
  31.   mov eax,[OS_BASE+0x10000+bx_from_load]
  32.   mov ecx,sysdir_path
  33.   mov [ecx-64],dword 'sys'
  34.   cmp al,'r' ; рам диск
  35.   jnz @f
  36.   mov [ecx],dword 'RD/?'
  37.   mov [ecx+3],byte ah
  38.   mov [ecx+4],byte 0
  39.   ret
  40. @@:
  41.   sub al,49
  42.   mov [ecx],dword 'HD?/'
  43.   mov [ecx+2],byte al
  44.   mov [ecx+4],byte ah
  45.   mov [ecx+5],dword '/KOL'
  46.   mov [ecx+9],dword 'IBRI'
  47.   mov [ecx+13],byte 0
  48.   ret
  49.  
  50. proc load_file_parse_table
  51.   stdcall kernel_alloc,0x1000
  52.   mov [tmp_file_name_table],eax
  53.   mov edi,eax
  54.   mov esi,sysdir_name
  55.   mov ecx,128/4
  56.   rep movsd
  57.  
  58.   invoke ini.enum_keys,conf_fname,conf_path_sect,get_every_key
  59.  
  60.   mov eax,[tmp_file_name_table]
  61.   mov [full_file_name_table],eax
  62.   mov eax,[tmp_file_name_size]
  63.   mov [full_file_name_table.size],eax
  64.   ret
  65. endp
  66.  
  67. uglobal
  68. def_val_1 db 0
  69. endg
  70.  
  71. proc get_every_key stdcall, f_name, sec_name, key_name
  72.         mov     esi, [key_name]
  73.         mov     ecx, esi
  74.         cmp     byte [esi], '/'
  75.         jnz     @f
  76.         inc     esi
  77. @@:
  78.         mov     edi, [tmp_file_name_size]
  79.         shl     edi, 7
  80.         cmp     edi, 0x1000
  81.         jae     .stop_parse
  82.         add     edi, [tmp_file_name_table]
  83.         lea     ebx, [edi+64]
  84. @@:
  85.         cmp     edi, ebx
  86.         jae     .skip_this_key
  87.         lodsb
  88.         test    al, al
  89.         jz      @f
  90.         or      al, 20h
  91.         stosb
  92.         jmp     @b
  93. @@:
  94.         stosb
  95.  
  96.         invoke  ini.get_str, [f_name],[sec_name],ecx,ebx,64,def_val_1
  97.  
  98.         cmp     byte [ebx], '/'
  99.         jnz     @f
  100.         lea     esi, [ebx+1]
  101.         mov     edi, ebx
  102.         mov     ecx, 63
  103.         rep     movsb
  104. @@:
  105.         push    ebp
  106.         mov     ebp, [tmp_file_name_table]
  107.         mov     ecx, [tmp_file_name_size]
  108.         jecxz   .noreplace
  109.         mov     eax, ecx
  110.         dec     eax
  111.         shl     eax, 7
  112.         add     ebp, eax
  113. .replace_loop:
  114.         mov     edi, ebx
  115.         mov     esi, ebp
  116. @@:
  117.         lodsb
  118.         test    al, al
  119.         jz      .doreplace
  120.         mov     dl, [edi]
  121.         inc     edi
  122.         test    dl, dl
  123.         jz      .replace_loop_cont
  124.         or      dl, 20h
  125.         cmp     al, dl
  126.         jz      @b
  127.         jmp     .replace_loop_cont
  128. .doreplace:
  129.         cmp     byte [edi], 0
  130.         jz      @f
  131.         cmp     byte [edi], '/'
  132.         jnz     .replace_loop_cont
  133. @@:
  134.         lea     esi, [ebp+64]
  135.         call    .replace
  136.         jc      .skip_this_key2
  137. .replace_loop_cont:
  138.         sub     ebp, 128
  139.         loop    .replace_loop
  140. .noreplace:
  141.         pop     ebp
  142.  
  143.         inc     [tmp_file_name_size]
  144. .skip_this_key:
  145.         xor     eax, eax
  146.         inc     eax
  147.         ret
  148. .skip_this_key2:
  149.         pop     ebp
  150.         jmp     .skip_this_key
  151. .stop_parse:
  152.         xor     eax, eax
  153.         ret
  154. endp
  155.  
  156. proc get_every_key.replace
  157. ; in: ebx->destination, esi->first part of name, edi->second part of name
  158. ; maximum length is 64 bytes
  159. ; out: CF=1 <=> overflow
  160. ; 1) allocate temporary buffer in stack
  161.         sub     esp, 64
  162. ; 2) save second part of name to temporary buffer
  163.         push    esi
  164.         lea     esi, [esp+4]    ; esi->tmp buffer
  165.         xchg    esi, edi        ; edi->tmp buffer, esi->source
  166. @@:
  167.         lodsb
  168.         stosb
  169.         test    al, al
  170.         jnz     @b
  171. ; 3) copy first part of name to destination
  172.         pop     esi
  173.         mov     edi, ebx
  174. @@:
  175.         lodsb
  176.         test    al, al
  177.         jz      @f
  178.         stosb
  179.         jmp     @b
  180. @@:
  181. ; 4) restore second part of name from temporary buffer to destination
  182. ; (may cause overflow)
  183.         lea     edx, [ebx+64]   ; limit of destination
  184.         mov     esi, esp
  185. @@:
  186.         cmp     edi, edx
  187.         jae     .overflow
  188.         lodsb
  189.         stosb
  190.         test    al, al
  191.         jnz     @b
  192. ; all is OK
  193.         add     esp, 64         ; CF is cleared
  194.         ret
  195. .overflow:
  196. ; name is too long
  197.         add     esp, 64
  198.         stc
  199.         ret
  200. endp
  201.