Subversion Repositories Kolibri OS

Rev

Rev 543 | Rev 750 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 543 Rev 593
1
$Revision: 543 $
-
 
2
;-------------------------------------------------------------------------
1
;-------------------------------------------------------------------------
3
;
2
;
4
;  File path partial substitution (according to configuration)
3
;  File path partial substitution (according to configuration)
5
;
4
;
6
;
5
;
7
;     SPraid
6
;     SPraid
8
;
7
;
9
;-------------------------------------------------------------------------
8
;-------------------------------------------------------------------------
-
 
9
 
-
 
10
$Revision: 593 $
-
 
11
 
10
 
12
 
11
iglobal
13
iglobal
12
; pointer to memory for path replace table,
14
; 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
15
; size of one record is 128 bytes: 64 bytes for search pattern + 64 bytes for replace string
14
 
16
 
15
; start with one entry: sys -> 
17
; start with one entry: sys -> 
16
full_file_name_table dd sysdir_name
18
full_file_name_table dd sysdir_name
17
.size           dd      1
19
.size           dd      1
18
 
20
 
19
tmp_file_name_size dd   1
21
tmp_file_name_size dd   1
20
endg
22
endg
21
 
23
 
22
uglobal
24
uglobal
23
; Parser_params will initialize: sysdir_name = "sys", sysdir_path = 
25
; Parser_params will initialize: sysdir_name = "sys", sysdir_path = 
24
sysdir_name     rb      64
26
sysdir_name     rb      64
25
sysdir_path     rb      64
27
sysdir_path     rb      64
26
tmp_file_name_table dd  ?
28
tmp_file_name_table dd  ?
27
endg
29
endg
28
 
30
 
29
; use bx_from_load and init system directory /sys
31
; use bx_from_load and init system directory /sys
30
proc Parser_params
32
proc Parser_params
31
locals
33
locals
32
  buff db 4 dup(?)		; for test cd
34
  buff db 4 dup(?)		; for test cd
33
endl
35
endl
34
  mov eax,[OS_BASE+0x10000+bx_from_load]
36
  mov eax,[OS_BASE+0x10000+bx_from_load]
35
  mov ecx,sysdir_path
37
  mov ecx,sysdir_path
36
  mov [ecx-64],dword 'sys'
38
  mov [ecx-64],dword 'sys'
37
  cmp al,'r' ; if ram disk
39
  cmp al,'r' ; if ram disk
38
  jnz @f
40
  jnz @f
39
  mov [ecx],dword 'RD/?'
41
  mov [ecx],dword 'RD/?'
40
  mov [ecx+3],byte ah
42
  mov [ecx+3],byte ah
41
  mov [ecx+4],byte 0
43
  mov [ecx+4],byte 0
42
  ret
44
  ret
43
@@:
45
@@:
44
  cmp al,'m' ; if ram disk
46
  cmp al,'m' ; if ram disk
45
  jnz @f
47
  jnz @f
46
  mov [ecx],dword 'CD?/'	; if cd disk {m}
48
  mov [ecx],dword 'CD?/'	; if cd disk {m}
47
  mov [ecx+4],byte '1'
49
  mov [ecx+4],byte '1'
48
  mov [ecx+5],dword '/KOL'
50
  mov [ecx+5],dword '/KOL'
49
  mov [ecx+9],dword 'IBRI'
51
  mov [ecx+9],dword 'IBRI'
50
  mov [ecx+13],byte 0
52
  mov [ecx+13],byte 0
51
.next_cd:
53
.next_cd:
52
  mov [ecx+2],byte ah
54
  mov [ecx+2],byte ah
53
  inc ah
55
  inc ah
54
  cmp ah,'5'
56
  cmp ah,'5'
55
  je  .not_found_cd
57
  je  .not_found_cd
56
  lea edx,[buff]
58
  lea edx,[buff]
57
  pushad
59
  pushad
58
  stdcall read_file,read_firstapp,edx,0,4
60
  stdcall read_file,read_firstapp,edx,0,4
59
  popad
61
  popad
60
  cmp [edx],dword 'MENU'
62
  cmp [edx],dword 'MENU'
61
  jne .next_cd
63
  jne .next_cd
62
  jmp .ok
64
  jmp .ok
63
  
65
  
64
@@:
66
@@:
65
  sub al,49
67
  sub al,49
66
  mov [ecx],dword 'HD?/'	; if hard disk
68
  mov [ecx],dword 'HD?/'	; if hard disk
67
  mov [ecx+2],byte al
69
  mov [ecx+2],byte al
68
  mov [ecx+4],byte ah
70
  mov [ecx+4],byte ah
69
  mov [ecx+5],dword '/KOL'
71
  mov [ecx+5],dword '/KOL'
