Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
  4. ;;  Distributed under terms of the GNU General Public License.  ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 6471 $
  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. sysdir_name1    rb      64
  27. sysdir_path1    rb      64
  28.  
  29. ; for example:
  30. ;dir_name1      db 'KolibriOS',0
  31. ;               rb 64-8
  32. ;dir_path1      db 'HD0/1',0
  33. ;               rb 64-6
  34. endg
  35.  
  36. uglobal
  37. tmp_file_name_table dd  ?
  38. endg
  39.  
  40. ; use bx_from_load and init system directory /sys
  41. proc Parser_params
  42. locals
  43.   buff db 4 dup(?)              ; for test cd
  44. endl
  45.         mov     eax, [OS_BASE+0x10000+bx_from_load]
  46.         mov     ecx, sysdir_path
  47.         mov     [ecx-64], dword 'sys'
  48.         cmp     al, 'r'; if ram disk
  49.         jnz     @f
  50.         mov     [ecx], dword 'RD/?'
  51.         mov     [ecx+3], byte ah
  52.         mov     [ecx+4], byte 0
  53.         ret
  54. @@:
  55.         cmp     al, 'm'; if ram disk
  56.         jnz     @f
  57.         mov     [ecx], dword 'CD?/'; if cd disk {m}
  58.         mov     [ecx+4], byte '1'
  59.         mov     [ecx+5], dword '/KOL'
  60.         mov     [ecx+9], dword 'IBRI'
  61.         mov     [ecx+13], byte 0
  62. .next_cd:
  63.         mov     [ecx+2], byte ah
  64.         inc     ah
  65.         cmp     ah, '5'
  66.         je      .not_found_cd
  67.         lea     edx, [buff]
  68.         pushad
  69.         stdcall read_file, read_firstapp, edx, 0, 4
  70.         popad
  71.         cmp     [edx], dword 'MENU'
  72.         jne     .next_cd
  73.         jmp     .ok
  74.  
  75. @@:
  76.         sub     al, 49
  77.         mov     [ecx], dword 'HD?/'; if hard disk
  78.         mov     [ecx+2], byte al
  79.         mov     [ecx+4], byte ah
  80.         mov     [ecx+5], dword '/KOL'
  81.         mov     [ecx+9], dword 'IBRI'
  82.         mov     [ecx+13], byte 0
  83. .ok:
  84. .not_found_cd:
  85.         ret
  86. endp
  87.  
  88. proc load_file_parse_table
  89.         stdcall kernel_alloc, 0x1000
  90.         mov     [tmp_file_name_table], eax
  91.         mov     edi, eax
  92.         mov     esi, sysdir_name
  93.         mov     ecx, 128/4
  94.         rep movsd
  95.  
  96.         invoke  ini.enum_keys, conf_fname, conf_path_sect, get_every_key
  97.  
  98.         mov     eax, [tmp_file_name_table]
  99.         mov     [full_file_name_table], eax
  100.         mov     eax, [tmp_file_name_size]
  101.         mov     [full_file_name_table.size], eax
  102.         ret
  103. endp
  104.  
  105. uglobal
  106. def_val_1 db 0
  107. endg
  108.  
  109. proc get_every_key stdcall, f_name, sec_name, key_name
  110.         mov     esi, [key_name]
  111.         mov     ecx, esi
  112.         cmp     byte [esi], '/'
  113.         jnz     @f
  114.         inc     esi
  115. @@:
  116.         mov     edi, [tmp_file_name_size]
  117.         shl     edi, 7
  118.         cmp     edi, 0x1000
  119.         jae     .stop_parse
  120.         add     edi, [tmp_file_name_table]
  121.         lea     ebx, [edi+64]
  122. @@:
  123.         cmp     edi, ebx
  124.         jae     .skip_this_key
  125.         lodsb
  126.         test    al, al
  127.         jz      @f
  128.         or      al, 20h
  129.         stosb
  130.         jmp     @b
  131. @@:
  132.         stosb
  133.  
  134.         invoke  ini.get_str, [f_name], [sec_name], ecx, ebx, 64, def_val_1
  135.  
  136.         cmp     byte [ebx], '/'
  137.         jnz     @f
  138.         lea     esi, [ebx+1]
  139.         mov     edi, ebx
  140.         mov     ecx, 63
  141.         rep movsb
  142. @@:
  143.         push    ebp
  144.         mov     ebp, [tmp_file_name_table]
  145.         mov     ecx, [tmp_file_name_size]
  146.         jecxz   .noreplace
  147.         mov     eax, ecx
  148.         dec     eax
  149.         shl     eax, 7
  150.         add     ebp, eax
  151. .replace_loop:
  152.         mov     edi, ebx
  153.         mov     esi, ebp
  154. @@:
  155.         lodsb
  156.         test    al, al
  157.         jz      .doreplace
  158.         mov     dl, [edi]
  159.         inc     edi
  160.         test    dl, dl
  161.         jz      .replace_loop_cont
  162.         or      dl, 20h
  163.         cmp     al, dl
  164.         jz      @b
  165.         jmp     .replace_loop_cont
  166. .doreplace:
  167.         cmp     byte [edi], 0
  168.         jz      @f
  169.         cmp     byte [edi], '/'
  170.         jnz     .replace_loop_cont
  171. @@:
  172.         lea     esi, [ebp+64]
  173.         call    .replace
  174.         jc      .skip_this_key2
  175. .replace_loop_cont:
  176.         sub     ebp, 128
  177.         loop    .replace_loop
  178. .noreplace:
  179.         pop     ebp
  180.  
  181.         inc     [tmp_file_name_size]
  182. .skip_this_key:
  183.         xor     eax, eax
  184.         inc     eax
  185.         ret
  186. .skip_this_key2:
  187.         pop     ebp
  188.         jmp     .skip_this_key
  189. .stop_parse:
  190.         xor     eax, eax
  191.         ret
  192. endp
  193.  
  194. proc get_every_key.replace
  195. ; in: ebx->destination, esi->first part of name, edi->second part of name
  196. ; maximum length is 64 bytes
  197. ; out: CF=1 <=> overflow
  198. ; 1) allocate temporary buffer in stack
  199.         sub     esp, 64
  200. ; 2) save second part of name to temporary buffer
  201.         push    esi
  202.         lea     esi, [esp+4]    ; esi->tmp buffer
  203.         xchg    esi, edi        ; edi->tmp buffer, esi->source
  204. @@:
  205.         lodsb
  206.         stosb
  207.         test    al, al
  208.         jnz     @b
  209. ; 3) copy first part of name to destination
  210.         pop     esi
  211.         mov     edi, ebx
  212. @@:
  213.         lodsb
  214.         test    al, al
  215.         jz      @f
  216.         stosb
  217.         jmp     @b
  218. @@:
  219. ; 4) restore second part of name from temporary buffer to destination
  220. ; (may cause overflow)
  221.         lea     edx, [ebx+64]   ; limit of destination
  222.         mov     esi, esp
  223. @@:
  224.         cmp     edi, edx
  225.         jae     .overflow
  226.         lodsb
  227.         stosb
  228.         test    al, al
  229.         jnz     @b
  230. ; all is OK
  231.         add     esp, 64         ; CF is cleared
  232.         ret
  233. .overflow:
  234. ; name is too long
  235.         add     esp, 64
  236.         stc
  237.         ret
  238. endp
  239.  
  240. cp866toUpper:
  241. ; convert cp866 character in al to uppercase
  242.         cmp     al, 'a'
  243.         jb      .ret
  244.         cmp     al, 'z'
  245.         jbe     @f
  246.         cmp     al, 0xA0
  247.         jb      .ret
  248.         cmp     al, 0xB0
  249.         jb      @f
  250.         cmp     al, 0xE0
  251.         jb      .ret
  252.         cmp     al, 0xF0
  253.         jb      .rus
  254.         cmp     al, 0xF7
  255.         ja      .ret
  256.         and     eax, -2
  257. .ret:
  258.         ret
  259.  
  260. @@:
  261.         sub     eax, 32
  262.         ret
  263.  
  264. .rus:
  265.         sub     eax, 0xE0-0x90
  266.         ret
  267.  
  268. utf16toUpper:
  269. ; convert UTF-16 character in ax to uppercase
  270.         cmp     ax, 'a'
  271.         jb      .ret
  272.         cmp     ax, 'z'
  273.         jbe     @f
  274.         cmp     ax, 430h
  275.         jb      .ret
  276.         cmp     ax, 450h
  277.         jb      @f
  278.         cmp     ax, 460h
  279.         jnc     .ret
  280.         sub     eax, 80
  281. .ret:
  282.         ret
  283.  
  284. @@:
  285.         sub     eax, 32
  286.         ret
  287.  
  288. uni2ansi_char:
  289. ; convert UNICODE character in ax to ANSI character in al using cp866 encoding
  290.         cmp     ax, 0x80
  291.         jb      .ret
  292.         cmp     ax, 0xB6
  293.         jz      .B6
  294.         cmp     ax, 0x400
  295.         jb      .unk
  296.         cmp     ax, 0x410
  297.         jb      @f
  298.         cmp     ax, 0x440
  299.         jb      .rus1
  300.         cmp     ax, 0x450
  301.         jb      .rus2
  302.         cmp     ax, 0x460
  303.         jb      @f
  304. .unk:
  305.         mov     al, '_'
  306. .ret:
  307.         ret
  308.  
  309. .B6:
  310.         mov     al, 20
  311.         ret
  312.  
  313. .rus1:  ; 0x410-0x43F -> 0x80-0xAF
  314.         add     al, 0x70
  315.         ret
  316.  
  317. .rus2:  ; 0x440-0x44F -> 0xE0-0xEF
  318.         add     al, 0xA0
  319.         ret
  320.  
  321. @@:
  322.         push    ecx edi
  323.         mov     ecx, 8
  324.         mov     edi, .table
  325.         repnz scasb
  326.         mov     ah, cl
  327.         pop     edi ecx
  328.         jnz     .unk
  329.         mov     al, 0xF7
  330.         sub     al, ah
  331.         ret
  332.  
  333. .table  db  1, 51h, 4, 54h, 7, 57h, 0Eh, 5Eh
  334.  
  335. ansi2uni_char:
  336. ; convert ANSI character in al to UNICODE character in ax, using cp866 encoding
  337.         movzx   eax, al
  338.         cmp     al, 0x80
  339.         jb      @f      ; 0x00-0x7F - trivial map
  340.         cmp     al, 0xB0
  341.         jb      .rus    ; 0x80-0xAF -> 0x410-0x43F
  342.         cmp     al, 0xE0
  343.         jb      .unk
  344.         cmp     al, 0xF0
  345.         jb      .rus2   ; 0xE0-0xEF -> 0x440-0x44F
  346.         cmp     al, 0xF8
  347.         jnc     .unk
  348.         mov     al, [eax+uni2ansi_char.table-0xF0]
  349.         add     ax, 400h
  350.         ret
  351.  
  352. @@:
  353.         cmp     al, 20
  354.         jnz     .ret
  355.         mov     al, 0xB6
  356. .ret:
  357.         ret
  358.  
  359. .rus:
  360.         add     ax, 0x410-0x80
  361.         ret
  362.  
  363. .rus2:
  364.         add     ax, 0x440-0xE0
  365.         ret
  366.  
  367. .unk:
  368.         mov     al, '_'
  369.         ret
  370.  
  371. cp866toUTF8_string:
  372. ;   in:
  373. ; esi -> cp866 string (could be zero terminated)
  374. ; edi -> buffer for UTF-8 string
  375. ; ecx = buffer size (signed)
  376.         lodsb
  377.         call    ansi2uni_char
  378.         push    eax
  379.         call    UTF16to8
  380.         pop     eax
  381.         js      @f
  382.         test    eax, eax
  383.         jnz     cp866toUTF8_string
  384. @@:
  385.         ret
  386.  
  387. ; SF=1 -> counter
  388. ; ZF=1 -> zero char
  389.  
  390. UTF16to8_string:
  391. ;   in:
  392. ; esi -> UTF-16 string (could be zero terminated)
  393. ; edi -> buffer for UTF-8 string
  394. ; ecx = buffer size (signed)
  395.         xor     eax, eax
  396. @@:
  397.         lodsw
  398.         push    eax
  399.         call    UTF16to8
  400.         pop     eax
  401.         js      @f
  402.         test    eax, eax
  403.         jnz     @b
  404. @@:
  405.         ret
  406.  
  407. UTF16to8:
  408. ;   in:
  409. ; eax = UTF-16 char
  410. ; edi -> buffer for UTF-8 char (increasing)
  411. ; ecx = byte counter (decreasing)
  412.         dec     ecx
  413.         js      .ret
  414.         cmp     eax, 80h
  415.         jnc     @f
  416.         stosb
  417.         test    eax, eax    ; SF=0
  418. .ret:
  419.         ret
  420.  
  421. @@:
  422.         dec     ecx
  423.         js      .ret
  424.         cmp     eax, 800h
  425.         jnc     @f
  426.         shl     eax, 2
  427.         shr     al, 2
  428.         or      eax, 1100000010000000b
  429.         xchg    al, ah
  430.         stosw
  431.         ret
  432.  
  433. @@:
  434.         dec     ecx
  435.         js      .ret
  436.         shl     eax, 4
  437.         shr     ax, 2
  438.         shr     al, 2
  439.         or      eax, 111000001000000010000000b
  440.         bswap   eax
  441.         shr     eax, 8
  442.         stosb
  443.         shr     eax, 8
  444.         stosw
  445.         ret
  446.  
  447. utf8to16:
  448. ; in: esi -> UTF-8 char (increasing)
  449. ; out: ax = UTF-16 char
  450.         lodsb
  451.         test    al, al
  452.         jns     .got
  453.         shl     al, 2
  454.         jnc     utf8to16
  455. @@:
  456.         shl     ax, 8
  457.         lodsb
  458.         test    al, al
  459.         jns     .got
  460.         shl     al, 2
  461.         jc      @b
  462.         shr     ah, 2
  463.         shl     ax, 3
  464.         jnc     @f
  465.         shl     eax, 3
  466.         lodsb
  467.         test    al, al
  468.         jns     .got
  469.         shl     al, 2
  470.         jc      @b
  471.         shr     eax, 2
  472.         ret
  473.  
  474. @@:
  475.         shr     ax, 5
  476.         ret
  477.  
  478. .got:
  479.         xor     ah, ah
  480.         ret
  481.  
  482. strlen:
  483. ; in: esi -> source
  484. ; out: ecx = length
  485.         push    edi eax
  486.         or      ecx, -1
  487.         mov     edi, esi
  488.         xor     eax, eax
  489.         repnz scasb
  490.         inc     ecx
  491.         not     ecx
  492.         pop     eax edi
  493.         ret
  494.