Subversion Repositories Kolibri OS

Rev

Rev 5565 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
750 victor 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
5565 serge 3
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
750 victor 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
593 mikedld 8
$Revision: 6311 $
9
 
10
 
521 diamond 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
512 spraid 14
 
525 diamond 15
; start with one entry: sys -> 
521 diamond 16
full_file_name_table dd sysdir_name
17
.size           dd      1
501 serge 18
 
521 diamond 19
tmp_file_name_size dd   1
20
endg
488 spraid 21
 
521 diamond 22
uglobal
525 diamond 23
; Parser_params will initialize: sysdir_name = "sys", sysdir_path = 
521 diamond 24
sysdir_name     rb      64
25
sysdir_path     rb      64
3725 Serge 26
sysdir_name1    rb      64
27
sysdir_path1    rb      64
28
 
29
; for example:
3780 Serge 30
;dir_name1      db 'KolibriOS',0
3725 Serge 31
;               rb 64-8
32
;dir_path1      db 'HD0/1',0
33
;               rb 64-6
34
endg
35
 
36
uglobal
521 diamond 37
tmp_file_name_table dd  ?
38
endg
501 serge 39
 
535 spraid 40
; use bx_from_load and init system directory /sys
543 spraid 41
proc Parser_params
42
locals
2434 Serge 43
  buff db 4 dup(?)              ; for test cd
543 spraid 44
endl
2434 Serge 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
488 spraid 54
@@:
2434 Serge 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
543 spraid 62
.next_cd:
2434 Serge 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
 
543 spraid 75
@@:
2434 Serge 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
543 spraid 83
.ok:
84
.not_found_cd:
2434 Serge 85
        ret
543 spraid 86
endp
501 serge 87
 
521 diamond 88
proc load_file_parse_table
2434 Serge 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
501 serge 95
 
2434 Serge 96
        invoke  ini.enum_keys, conf_fname, conf_path_sect, get_every_key
488 spraid 97
 
2434 Serge 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
488 spraid 103
endp
104
 
521 diamond 105
uglobal
106
def_val_1 db 0
107
endg
488 spraid 108
 
521 diamond 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
488 spraid 115
@@:
521 diamond 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
501 serge 133
 
2434 Serge 134
        invoke  ini.get_str, [f_name], [sec_name], ecx, ebx, 64, def_val_1
488 spraid 135
 
521 diamond 136
        cmp     byte [ebx], '/'
137
        jnz     @f
138
        lea     esi, [ebx+1]
139
        mov     edi, ebx
140
        mov     ecx, 63
2434 Serge 141
        rep movsb
488 spraid 142
@@:
521 diamond 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
488 spraid 154
@@:
521 diamond 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
488 spraid 171
@@:
521 diamond 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
488 spraid 180
 
521 diamond 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
501 serge 192
endp
193
 
521 diamond 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
488 spraid 204
@@:
521 diamond 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
512 spraid 212
@@:
521 diamond 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
512 spraid 238
endp
6311 serge 239
 
240
 
241
char_todown:
242
; convert character in al to downcase, using cp866 encoding
243
        cmp     al, 'A'
244
        jb      .ret
245
        cmp     al, 'Z'
246
        jbe     .az
247
        cmp     al, 0x80 ; 'А'
248
        jb      .ret
249
        cmp     al, 0x90 ; 'Р'
250
        jb      .rus
251
        cmp     al, 0xF0 ; 'Ё'
252
        jz      .yo
253
        cmp     al, 0x9F ; 'Я'
254
        ja      .ret
255
; 0x90-0x9F -> 0xE0-0xEF
256
        add     al, 0xE0-0x90
257
.ret:
258
        ret
259
 
260
.az:
261
.rus:  ; 0x80-0x8F -> 0xA0-0xAF
262
        add     al, 0x20
263
        ret
264
 
265
.yo:
266
        inc     al
267
        ret
268
 
269
 
270
char_toupper:
271
; convert character in al to uppercase, using cp866 encoding
272
        cmp     al, 'a'
273
        jb      .ret
274
        cmp     al, 'z'
275
        jbe     .az
276
        cmp     al, 0xA0 ; 'а'
277
        jb      .ret
278
        cmp     al, 0xE0 ; 'р'
279
        jb      .rus
280
        cmp     al, 0xF1 ; 'ё'
281
        jz      .yo
282
        cmp     al, 0xEF ; 'я'
283
        ja      .ret
284
; 0xE0-0xEF -> 0x90-0x9F
285
        sub     al, 0xE0-0x90
286
.ret:
287
        ret
288
 
289
.az:
290
.rus:  ; 0xA0-0xAF -> 0x80-0x8F
291
        and     al, not 0x20
292
        ret
293
 
294
.yo:
295
        dec     al
296
        ret
297
 
298
 
299
uni2ansi_str:
300
; convert UNICODE zero-terminated string to ASCII-string (codepage 866)
301
; in: esi->source, edi->buffer (may be esi=edi)
302
; destroys: eax,esi,edi
303
        lodsw
304
        call    uni2ansi_char
305
        stosb
306
        test    al, al
307
        jnz     uni2ansi_str
308
        ret
309
 
310
 
311
uni2ansi_char:
312
; convert UNICODE character in ax to ANSI character in al using cp866 encoding
313
        cmp     ax, 0x80
314
        jb      .ret
315
        cmp     ax, 0xB6
316
        jz      .B6
317
        cmp     ax, 0x400
318
        jb      .unk
319
        cmp     ax, 0x410
320
        jb      @f
321
        cmp     ax, 0x440
322
        jb      .rus1
323
        cmp     ax, 0x450
324
        jb      .rus2
325
        cmp     ax, 0x460
326
        jb      @f
327
.unk:
328
        mov     al, '_'
329
.ret:
330
        ret
331
 
332
.B6:
333
        mov     al, 20
334
        ret
335
 
336
.rus1:  ; 0x410-0x43F -> 0x80-0xAF
337
        add     al, 0x70
338
        ret
339
 
340
.rus2:  ; 0x440-0x44F -> 0xE0-0xEF
341
        add     al, 0xA0
342
        ret
343
 
344
@@:
345
        push    ecx edi
346
        mov     ecx, 8
347
        mov     edi, .table
348
        repnz scasb
349
        mov     ah, cl
350
        pop     edi ecx
351
        jnz     .unk
352
        mov     al, 0xF7
353
        sub     al, ah
354
        ret
355
 
356
.table  db  1, 51h, 4, 54h, 7, 57h, 0Eh, 5Eh
357
 
358
 
359
ansi2uni_char:
360
; convert ANSI character in al to UNICODE character in ax, using cp866 encoding
361
        movzx   eax, al
362
        cmp     al, 0x80
363
        jb      @f      ; 0x00-0x7F - trivial map
364
        cmp     al, 0xB0
365
        jb      .rus    ; 0x80-0xAF -> 0x410-0x43F
366
        cmp     al, 0xE0
367
        jb      .unk
368
        cmp     al, 0xF0
369
        jb      .rus2   ; 0xE0-0xEF -> 0x440-0x44F
370
        cmp     al, 0xF8
371
        jnc     .unk
372
        mov     al, [eax+uni2ansi_char.table-0xF0]
373
        add     ax, 400h
374
        ret
375
 
376
@@:
377
        cmp     al, 20
378
        jnz     .ret
379
        mov     al, 0xB6
380
.ret:
381
        ret
382
 
383
.rus:
384
        add     ax, 0x410-0x80
385
        ret
386
 
387
.rus2:
388
        add     ax, 0x440-0xE0
389
        ret
390
 
391
.unk:
392
        mov     al, '_'
393
        ret