Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2288 clevermous 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
6462 pathoswith 3
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
4
;;  Distributed under terms of the GNU General Public License.  ;;
2288 clevermous 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 -> 
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 = 
24
sysdir_name     rb      64
25
sysdir_path     rb      64
3663 mario79 26
sysdir_name1    rb      64
27
sysdir_path1    rb      64
28
 
29
; for example:
3780 Serge 30
;dir_name1      db 'KolibriOS',0
3663 mario79 31
;               rb 64-8
32
;dir_path1      db 'HD0/1',0
33
;               rb 64-6
34
endg
35
 
36
uglobal
2288 clevermous 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
3780 Serge 74
 
2288 clevermous 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
6262 pathoswith 239
 
6471 pathoswith 240
cp866toUpper:
241
; convert cp866 character in al to uppercase
242
        cmp     al, 'a'
6262 pathoswith 243
        jb      .ret
6471 pathoswith 244
        cmp     al, 'z'
245
        jbe     @f
246
        cmp     al, 0xA0
6262 pathoswith 247
        jb      .ret
6471 pathoswith 248
        cmp     al, 0xB0
249
        jb      @f
250
        cmp     al, 0xE0
251
        jb      .ret
252
        cmp     al, 0xF0
6262 pathoswith 253
        jb      .rus
6471 pathoswith 254
        cmp     al, 0xF7
6262 pathoswith 255
        ja      .ret
6471 pathoswith 256
        and     eax, -2
6262 pathoswith 257
.ret:
258
        ret
259
 
6471 pathoswith 260
@@:
261
        sub     eax, 32
6262 pathoswith 262
        ret
263
 
6471 pathoswith 264
.rus:
265
        sub     eax, 0xE0-0x90
6262 pathoswith 266
        ret
267
 
6471 pathoswith 268
utf16toUpper:
269
; convert UTF-16 character in ax to uppercase
270
        cmp     ax, 'a'
6262 pathoswith 271
        jb      .ret
6471 pathoswith 272
        cmp     ax, 'z'
273
        jbe     @f
274
        cmp     ax, 430h
6262 pathoswith 275
        jb      .ret
6471 pathoswith 276
        cmp     ax, 450h
277
        jb      @f
278
        cmp     ax, 460h
279
        jnc     .ret
280
        sub     eax, 80
6262 pathoswith 281
.ret:
282
        ret
283
 
6471 pathoswith 284
@@:
285
        sub     eax, 32
6262 pathoswith 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
6462 pathoswith 370
 
6471 pathoswith 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
6462 pathoswith 386
 
6471 pathoswith 387
; SF=1 -> counter
388
; ZF=1 -> zero char
389
 
390
UTF16to8_string:
6462 pathoswith 391
;   in:
6471 pathoswith 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)
6462 pathoswith 412
        dec     ecx
413
        js      .ret
6471 pathoswith 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
6462 pathoswith 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