Subversion Repositories Kolibri OS

Rev

Rev 513 | Rev 525 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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