Subversion Repositories Kolibri OS

Rev

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