Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
488 spraid 1
;-----------------------------------------------------------------------------
2
; Copyright (c) 2007, SPraid
3
;-----------------------------------------------------------------------------
4
format MS COFF
5
 
6
public EXPORTS
7
 
8
include '../proc32.inc'
9
include 'proc.inc'
10
 
11
purge section
12
section '.flat' code readable align 16
13
 
14
mem.alloc   dd ?
15
mem.free    dd ?
16
mem.realloc dd ?
17
dll.load    dd ?
18
 
19
block_count: dd 0
20
sect_num: dd 0
21
data_adr: dd 0
22
data_adr_last dd 0
23
 
24
filei_len	EQU 0x4000
25
filei		   dd ?;0x4000   ; ссылки на данные - типа там храниться будит... вначале там - скока нада выделить
26
sec_i_len	EQU 0x4000
27
sec_i		   dd ?;0x4000
28
dat_i_len	EQU 0x4000
29
dat_i		   dd ?;0x4000
30
 
31
 
32
;-----------------------------------------------------------------------------
33
proc lib_init ;////////// Инцилизация библиотеки (автоматический вызов)///////
34
;-----------------------------------------------------------------------------
35
	mov	[mem.alloc],eax
36
	mov	[mem.free],ebx
37
	mov	[mem.realloc],ecx
38
	mov	[dll.load],edx
39
	xor eax,eax
40
	inc eax
41
	ret
42
endp
43
 
44
 
45
; структура блока
46
	block_adr EQU 0
47
	block_name EQU block_adr + 4
48
	block_i_count EQU block_name + 30
49
	block_len EQU block_i_count + 4
50
; структура данных
51
	data_name EQU 0
52
	data_prev EQU data_name+200
53
	data_next EQU data_prev+4
54
	data_len  EQU data_next+4
55
 
56
 
57
 
58
 
59
; взять следущий пару занчения ключа
60
proc ini.get_par stdcall, sect:dword, param:dword, val:dword, num:dword
61
 
62
  pushad
63
  mov edx,[block_count]
64
  mov edi,[sect]
65
  mov esi,[sec_i]
66
  add esi,block_name
67
@@: call strcmp
68
  cmp eax,-1
69
  jne .sec_found
70
  dec edx
71
  or edx,edx
72
  jz .sec_not_found
73
  add esi,block_len
74
  jmp @b
75
 .sec_found:
76
 
77
  mov eax,esi
78
  sub eax,block_name
79
  add eax, block_i_count
80
  mov eax,[eax]
81
  ; eax - count
82
  mov ebx,[num] 		 ; test max count
83
  ; ebx - num
84
  cmp eax,ebx
85
  jle .param_not_found
86
 
87
  sub esi,4
88
  mov esi,[esi]
89
  ; esi - first adr
90
  mov eax,ebx	 ; eax - num
91
@@:
92
  or eax,eax
93
  je .param_found
94
  dec eax
95
  add esi,data_next
96
  mov esi,[esi]
97
  jmp @b
98
 
99
 .param_found:
100
  mov ebx,esi
101
  mov eax,[param]
102
  mov cl,'='
103
  call copy_s
104
  add ebx,eax
105
  add ebx,1
106
  mov eax,[val]
107
  mov cl,0
108
  call copy_s
109
  jmp .ok
110
 
111
 .param_not_found:
112
 .sec_not_found:
113
; set_default_.... 0
114
 mov eax,[param]
115
 mov [eax],byte 0
116
 mov eax,[val]
117
 mov [eax],byte 0
118
 .ok:
119
  popad
120
  ret
121
 
122
 
123
endp
124
;------------------------------------------------------
125
proc ini.get_str stdcall, sect:dword, param:dword, buff:dword, default:dword
126
  ; sect - секция
127
  ; param - параметр
128
  ; buff - буфер
129
  ; default - если отсутствует
130
 pushad
131
  mov edx,[block_count]
132
  mov edi,[sect]
133
  mov esi,[sec_i]
134
  add esi,block_name
135
@@: call strcmp
136
  cmp eax,-1
137
  jne .sec_found
138
  dec edx
139
  or edx,edx
140
  jz .sec_not_found
141
  add esi,block_len
142
  jmp @b
143
 .sec_found:
144
 
145
  mov eax,esi
146
  sub eax,block_name
147
  add eax, block_i_count
148
  mov eax,[eax]
149
  ; eax - count
150
  sub esi,4
151
  mov esi,[esi]
152
  ; esi - first adr
153
  mov edi,[param]
154
  push eax
155
 
156
@@:
157
  mov cl,'='
158
  mov eax,text
159
  mov ebx,esi
160
  call copy_s
161
  mov edx,eax
162
  push esi
163
  mov esi,text
164
  call strcmp
165
  pop esi
166
  cmp eax,-1
167
  jne .param_found
168
  pop eax
169
  dec eax
170
  or eax,eax
171
  jz .sec_not_found
172
  push eax
173
  add esi,data_next
174
  mov esi,[esi]
175
  jmp @b
176
 .param_found:
177
  mov ebx,esi
178
  add ebx,edx
179
  add ebx,1
