Subversion Repositories Kolibri OS

Rev

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

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