70
  mov [ecx+9],dword 'IBRI'
72
  mov [ecx+9],dword 'IBRI'
71
  mov [ecx+13],byte 0
73
  mov [ecx+13],byte 0
72
.ok:
74
.ok:
73
.not_found_cd:
75
.not_found_cd:
74
  ret
76
  ret
75
endp
77
endp
76
 
78
 
77
proc load_file_parse_table
79
proc load_file_parse_table
78
  stdcall kernel_alloc,0x1000
80
  stdcall kernel_alloc,0x1000
79
  mov [tmp_file_name_table],eax
81
  mov [tmp_file_name_table],eax
80
  mov edi,eax
82
  mov edi,eax
81
  mov esi,sysdir_name
83
  mov esi,sysdir_name
82
  mov ecx,128/4
84
  mov ecx,128/4
83
  rep movsd
85
  rep movsd
84
 
86
 
85
  invoke ini.enum_keys,conf_fname,conf_path_sect,get_every_key
87
  invoke ini.enum_keys,conf_fname,conf_path_sect,get_every_key
86
 
88
 
87
  mov eax,[tmp_file_name_table]
89
  mov eax,[tmp_file_name_table]
88
  mov [full_file_name_table],eax
90
  mov [full_file_name_table],eax
89
  mov eax,[tmp_file_name_size]
91
  mov eax,[tmp_file_name_size]
90
  mov [full_file_name_table.size],eax
92
  mov [full_file_name_table.size],eax
91
  ret
93
  ret
92
endp
94
endp
93
 
95
 
94
uglobal
96
uglobal
95
def_val_1 db 0
97
def_val_1 db 0
96
endg
98
endg
97
 
99
 
98
proc get_every_key stdcall, f_name, sec_name, key_name
100
proc get_every_key stdcall, f_name, sec_name, key_name
99
        mov     esi, [key_name]
101
        mov     esi, [key_name]
100
        mov     ecx, esi
102
        mov     ecx, esi
101
        cmp     byte [esi], '/'
103
        cmp     byte [esi], '/'
102
        jnz     @f
104
        jnz     @f
103
        inc     esi
105
        inc     esi
104
@@:
106
@@:
105
        mov     edi, [tmp_file_name_size]
107
        mov     edi, [tmp_file_name_size]
106
        shl     edi, 7
108
        shl     edi, 7
107
        cmp     edi, 0x1000
109
        cmp     edi, 0x1000
108
        jae     .stop_parse
110
        jae     .stop_parse
109
        add     edi, [tmp_file_name_table]
111
        add     edi, [tmp_file_name_table]
110
        lea     ebx, [edi+64]
112
        lea     ebx, [edi+64]
111
@@:
113
@@:
112
        cmp     edi, ebx
114
        cmp     edi, ebx
113
        jae     .skip_this_key
115
        jae     .skip_this_key
114
        lodsb
116
        lodsb
115
        test    al, al
117
        test    al, al
116
        jz      @f
118
        jz      @f
117
        or      al, 20h
119
        or      al, 20h
118
        stosb
120
        stosb
119
        jmp     @b
121
        jmp     @b
120
@@:
122
@@:
121
        stosb
123
        stosb
122
 
124
 
123
        invoke  ini.get_str, [f_name],[sec_name],ecx,ebx,64,def_val_1
125
        invoke  ini.get_str, [f_name],[sec_name],ecx,ebx,64,def_val_1
124
 
126
 
125
        cmp     byte [ebx], '/'
127
        cmp     byte [ebx], '/'
126
        jnz     @f
128
        jnz     @f
127
        lea     esi, [ebx+1]
129
        lea     esi, [ebx+1]
128
        mov     edi, ebx
130
        mov     edi, ebx
129
        mov     ecx, 63
131
        mov     ecx, 63
130
        rep     movsb
132
        rep     movsb
131
@@:
133
@@:
132
        push    ebp
134
        push    ebp
133
        mov     ebp, [tmp_file_name_table]
135
        mov     ebp, [tmp_file_name_table]
134
        mov     ecx, [tmp_file_name_size]
136
        mov     ecx, [tmp_file_name_size]
135
        jecxz   .noreplace
137
        jecxz   .noreplace
136
        mov     eax, ecx
138
        mov     eax, ecx
137
        dec     eax
139
        dec     eax
138
        shl     eax, 7
140
        shl     eax, 7
139
        add     ebp, eax
141
        add     ebp, eax
140
.replace_loop:
142
.replace_loop:
141
        mov     edi, ebx
143
        mov     edi, ebx
142
        mov     esi, ebp
144
        mov     esi, ebp
143
@@:
145
@@:
144
        lodsb
146
        lodsb
145
        test    al, al
147
        test    al, al
146
        jz      .doreplace
148
        jz      .doreplace