180
  pop eax
181
  mov eax,[buff]
182
  mov cl,0
183
  call copy_s
184
  jmp .ok
185
 .param_not_found:
186
 .sec_not_found:
187
; set_default_text
188
  mov eax,[buff]
189
  mov ebx,[default]
190
  mov cl,0
191
  call copy_s
192
 .ok:
193
  popad
194
  ret
195
endp
196
;--------------------------------------------------------------------------------
197
 
198
 
199
 
200
 
201
 
202
 
203
 
204
 
205
 
206
 
207
 
208
 
209
 
210
 
211
;-----------------------------------------------------------------------------
212
proc ini.load stdcall filename ;/(загрузка ини файла)/////////////////////////
213
locals
214
 reads: dd 0,0,0
215
 fsize	dd 0
216
 addr	dd filei
217
 nulls	db 0
218
 fname	dd 0
219
endl
220
	mov [reads],dword 0
221
	mov [reads+4],dword 0
222
	mov [reads+8],dword 0
223
	mov [nulls],byte 0
224
 
225
	stdcall get_filesize, [filename]
226
	mov [fsize],eax
227
 
228
	inc eax
229
 
230
	mov ebx,eax
231
 
232
	invoke	mem.alloc,eax
233
	mov [filei],eax
234
 
235
	mov [addr],eax
236
 
237
	add eax,ebx
238
	mov [eax], byte 0		;null string
239
 
240
	invoke	mem.alloc,sec_i_len
241
	mov [sec_i],eax
242
 
243
	invoke	mem.alloc,dat_i_len
244
	mov [dat_i],eax
245
	mov [data_adr],eax
246
 
247
	mov eax,[filename]
248
	mov [fname],eax
249
 
250
	mov eax,70
251
	mov ebx , reads-ebp
252
	add ebx,ebp
253
	int 0x40
254
 
255
	stdcall readlnf
256
 
257
    xor eax,eax
258
	ret
259
 
260
 
261
endp
262
 
263
 
264
proc readlnf
265
 pushad
266
 mov [.pos],dword 0
267
.char:
268
 mov eax,[.pos]
269
 inc eax
270
 mov [.pos],eax
271
 
272
 sub eax,1
273
 add eax,[filei]
274
 mov al,[eax]				; символ от позиции
275
							; тип по первому символу
276
 cmp al,' '
277
 je .char
278
 cmp al,9
279
 je .char
280
 cmp al,13
281
 je .char
282
 cmp al,10
283
 je .char
284
 cmp al,'['
285
 je .sect
286
 cmp al,0
287
 je .exit
288
;------------------------------------------------------------------------------------------
289
	; чтение параметров
290
 mov eax,[data_adr]
291
 mov ebx,[.pos]
292
 add ebx,[filei]
293
 dec ebx
294
 mov cl,0xD
295
 call copy_s
296
 xchg ebx,eax
297
 mov eax,[.pos]
298
 add eax,ebx
299
 mov [.pos],eax
300
 
301
 
302
 mov ebx,[data_adr]
303
 mov ecx,[data_adr_last]
304
 mov [ebx+data_prev],ecx
305
 ;add ebx,data_next
306
 mov [ecx],ebx
307
 add ebx,data_next
308
 mov [data_adr_last],ebx
309
 
310
 add ebx,data_len-data_next
311
 mov [data_adr],ebx
312
 mov eax,[sect_num]
313
 imul eax,eax,block_len
314
 add eax,[sec_i]
315
 add eax, block_i_count
316
 mov ebx,[eax]
317
 inc ebx
318
 mov [eax],ebx
319
 jmp .test_next
320
;-----------------------------------------------------------------------------------------------------------------
321
.sect:						; чтение секции
322
 mov eax,[block_count]
323
 imul eax,eax,block_len
324
							; копируем имя (до ])
325
 add eax,[sec_i]
326
 add eax,block_name			; кужа ложить имя
327
 mov ebx,[.pos]
328
 add ebx,[filei]				; откуда
329
 mov cl,']'
330
 call copy_s				; ложим
331
 
332
 
333
 mov ebx,[.pos]
334
 add ebx,eax
335
 ;sub ebx,filei
336
 add ebx,1
337
 mov [.pos],ebx
338
 
339
 mov eax,[block_count]		; прибавить количество блоков
340
 mov [sect_num],eax
341
 mov ebx,eax
342
 imul eax,eax,block_len 	; это будит адрес пердыдущего для первого элемента
343
 add eax,[sec_i]
344
 mov [data_adr_last],eax
345
 inc ebx
346
 mov [block_count],ebx
347
 
348
 
349
.test_next:
350
 cmp [.pos] ,dword 97
351
 jb .char
352
 
353
.exit:
354
 
355
 popad
356
 ret
357
 
358
 .pos dd 0
359
 
360
endp
361
 
362
 
363
   text db 255 dup(?)
364
 
365
align 16
366
EXPORTS:
367
 
368
export	\
369
	lib_init   ,'lib_init',\
370
	ini.load   ,'ini.load',\
371
	ini.get_str,'ini.get_str',\
372
	ini.get_par,'ini.get_par'