Subversion Repositories Kolibri OS

Rev

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

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