147
        mov     dl, [edi]
149
        mov     dl, [edi]
148
        inc     edi
150
        inc     edi
149
        test    dl, dl
151
        test    dl, dl
150
        jz      .replace_loop_cont
152
        jz      .replace_loop_cont
151
        or      dl, 20h
153
        or      dl, 20h
152
        cmp     al, dl
154
        cmp     al, dl
153
        jz      @b
155
        jz      @b
154
        jmp     .replace_loop_cont
156
        jmp     .replace_loop_cont
155
.doreplace:
157
.doreplace:
156
        cmp     byte [edi], 0
158
        cmp     byte [edi], 0
157
        jz      @f
159
        jz      @f
158
        cmp     byte [edi], '/'
160
        cmp     byte [edi], '/'
159
        jnz     .replace_loop_cont
161
        jnz     .replace_loop_cont
160
@@:
162
@@:
161
        lea     esi, [ebp+64]
163
        lea     esi, [ebp+64]
162
        call    .replace
164
        call    .replace
163
        jc      .skip_this_key2
165
        jc      .skip_this_key2
164
.replace_loop_cont:
166
.replace_loop_cont:
165
        sub     ebp, 128
167
        sub     ebp, 128
166
        loop    .replace_loop
168
        loop    .replace_loop
167
.noreplace:
169
.noreplace:
168
        pop     ebp
170
        pop     ebp
169
 
171
 
170
        inc     [tmp_file_name_size]
172
        inc     [tmp_file_name_size]
171
.skip_this_key:
173
.skip_this_key:
172
        xor     eax, eax
174
        xor     eax, eax
173
        inc     eax
175
        inc     eax
174
        ret
176
        ret
175
.skip_this_key2:
177
.skip_this_key2:
176
        pop     ebp
178
        pop     ebp
177
        jmp     .skip_this_key
179
        jmp     .skip_this_key
178
.stop_parse:
180
.stop_parse:
179
        xor     eax, eax
181
        xor     eax, eax
180
        ret
182
        ret
181
endp
183
endp
182
 
184
 
183
proc get_every_key.replace
185
proc get_every_key.replace
184
; in: ebx->destination, esi->first part of name, edi->second part of name
186
; in: ebx->destination, esi->first part of name, edi->second part of name
185
; maximum length is 64 bytes
187
; maximum length is 64 bytes
186
; out: CF=1 <=> overflow
188
; out: CF=1 <=> overflow
187
; 1) allocate temporary buffer in stack
189
; 1) allocate temporary buffer in stack
188
        sub     esp, 64
190
        sub     esp, 64
189
; 2) save second part of name to temporary buffer
191
; 2) save second part of name to temporary buffer
190
        push    esi
192
        push    esi
191
        lea     esi, [esp+4]    ; esi->tmp buffer
193
        lea     esi, [esp+4]    ; esi->tmp buffer
192
        xchg    esi, edi        ; edi->tmp buffer, esi->source
194
        xchg    esi, edi        ; edi->tmp buffer, esi->source
193
@@:
195
@@:
194
        lodsb
196
        lodsb
195
        stosb
197
        stosb
196
        test    al, al
198
        test    al, al
197
        jnz     @b
199
        jnz     @b
198
; 3) copy first part of name to destination
200
; 3) copy first part of name to destination
199
        pop     esi
201
        pop     esi
200
        mov     edi, ebx
202
        mov     edi, ebx
201
@@:
203
@@:
202
        lodsb
204
        lodsb
203
        test    al, al
205
        test    al, al
204
        jz      @f
206
        jz      @f
205
        stosb
207
        stosb
206
        jmp     @b
208
        jmp     @b
207
@@:
209
@@:
208
; 4) restore second part of name from temporary buffer to destination
210
; 4) restore second part of name from temporary buffer to destination
209
; (may cause overflow)
211
; (may cause overflow)
210
        lea     edx, [ebx+64]   ; limit of destination
212
        lea     edx, [ebx+64]   ; limit of destination
211
        mov     esi, esp
213
        mov     esi, esp
212
@@:
214
@@:
213
        cmp     edi, edx
215
        cmp     edi, edx
214
        jae     .overflow
216
        jae     .overflow
215
        lodsb
217
        lodsb
216
        stosb
218
        stosb
217
        test    al, al
219
        test    al, al
218
        jnz     @b
220
        jnz     @b
219
; all is OK
221
; all is OK
220
        add     esp, 64         ; CF is cleared
222
        add     esp, 64         ; CF is cleared
221
        ret
223
        ret
222
.overflow:
224
.overflow:
223
; name is too long
225
; name is too long
224
        add     esp, 64
226
        add     esp, 64
225
        stc
227
        stc
226
        ret
228
        ret
227
endp
229
endp