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