Subversion Repositories Kolibri OS

Rev

Rev 513 | Rev 525 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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