Subversion Repositories Kolibri OS

Rev

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

Rev 3920 Rev 4422
1
;;================================================================================================;;
1
;;================================================================================================;;
2
;;//// libini.asm //// (c) mike.dld, 2006-2008 ///////////////////////////////////////////////////;;
2
;;//// libini.asm //// (c) mike.dld, 2006-2008 ///////////////////////////////////////////////////;;
3
;;================================================================================================;;
3
;;================================================================================================;;
4
;;                                                                                                ;;
4
;;                                                                                                ;;
5
;; This file is part of Common development libraries (Libs-Dev).                                  ;;
5
;; This file is part of Common development libraries (Libs-Dev).                                  ;;
6
;;                                                                                                ;;
6
;;                                                                                                ;;
7
;; Libs-Dev is free software: you can redistribute it and/or modify it under the terms of the GNU ;;
7
;; Libs-Dev is free software: you can redistribute it and/or modify it under the terms of the GNU ;;
8
;; Lesser General Public License as published by the Free Software Foundation, either version 2.1 ;;
8
;; Lesser General Public License as published by the Free Software Foundation, either version 2.1 ;;
9
;; of the License, or (at your option) any later version.                                         ;;
9
;; of the License, or (at your option) any later version.                                         ;;
10
;;                                                                                                ;;
10
;;                                                                                                ;;
11
;; Libs-Dev is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without  ;;
11
;; Libs-Dev is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without  ;;
12
;; even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU  ;;
12
;; even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU  ;;
13
;; Lesser General Public License for more details.                                                ;;
13
;; Lesser General Public License for more details.                                                ;;
14
;;                                                                                                ;;
14
;;                                                                                                ;;
15
;; You should have received a copy of the GNU Lesser General Public License along with Libs-Dev.  ;;
15
;; You should have received a copy of the GNU Lesser General Public License along with Libs-Dev.  ;;
16
;; If not, see .                                                    ;;
16
;; If not, see .                                                    ;;
17
;;                                                                                                ;;
17
;;                                                                                                ;;
18
;;================================================================================================;;
18
;;================================================================================================;;
19
;;                                                                                                ;;
19
;;                                                                                                ;;
20
;; 2009-03-08 (mike.dld)                                                                          ;;
20
;; 2009-03-08 (mike.dld)                                                                          ;;
21
;;   bug-fixes:                                                                                   ;;
21
;;   bug-fixes:                                                                                   ;;
22
;;     - moved buffer bound check in libini._.low.read_value up (reported by Insolor)             ;;
22
;;     - moved buffer bound check in libini._.low.read_value up (reported by Insolor)             ;;
23
;;   new features:                                                                                ;;
23
;;   new features:                                                                                ;;
24
;;     - comments support (char is ini.COMMENT_CHAR, defaults to ';')                             ;;
24
;;     - comments support (char is ini.COMMENT_CHAR, defaults to ';')                             ;;
25
;;       inline comments are not supported                                                        ;;
25
;;       inline comments are not supported                                                        ;;
26
;; 2008-12-29 (mike.dld)                                                                          ;;
26
;; 2008-12-29 (mike.dld)                                                                          ;;
27
;;   bug-fixes:                                                                                   ;;
27
;;   bug-fixes:                                                                                   ;;
28
;;     - unnecessary 'stosb' in ini.get_str was causing problems                                  ;;
28
;;     - unnecessary 'stosb' in ini.get_str was causing problems                                  ;;
29
;;   new features:                                                                                ;;
29
;;   new features:                                                                                ;;
30
;;     - new functions: ini.get_color and ini.set_color                                           ;;
30
;;     - new functions: ini.get_color and ini.set_color                                           ;;
31
;; 2008-08-06 (mike.dld)                                                                          ;;
31
;; 2008-08-06 (mike.dld)                                                                          ;;
32
;;   changes:                                                                                     ;;
32
;;   changes:                                                                                     ;;
33
;;     - split private procs into libini_p.asm, added comments                                    ;;
33
;;     - split private procs into libini_p.asm, added comments                                    ;;
34
;; 2008-02-07 (mike.dld)                                                                          ;;
34
;; 2008-02-07 (mike.dld)                                                                          ;;
35
;;   changes:                                                                                     ;;
35
;;   changes:                                                                                     ;;
36
;;     - renamed all *.aux.* to *._.* to match overall libraries design                           ;;
36
;;     - renamed all *.aux.* to *._.* to match overall libraries design                           ;;
37
;; 2007-09-26 (mike.dld)                                                                          ;;
37
;; 2007-09-26 (mike.dld)                                                                          ;;
38
;;   bug-fixes:                                                                                   ;;
38
;;   bug-fixes:                                                                                   ;;
39
;;     - value was not correctly trimmed (reported by diamond)                                    ;;
39
;;     - value was not correctly trimmed (reported by diamond)                                    ;;
40
;; 2007-08-01 (mike.dld)                                                                          ;;
40
;; 2007-08-01 (mike.dld)                                                                          ;;
41
;;   bug-fixes:                                                                                   ;;
41
;;   bug-fixes:                                                                                   ;;
42
;;     - serious defect in ini.set_str causing displaced write operations                         ;;
42
;;     - serious defect in ini.set_str causing displaced write operations                         ;;
43
;;       (reported by diamond)                                                                    ;;
43
;;       (reported by diamond)                                                                    ;;
44
;;     - another serious defect in ini.enum_keys introduced with refactoring                      ;;
44
;;     - another serious defect in ini.enum_keys introduced with refactoring                      ;;
45
;;   changes:                                                                                     ;;
45
;;   changes:                                                                                     ;;
46
;;     - callback for enum_keys now takes additional parameter - key value                        ;;
46
;;     - callback for enum_keys now takes additional parameter - key value                        ;;
47
;;     - handling trailing spaces in section/key/value                                            ;;
47
;;     - handling trailing spaces in section/key/value                                            ;;
48
;; 2007-05-19 (mike.dld)                                                                          ;;
48
;; 2007-05-19 (mike.dld)                                                                          ;;
49
;;   bug-fixes:                                                                                   ;;
49
;;   bug-fixes:                                                                                   ;;
50
;;     - last char still wasn't read correctly                                                    ;;
50
;;     - last char still wasn't read correctly                                                    ;;
51
;;     - digits of number were reversed when using ini.set_int                                    ;;
51
;;     - digits of number were reversed when using ini.set_int                                    ;;
52
;;     - now using 'ini.aux.unget_char' instead of dangerous 'dec esi'                            ;;
52
;;     - now using 'ini.aux.unget_char' instead of dangerous 'dec esi'                            ;;
53
;;   changes:                                                                                     ;;
53
;;   changes:                                                                                     ;;
54
;;     - all non-public functions now start with ini.aux.*                                        ;;
54
;;     - all non-public functions now start with ini.aux.*                                        ;;
55
;;     - added ini.enum_sections and ini.enum_keys                                                ;;
55
;;     - added ini.enum_sections and ini.enum_keys                                                ;;
56
;;     - removed ini.query_sec (use ini.enum_* instead)                                           ;;
56
;;     - removed ini.query_sec (use ini.enum_* instead)                                           ;;
57
;;                                                                                                ;;
57
;;                                                                                                ;;
58
;;================================================================================================;;
58
;;================================================================================================;;
59
 
59
 
60
format MS COFF
60
format MS COFF
61
 
61
 
62
public @EXPORT as 'EXPORTS'
62
public @EXPORT as 'EXPORTS'
63
 
63
 
64
include '../../../../proc32.inc'
64
include '../../../../proc32.inc'
65
include '../../../../macros.inc'
65
include '../../../../macros.inc'
66
include '../libio/libio.inc'
66
include '../libio/libio.inc'
67
purge section,mov,add,sub
67
purge section,mov,add,sub
68
 
68
 
69
include 'libini_p.inc'
69
include 'libini_p.inc'
70
 
70
 
71
section '.flat' code readable align 16
71
section '.flat' code readable align 16
72
 
72
 
73
include 'libini_p.asm'
73
include 'libini_p.asm'
74
 
74
 
75
;;================================================================================================;;
75
;;================================================================================================;;
76
proc ini.enum_sections _f_name, _callback ;///////////////////////////////////////////////////////;;
76
proc ini.enum_sections _f_name, _callback ;///////////////////////////////////////////////////////;;
77
;;------------------------------------------------------------------------------------------------;;
77
;;------------------------------------------------------------------------------------------------;;
78
;? Enumerate sections, calling callback function for each of them                                 ;;
-
 
79
;;------------------------------------------------------------------------------------------------;;
78
;? Enumerate sections, calling c2------------------------------------------------------------------;;
80
;> _f_name = ini filename                                                                 ;;
79
;> _f_name = ini filename                                                                 ;;
81
;> _callback = callback function address: func(f_name, sec_name), where                           ;;
80
;> _callback = callback function address: func(f_name, sec_name), where                           ;;
82
;>   f_name = ini filename (as passed to the function)                                    ;;
81
;>   f_name = ini filename (as passed to the function)                                    ;;
83
;>   sec_name = section name found                                                        ;;
82
;>   sec_name = section name found                                                        ;;
84
;;------------------------------------------------------------------------------------------------;;
83
;;------------------------------------------------------------------------------------------------;;
85
;< eax = -1 (error) / 0                                                                           ;;
84
;< eax = -1 (error) / 0                                                                           ;;
86
;;================================================================================================;;
85
;;================================================================================================;;
87
locals
86
locals
88
  f       IniFile
87
  f	  IniFile
89
  f_addr  dd ?
88
  f_addr  dd ?
90
  sec_buf dd ?
89
  sec_buf dd ?
91
endl
90
endl
92
 
91
 
93
        push    ebx esi edi
92
	push	ebx esi edi
94
 
93
 
95
        cld
94
	cld
96
 
95
 
97
        invoke  mem.alloc, ini.MAX_NAME_LEN
96
	invoke	mem.alloc, ini.MAX_NAME_LEN
98
        or      eax, eax
97
	or	eax, eax
99
        jz      .exit_error.2
98
	jz	.exit_error.2
100
        mov     [sec_buf], eax
99
	mov	[sec_buf], eax
101
 
100
 
102
        xor     eax, eax
101
	xor	eax, eax
103
        mov     [f.fh], eax
102
	mov	[f.fh], eax
104
        mov     [f.buf], eax
103
	mov	[f.buf], eax
105
        invoke  file.open, [_f_name], O_READ
104
	invoke	file.open, [_f_name], O_READ
106
        cmp     eax, 32
105
	cmp	eax, 32
107
        jb      .exit_file_error
106
	jb	.exit_file_error
108
        mov     [f.fh], eax
107
	mov	[f.fh], eax
109
        invoke  mem.alloc, ini.MEM_SIZE
108
	invoke	mem.alloc, ini.MEM_SIZE
110
        or      eax, eax
109
	or	eax, eax
111
        jz      .exit_error
110
	jz	.exit_error
112
        mov     [f.buf], eax
111
	mov	[f.buf], eax
113
        lea     ebx, [f]
112
	lea	ebx, [f]
114
        mov     [f_addr], ebx
113
	mov	[f_addr], ebx
115
 
114
 
116
        invoke  file.seek, [f.fh], 0, SEEK_SET
115
	invoke	file.seek, [f.fh], 0, SEEK_SET
117
        stdcall libini._.preload_block, [f_addr]
116
	stdcall libini._.preload_block, [f_addr]
118
 
117
 
119
  .next_section:
118
  .next_section:
120
        stdcall libini._.find_next_section, [f_addr]
119
	stdcall libini._.find_next_section, [f_addr]
121
        or      eax, eax
120
	or	eax, eax
122
        jnz     .exit_error
121
	jnz	.exit_error
123
 
122
 
124
        stdcall libini._.get_char, [f_addr]
123
	stdcall libini._.get_char, [f_addr]
125
        stdcall libini._.skip_spaces, [f_addr]
124
	stdcall libini._.skip_spaces, [f_addr]
126
        mov     edi, [sec_buf]
125
	mov	edi, [sec_buf]
127
    @@: stdcall libini._.get_char, [f_addr]
126
    @@: stdcall libini._.get_char, [f_addr]
128
        cmp     al, ']'
127
	cmp	al, ']'
129
        je      @f
128
	je	@f
130
        or      al, al
129
	or	al, al
131
        jz      .exit_ok
130
	jz	.exit_ok
132
        cmp     al, 13
131
	cmp	al, 13
133
        je      .next_section
132
	je	.next_section
134
        cmp     al, 10
133
	cmp	al, 10
135
        je      .next_section
134
	je	.next_section
136
        stosb
135
	stosb
137
        jmp     @b
136
	jmp	@b
138
    @@: xor     al, al
137
    @@: xor	al, al
139
        stosb
138
	stosb
140
        add     edi, -2
139
	add	edi, -2
141
    @@: cmp     byte[edi], 32
140
    @@: cmp	byte[edi], 32
142
        ja      @f
141
	ja	@f
143
        mov     byte[edi], 0
142
	mov	byte[edi], 0
144
        dec     edi
143
	dec	edi
145
        jmp     @b
144
	jmp	@b
146
    @@:
145
    @@:
147
        pushad
146
	pushad
148
        mov     eax, [f_addr]
147
	mov	eax, [f_addr]
149
        stdcall [_callback], [_f_name], [sec_buf]
148
	stdcall [_callback], [_f_name], [sec_buf]
150
        or      eax, eax
149
	or	eax, eax
151
        popad
150
	popad
152
        jnz     .next_section
151
	jnz	.next_section
153
 
152
 
154
  .exit_ok:
153
  .exit_ok:
155
        invoke  file.close, [f.fh]
154
	invoke	file.close, [f.fh]
156
        invoke  mem.free, [f.buf]
155
	invoke	mem.free, [f.buf]
157
        invoke  mem.free, [sec_buf]
156
	invoke	mem.free, [sec_buf]
158
        xor     eax, eax
157
	xor	eax, eax
159
        pop     edi esi ebx
158
	pop	edi esi ebx
160
        ret
159
	ret
161
 
160
 
162
  .exit_error:
161
  .exit_error:
163
        invoke  file.close, [f.fh]
162
	invoke	file.close, [f.fh]
164
        invoke  mem.free, [f.buf]
163
	invoke	mem.free, [f.buf]
165
  .exit_file_error:
164
  .exit_file_error:
166
        invoke  mem.free, [sec_buf]
165
	invoke	mem.free, [sec_buf]
167
  .exit_error.2:
166
  .exit_error.2:
168
        or      eax, -1
167
	or	eax, -1
169
        pop     edi esi ebx
168
	pop	edi esi ebx
170
        ret
169
	ret
171
endp
170
endp
172
 
171
 
173
;;================================================================================================;;
172
;;================================================================================================;;
174
proc ini.enum_keys _f_name, _sec_name, _callback ;////////////////////////////////////////////////;;
173
proc ini.enum_keys _f_name, _sec_name, _callback ;////////////////////////////////////////////////;;
175
;;------------------------------------------------------------------------------------------------;;
174
;;------------------------------------------------------------------------------------------------;;
176
;? Enumerate keys within a section, calling callback function for each of them                    ;;
175
;? Enumerate keys within a section, calling callback function for each of them                    ;;
177
;;------------------------------------------------------------------------------------------------;;
176
;;------------------------------------------------------------------------------------------------;;
178
;> _f_name = ini filename                                                                 ;;
177
;> _f_name = ini filename                                                                 ;;
179
;> _sec_name = section name                                                               ;;
178
;> _sec_name = section name                                                               ;;
180
;> _callback = callback function address: func(f_name, sec_name, key_name, key_value), where      ;;
179
;> _callback = callback function address: func(f_name, sec_name, key_name, key_value), where      ;;
181
;>   f_name = ini filename (as passed to the function)                                    ;;
180
;>   f_name = ini filename (as passed to the function)                                    ;;
182
;>   sec_name = section name (as passed to the function)                                  ;;
181
;>   sec_name = section name (as passed to the function)                                  ;;
183
;>   key_name = key name found                                                            ;;
182
;>   key_name = key name found                                                            ;;
184
;>   key_value = value of key found                                                       ;;
183
;>   key_value = value of key found                                                       ;;
185
;;------------------------------------------------------------------------------------------------;;
184
;;------------------------------------------------------------------------------------------------;;
186
;< eax = -1 (error) / 0                                                                           ;;
185
;< eax = -1 (error) / 0                                                                           ;;
187
;;================================================================================================;;
186
;;================================================================================================;;
188
locals
187
locals
189
  f       IniFile
188
  f	  IniFile
190
  f_addr  dd ?
189
  f_addr  dd ?
191
  key_buf dd ?
190
  key_buf dd ?
192
  val_buf dd ?
191
  val_buf dd ?
193
endl
192
endl
194
 
193
 
195
        push    ebx esi edi
194
	push	ebx esi edi
196
 
195
 
197
        cld
196
	cld
198
 
197
 
199
        invoke  mem.alloc, ini.MAX_NAME_LEN
198
	invoke	mem.alloc, ini.MAX_NAME_LEN
200
        or      eax, eax
199
	or	eax, eax
201
        jz      .exit_error.3
200
	jz	.exit_error.3
202
        mov     [key_buf], eax
201
	mov	[key_buf], eax
203
        invoke  mem.alloc, ini.MAX_VALUE_LEN
202
	invoke	mem.alloc, ini.MAX_VALUE_LEN
204
        or      eax, eax
203
	or	eax, eax
205
        jz      .exit_error.2
204
	jz	.exit_error.2
206
        mov     [val_buf], eax
205
	mov	[val_buf], eax
207
 
206
 
208
        xor     eax, eax
207
	xor	eax, eax
209
        mov     [f.fh], eax
208
	mov	[f.fh], eax
210
        mov     [f.buf], eax
209
	mov	[f.buf], eax
211
        invoke  file.open, [_f_name], O_READ
210
	invoke	file.open, [_f_name], O_READ
212
        cmp     eax, 32
211
	cmp	eax, 32
213
        jb      .exit_file_error
212
	jb	.exit_file_error
214
        mov     [f.fh], eax
213
	mov	[f.fh], eax
215
        invoke  mem.alloc, ini.MEM_SIZE
214
	invoke	mem.alloc, ini.MEM_SIZE
216
        or      eax, eax
215
	or	eax, eax
217
        jz      .exit_error
216
	jz	.exit_error
218
        mov     [f.buf], eax
217
	mov	[f.buf], eax
219
        lea     ebx, [f]
218
	lea	ebx, [f]
220
        mov     [f_addr], ebx
219
	mov	[f_addr], ebx
221
        stdcall libini._.find_section, ebx, [_sec_name]
220
	stdcall libini._.find_section, ebx, [_sec_name]
222
        or      eax, eax
221
	or	eax, eax
223
        jnz     .exit_error
222
	jnz	.exit_error
224
 
223
 
225
  .next_key:
224
  .next_key:
226
        stdcall libini._.skip_line, [f_addr]
225
	stdcall libini._.skip_line, [f_addr]
227
        stdcall libini._.skip_nonblanks, [f_addr]
226
	stdcall libini._.skip_nonblanks, [f_addr]
228
        or      al, al
227
	or	al, al
229
        jz      .exit_error
228
	jz	.exit_error
230
        cmp     al, '['
229
	cmp	al, '['
231
        je      .exit_error
230
	je	.exit_error
232
        mov     edi, [key_buf]
231
	mov	edi, [key_buf]
233
    @@: stdcall libini._.get_char, [f_addr]
232
    @@: stdcall libini._.get_char, [f_addr]
234
        or      al, al
233
	or	al, al
235
        jz      .exit_error
234
	jz	.exit_error
236
        cmp     al, '='
235
	cmp	al, '='
237
        je      @f
236
	je	@f
238
        stosb
237
	stosb
239
        jmp     @b
238
	jmp	@b
240
    @@:
239
    @@:
241
        xor     al, al
240
	xor	al, al
242
        stosb
241
	stosb
243
        add     edi, -2
242
	add	edi, -2
244
    @@: cmp     byte[edi], 32
243
    @@: cmp	byte[edi], 32
245
        ja      @f
244
	ja	@f
246
        mov     byte[edi], 0
245
	mov	byte[edi], 0
247
        dec     edi
246
	dec	edi
248
        jmp     @b
247
	jmp	@b
249
    @@: stdcall libini._.low.read_value, [f_addr], [val_buf], ini.MAX_VALUE_LEN
248
    @@: stdcall libini._.low.read_value, [f_addr], [val_buf], ini.MAX_VALUE_LEN
250
        pushad
249
	pushad
251
        stdcall [_callback], [_f_name], [_sec_name], [key_buf], [val_buf]
250
	stdcall [_callback], [_f_name], [_sec_name], [key_buf], [val_buf]
252
        or      eax, eax
251
	or	eax, eax
253
        popad
252
	popad
254
        jnz     .next_key
253
	jnz	.next_key
255
 
254
 
256
    @@: invoke  file.close, [f.fh]
255
    @@: invoke	file.close, [f.fh]
257
        invoke  mem.free, [f.buf]
256
	invoke	mem.free, [f.buf]
258
        xor     eax, eax
257
	xor	eax, eax
259
        stosb
258
	stosb
260
        pop     edi esi ebx
259
	pop	edi esi ebx
261
        ret
260
	ret
262
 
261
 
263
  .exit_error:
262
  .exit_error:
264
        invoke  file.close, [f.fh]
263
	invoke	file.close, [f.fh]
265
        invoke  mem.free, [f.buf]
264
	invoke	mem.free, [f.buf]
266
  .exit_file_error:
265
  .exit_file_error:
267
        invoke  mem.free, [val_buf]
266
	invoke	mem.free, [val_buf]
268
  .exit_error.2:
267
  .exit_error.2:
269
        invoke  mem.free, [key_buf]
268
	invoke	mem.free, [key_buf]
270
  .exit_error.3:
269
  .exit_error.3:
271
        or      eax, -1
270
	or	eax, -1
272
        pop     edi esi ebx
271
	pop	edi esi ebx
273
        ret
272
	ret
274
endp
273
endp
275
 
274
 
276
;;================================================================================================;;
275
;;================================================================================================;;
277
proc ini.get_str _f_name, _sec_name, _key_name, _buffer, _buf_len, _def_val ;/////////////////////;;
276
proc ini.get_str _f_name, _sec_name, _key_name, _buffer, _buf_len, _def_val ;/////////////////////;;
278
;;------------------------------------------------------------------------------------------------;;
277
;;------------------------------------------------------------------------------------------------;;
279
;? Read string                                                                                    ;;
278
;? Read string                                                                                    ;;
280
;;------------------------------------------------------------------------------------------------;;
279
;;------------------------------------------------------------------------------------------------;;
281
;> _f_name = ini filename                                                                 ;;
280
;> _f_name = ini filename                                                                 ;;
282
;> _sec_name = section name                                                               ;;
281
;> _sec_name = section name                                                               ;;
283
;> _key_name = key name                                                                   ;;
282
;> _key_name = key name                                                                   ;;
284
;> _buffer = destination buffer address                                                    ;;
283
;> _buffer = destination buffer address                                                    ;;
285
;> _buf_len = buffer size (maximum bytes to read)                                          ;;
284
;> _buf_len = buffer size (maximum bytes to read)                                          ;;
286
;> _def_val = default value to return if no key, section or file found                    ;;
285
;> _def_val = default value to return if no key, section or file found                    ;;
287
;;------------------------------------------------------------------------------------------------;;
286
;;------------------------------------------------------------------------------------------------;;
288
;< eax = -1 (error) / 0                                                                           ;;
287
;< eax = -1 (error) / 0                                                                           ;;
289
;< [_buffer] = [_def_val] (error) / found key value                                       ;;
288
;< [_buffer] = [_def_val] (error) / found key value                                       ;;
290
;;================================================================================================;;
289
;;================================================================================================;;
291
locals
290
locals
292
  f      IniFile
291
  f	 IniFile
293
  f_addr dd ?
292
  f_addr dd ?
294
endl
293
endl
295
 
294
 
296
        push    ebx esi edi
295
	push	ebx esi edi
297
 
296
 
298
        xor     eax, eax
297
	xor	eax, eax
299
        mov     [f.fh], eax
298
	mov	[f.fh], eax
300
        mov     [f.buf], eax
299
	mov	[f.buf], eax
301
        invoke  file.open, [_f_name], O_READ
300
	invoke	file.open, [_f_name], O_READ
302
        cmp     eax, 32
301
	cmp	eax, 32
303
        jb      .exit_file_error
302
	jb	.exit_file_error
304
        mov     [f.fh], eax
303
	mov	[f.fh], eax
305
        invoke  mem.alloc, ini.MEM_SIZE
304
	invoke	mem.alloc, ini.MEM_SIZE
306
        or      eax, eax
305
	or	eax, eax
307
        jz      .exit_error
306
	jz	.exit_error
308
        mov     [f.buf], eax
307
	mov	[f.buf], eax
309
        lea     ebx, [f]
308
	lea	ebx, [f]
310
        mov     [f_addr], ebx
309
	mov	[f_addr], ebx
311
        stdcall libini._.find_section, ebx, [_sec_name]
310
	stdcall libini._.find_section, ebx, [_sec_name]
312
        or      eax, eax
311
	or	eax, eax
313
        jnz     .exit_error
312
	jnz	.exit_error
314
 
313
 
315
        stdcall libini._.find_key, ebx, [_key_name]
314
	stdcall libini._.find_key, ebx, [_key_name]
316
        or      eax, eax
315
	or	eax, eax
317
        jnz     .exit_error
316
	jnz	.exit_error
318
 
317
 
319
        stdcall libini._.low.read_value, [f_addr], [_buffer], [_buf_len]
318
	stdcall libini._.low.read_value, [f_addr], [_buffer], [_buf_len]
320
    @@: invoke  file.close, [f.fh]
319
    @@: invoke	file.close, [f.fh]
321
        invoke  mem.free, [f.buf]
320
	invoke	mem.free, [f.buf]
322
        xor     eax, eax
321
	xor	eax, eax
323
        pop     edi esi ebx
322
	pop	edi esi ebx
324
        ret
323
	ret
325
 
324
 
326
  .exit_error:
325
  .exit_error:
327
        invoke  file.close, [f.fh]
326
	invoke	file.close, [f.fh]
328
        invoke  mem.free, [f.buf]
327
	invoke	mem.free, [f.buf]
329
  .exit_file_error:
328
  .exit_file_error:
330
        mov     edi, [_buffer]
329
	mov	edi, [_buffer]
331
        mov     esi, [_def_val]
330
	mov	esi, [_def_val]
332
        xor     al, al
331
	xor	al, al
333
        or      esi, esi
332
	or	esi, esi
334
        jz      .exit_error.2
333
	jz	.exit_error.2
335
    @@: lodsb
334
    @@: lodsb
336
  .exit_error.2:
335
  .exit_error.2:
337
        stosb
336
	stosb
338
        or      al, al
337
	or	al, al
339
        jnz     @b
338
	jnz	@b
340
        or      eax, -1
339
	or	eax, -1
341
        pop     edi esi ebx
340
	pop	edi esi ebx
342
        ret
341
	ret
343
endp
342
endp
344
 
343
 
345
;;================================================================================================;;
344
;;================================================================================================;;
346
proc ini.set_str _f_name, _sec_name, _key_name, _buffer, _buf_len ;///////////////////////////////;;
345
proc ini.set_str _f_name, _sec_name, _key_name, _buffer, _buf_len ;///////////////////////////////;;
347
;;------------------------------------------------------------------------------------------------;;
346
;;------------------------------------------------------------------------------------------------;;
348
;? Write string                                                                                   ;;
347
;? Write string                                                                                   ;;
349
;;------------------------------------------------------------------------------------------------;;
348
;;------------------------------------------------------------------------------------------------;;
350
;> _f_name = ini filename                                                                 ;;
349
;> _f_name = ini filename                                                                 ;;
351
;> _sec_name = section name                                                               ;;
350
;> _sec_name = section name                                                               ;;
352
;> _key_name = key name                                                                   ;;
351
;> _key_name = key name                                                                   ;;
353
;> _buffer = source buffer address                                                         ;;
352
;> _buffer = source buffer address                                                         ;;
354
;> _buf_len = buffer size (bytes to write)                                                 ;;
353
;> _buf_len = buffer size (bytes to write)                                                 ;;
355
;;------------------------------------------------------------------------------------------------;;
354
;;------------------------------------------------------------------------------------------------;;
356
;< eax = -1 (error) / 0                                                                           ;;
355
;< eax = -1 (error) / 0                                                                           ;;
357
;;================================================================================================;;
356
;;================================================================================================;;
358
locals
357
locals
359
  f      IniFile
358
  f	 IniFile
360
  f_addr dd ?
359
  f_addr dd ?
361
endl
360
endl
362
 
361
 
363
        push    ebx esi edi
362
	push	ebx esi edi
364
 
363
 
365
        xor     eax, eax
364
	xor	eax, eax
366
        mov     [f.fh], eax
365
	mov	[f.fh], eax
367
        mov     [f.buf], eax
366
	mov	[f.buf], eax
368
        invoke  file.open, [_f_name], O_READ + O_WRITE + O_CREATE
367
	invoke	file.open, [_f_name], O_READ + O_WRITE + O_CREATE
369
        cmp     eax, 32
368
	cmp	eax, 32
370
        jb      .exit_file_error
369
	jb	.exit_file_error
371
        mov     [f.fh], eax
370
	mov	[f.fh], eax
372
        invoke  mem.alloc, ini.MEM_SIZE
371
	invoke	mem.alloc, ini.MEM_SIZE
373
        or      eax, eax
372
	or	eax, eax
374
        jz      .exit_error
373
	jz	.exit_error
375
        mov     [f.buf], eax
374
	mov	[f.buf], eax
376
        lea     ebx, [f]
375
	lea	ebx, [f]
377
        mov     [f_addr], ebx
376
	mov	[f_addr], ebx
-
 
377
 
-
 
378
						;/GerdtR - bugfix: at end of file required empty line
-
 
379
	invoke	file.seek, [f.fh],2,SEEK_END
-
 
380
	invoke	file.read, [f.fh],[f.buf],2
-
 
381
	mov	edx,[f.buf]
-
 
382
	cmp	word[edx],0A0Dh
-
 
383
	je	@f
-
 
384
	mov	word[edx],0A0Dh
-
 
385
	invoke	file.seek, [f.fh],0,SEEK_END
-
 
386
	invoke	file.write, [f.fh],[f.buf],2
-
 
387
    @@:
-
 
388
 
-
 
389
;        lea    ebx, [f]
-
 
390
						;\GerdtR
378
 
391
 
379
        stdcall libini._.find_section, ebx, [_sec_name]
392
	stdcall libini._.find_section, ebx, [_sec_name]
380
        or      eax, eax
393
	or	eax, eax
381
        jnz     .create_section
394
	jnz	.create_section
382
 
395
 
383
        stdcall libini._.find_key, ebx, [_key_name]
396
	stdcall libini._.find_key, ebx, [_key_name]
384
        or      eax, eax
397
	or	eax, eax
385
        jnz     .create_key
398
	jnz	.create_key
386
 
399
 
387
  .modify_key:
400
  .modify_key:
388
        stdcall libini._.get_value_length, [f_addr]
401
	stdcall libini._.get_value_length, [f_addr]
389
        sub     eax, [_buf_len]
402
	sub	eax, [_buf_len]
390
        stdcall libini._.shift_content, [f_addr], eax
403
	stdcall libini._.shift_content, [f_addr], eax
391
 
404
 
392
  .modify_key.ex:
405
  .modify_key.ex:
393
        invoke  file.tell, [f.fh]
406
	invoke	file.tell, [f.fh]
394
        sub     eax, [f.cnt]
407
	sub	eax, [f.cnt]
395
        invoke  file.seek, [f.fh], eax, SEEK_SET
408
	invoke	file.seek, [f.fh], eax, SEEK_SET
396
        invoke  file.write, [f.fh], [_buffer], [_buf_len]
409
	invoke	file.write, [f.fh], [_buffer], [_buf_len]
397
 
410
 
398
        invoke  file.close, [f.fh]
411
	invoke	file.close, [f.fh]
399
        pop     edi esi ebx
412
	pop	edi esi ebx
400
        mcall   68,13,[f.buf]
413
	mcall	68,13,[f.buf]
401
        xor     eax, eax
414
	xor	eax, eax
402
        ret
415
	ret
403
 
416
 
404
  .create_key:
417
  .create_key:
405
        mov     edi, [f.buf]
418
	mov	edi, [f.buf]
406
        add     edi, ini.BLOCK_SIZE
419
	add	edi, ini.BLOCK_SIZE
407
        push    edi
420
	push	edi
408
 
421
 
409
  .create_key.ex:
422
  .create_key.ex:
410
        mov     esi, [_key_name]
423
	mov	esi, [_key_name]
411
        call    libini._.string_copy
424
	call	libini._.string_copy
412
        mov     byte[edi], '='
425
	mov	byte[edi], '='
413
        inc     edi
426
	inc	edi
414
        mov     esi, [_buffer]
427
	mov	esi, [_buffer]
415
        mov     ecx, [_buf_len]
428
	mov	ecx, [_buf_len]
416
        rep     movsb
429
	rep	movsb
417
        mov     word[edi], 0x0A0D
430
	mov	word[edi], 0x0A0D
418
        add     edi, 2
431
	add	edi, 2
419
        mov     eax, edi
432
	mov	eax, edi
420
 
433
 
421
        pop     edi
434
	pop	edi
422
        sub     eax, edi
435
	sub	eax, edi
423
        mov     [_buffer], edi
436
	mov	[_buffer], edi
424
        mov     [_buf_len], eax
437
	mov	[_buf_len], eax
425
        neg     eax
438
	neg	eax
426
        stdcall libini._.shift_content, [f_addr], eax
439
	stdcall libini._.shift_content, [f_addr], eax
427
 
440
 
428
        jmp     .modify_key.ex
441
	jmp	.modify_key.ex
429
 
442
 
430
  .create_section:
443
  .create_section:
431
        mov     edi, [f.buf]
444
	mov	edi, [f.buf]
432
        add     edi, ini.BLOCK_SIZE
445
	add	edi, ini.BLOCK_SIZE
433
        push    edi
446
	push	edi
434
 
447
 
435
        mov     esi, [_sec_name]
448
	mov	esi, [_sec_name]
-
 
449
 
436
        mov     byte[edi], '['
450
	mov	byte[edi], '['
437
        inc     edi
451
	inc	edi
438
        call    libini._.string_copy
452
	call	libini._.string_copy
439
        mov     dword[edi], ']' + (0x0A0D shl 8)
453
	mov	dword[edi], ']' + (0x0A0D shl 8)
440
        add     edi, 3
454
	add	edi, 3
441
 
455
 
442
        jmp     .create_key.ex
456
	jmp	.create_key.ex
443
 
457
 
444
  .exit_error:
458
  .exit_error:
445
        invoke  file.close, [f.fh]
459
	invoke	file.close, [f.fh]
446
  .exit_file_error:
460
  .exit_file_error:
447
        pop     edi esi ebx
461
	pop	edi esi ebx
448
        or      eax, -1
462
	or	eax, -1
449
        ret
463
	ret
450
endp
464
endp
451
 
465
 
452
;;================================================================================================;;
466
;;================================================================================================;;
453
proc ini.get_int _f_name, _sec_name, _key_name, _def_val ;////////////////////////////////////////;;
467
proc ini.get_int _f_name, _sec_name, _key_name, _def_val ;////////////////////////////////////////;;
454
;;------------------------------------------------------------------------------------------------;;
468
;;------------------------------------------------------------------------------------------------;;
455
;? Read integer                                                                                   ;;
469
;? Read integer                                                                                   ;;
456
;;------------------------------------------------------------------------------------------------;;
470
;;------------------------------------------------------------------------------------------------;;
457
;> _f_name = ini filename                                                                 ;;
471
;> _f_name = ini filename                                                                 ;;
458
;> _sec_name = section name                                                               ;;
472
;> _sec_name = section name                                                               ;;
459
;> _key_name = key name                                                                   ;;
473
;> _key_name = key name                                                                   ;;
460
;> _def_val = default value to return if no key, section or file found                     ;;
474
;> _def_val = default value to return if no key, section or file found                     ;;
461
;;------------------------------------------------------------------------------------------------;;
475
;;------------------------------------------------------------------------------------------------;;
462
;< eax = [_def_val] (error) / found key value                                              ;;
476
;< eax = [_def_val] (error) / found key value                                              ;;
463
;;================================================================================================;;
477
;;================================================================================================;;
464
locals
478
locals
465
  f      IniFile
479
  f	 IniFile
466
  f_addr dd ?
480
  f_addr dd ?
467
endl
481
endl
468
 
482
 
469
        push    edx ebx esi edi
483
	push	edx ebx esi edi
470
 
484
 
471
        xor     eax, eax
485
	xor	eax, eax
472
        mov     [f.fh], eax
486
	mov	[f.fh], eax
473
        mov     [f.buf], eax
487
	mov	[f.buf], eax
474
        invoke  file.open, [_f_name], O_READ
488
	invoke	file.open, [_f_name], O_READ
475
        cmp     eax, 32
489
	cmp	eax, 32
476
        jb      .exit_file_error
490
	jb	.exit_file_error
477
        mov     [f.fh], eax
491
	mov	[f.fh], eax
478
        invoke  mem.alloc, ini.MEM_SIZE
492
	invoke	mem.alloc, ini.MEM_SIZE
479
        or      eax, eax
493
	or	eax, eax
480
        jz      .exit_error
494
	jz	.exit_error
481
        mov     [f.buf], eax
495
	mov	[f.buf], eax
482
        lea     ebx, [f]
496
	lea	ebx, [f]
483
        mov     [f_addr], ebx
497
	mov	[f_addr], ebx
484
        stdcall libini._.find_section, ebx, [_sec_name]
498
	stdcall libini._.find_section, ebx, [_sec_name]
485
        or      eax, eax
499
	or	eax, eax
486
        jnz     .exit_error
500
	jnz	.exit_error
487
 
501
 
488
        stdcall libini._.find_key, ebx, [_key_name]
502
	stdcall libini._.find_key, ebx, [_key_name]
489
        or      eax, eax
503
	or	eax, eax
490
        jnz     .exit_error
504
	jnz	.exit_error
491
 
505
 
492
        stdcall libini._.skip_spaces, [f_addr]
506
	stdcall libini._.skip_spaces, [f_addr]
493
        xor     eax, eax
507
	xor	eax, eax
494
        xor     ebx, ebx
508
	xor	ebx, ebx
495
        xor     edx, edx
509
	xor	edx, edx
496
        stdcall libini._.get_char, [f_addr]
510
	stdcall libini._.get_char, [f_addr]
497
        cmp     al, '-'
511
	cmp	al, '-'
498
        jne     .lp1
512
	jne	.lp1
499
        inc     bh
513
	inc	bh
500
    @@: stdcall libini._.get_char, [f_addr]
514
    @@: stdcall libini._.get_char, [f_addr]
501
  .lp1: cmp     al, '0'
515
  .lp1: cmp	al, '0'
502
        jb      @f
516
	jb	@f
503
        cmp     al, '9'
517
	cmp	al, '9'
504
        ja      @f
518
	ja	@f
505
        inc     bl
519
	inc	bl
506
        add     eax, -'0'
520
	add	eax, -'0'
507
        imul    edx, 10
521
	imul	edx, 10
508
        add     edx, eax
522
	add	edx, eax
509
        jmp     @b
523
	jmp	@b
510
    @@:
524
    @@:
511
        or      bl, bl
525
	or	bl, bl
512
        jz      .exit_error
526
	jz	.exit_error
513
        or      bh, bh
527
	or	bh, bh
514
        jz      @f
528
	jz	@f
515
        neg     edx
529
	neg	edx
516
    @@: invoke  file.close, [f.fh]
530
    @@: invoke	file.close, [f.fh]
517
        invoke  mem.free, [f.buf]
531
	invoke	mem.free, [f.buf]
518
        mov     eax, edx
532
	mov	eax, edx
519
        pop     edi esi ebx edx
533
	pop	edi esi ebx edx
520
        ret
534
	ret
521
 
535
 
522
  .exit_error:
536
  .exit_error:
523
        invoke  file.close, [f.fh]
537
	invoke	file.close, [f.fh]
524
  .exit_file_error:
538
  .exit_file_error:
525
        invoke  mem.free, [f.buf]
539
	invoke	mem.free, [f.buf]
526
        mov     eax, [_def_val]
540
	mov	eax, [_def_val]
527
        pop     edi esi ebx edx
541
	pop	edi esi ebx edx
528
        ret
542
	ret
529
endp
543
endp
530
 
544
 
531
;;================================================================================================;;
545
;;================================================================================================;;
532
proc ini.set_int _f_name, _sec_name, _key_name, _val ;////////////////////////////////////////////;;
546
proc ini.set_int _f_name, _sec_name, _key_name, _val ;////////////////////////////////////////////;;
533
;;------------------------------------------------------------------------------------------------;;
547
;;------------------------------------------------------------------------------------------------;;
534
;? Write integer                                                                                  ;;
548
;? Write integer                                                                                  ;;
535
;;------------------------------------------------------------------------------------------------;;
549
;;------------------------------------------------------------------------------------------------;;
536
;> _f_name = ini filename                                                                 ;;
550
;> _f_name = ini filename                                                                 ;;
537
;> _sec_name = section name                                                               ;;
551
;> _sec_name = section name                                                               ;;
538
;> _key_name = key name                                                                   ;;
552
;> _key_name = key name                                                                   ;;
539
;> _val = value                                                                            ;;
553
;> _val = value                                                                            ;;
540
;;------------------------------------------------------------------------------------------------;;
554
;;------------------------------------------------------------------------------------------------;;
541
;< eax = -1 (error) / 0                                                                           ;;
555
;< eax = -1 (error) / 0                                                                           ;;
542
;;================================================================================================;;
556
;;================================================================================================;;
543
locals
557
locals
544
  buf rb 16
558
  buf rb 16
545
  bNeg rd 1
559
  bNeg rd 1
546
endl
560
endl
547
 
561
 
548
        push    ecx edx edi
562
	push	ecx edx edi
549
 
563
 
550
        lea     edi, [buf]
564
	lea	edi, [buf]
551
        add     edi, 15
565
	add	edi, 15
552
 
566
 
553
        mov     eax, [_val]
567
	mov	eax, [_val]
554
        mov     [bNeg],0
568
	mov	[bNeg],0
555
        or      eax, eax
569
	or	eax, eax
556
        jns     @f
570
	jns	@f
557
        mov     [bNeg],1
571
	mov	[bNeg],1
558
        neg     eax
572
	neg	eax
559
 
573
 
560
    @@: mov     ecx, 10
574
    @@: mov	ecx, 10
561
    @@: xor     edx, edx
575
    @@: xor	edx, edx
562
        idiv    ecx
576
	idiv	ecx
563
        add     dl, '0'
577
	add	dl, '0'
564
        mov     [edi], dl
578
	mov	[edi], dl
565
        dec     edi
579
	dec	edi
566
        or      eax, eax
580
	or	eax, eax
567
        jnz     @b
581
	jnz	@b
568
 
582
 
569
        cmp     [bNeg],0
583
	cmp	[bNeg],0
570
        je      @f
584
	je	@f
571
        mov     byte[edi], '-'
585
	mov	byte[edi], '-'
572
        dec     edi
586
	dec	edi
573
     @@:
587
     @@:
574
        lea     eax, [buf]
588
	lea	eax, [buf]
575
        add     eax, 15
589
	add	eax, 15
576
        sub     eax, edi
590
	sub	eax, edi
577
        inc     edi
591
	inc	edi
578
 
592
 
579
 
593
 
580
 
594
 
581
        stdcall ini.set_str, [_f_name], [_sec_name], [_key_name], edi, eax
595
	stdcall ini.set_str, [_f_name], [_sec_name], [_key_name], edi, eax
582
 
596
 
583
        pop     edi edx ecx
597
	pop	edi edx ecx
584
        ret
598
	ret
585
endp
599
endp
586
 
600
 
587
;;================================================================================================;;
601
;;================================================================================================;;
588
proc ini.get_color _f_name, _sec_name, _key_name, _def_val ;//////////////////////////////////////;;
602
proc ini.get_color _f_name, _sec_name, _key_name, _def_val ;//////////////////////////////////////;;
589
;;------------------------------------------------------------------------------------------------;;
603
;;------------------------------------------------------------------------------------------------;;
590
;? Read color                                                                                     ;;
604
;? Read color                                                                                     ;;
591
;;------------------------------------------------------------------------------------------------;;
605
;;------------------------------------------------------------------------------------------------;;
592
;> _f_name = ini filename                                                                 ;;
606
;> _f_name = ini filename                                                                 ;;
593
;> _sec_name = section name                                                               ;;
607
;> _sec_name = section name                                                               ;;
594
;> _key_name = key name                                                                   ;;
608
;> _key_name = key name                                                                   ;;
595
;> _def_val = default value to return if no key, section or file found                     ;;
609
;> _def_val = default value to return if no key, section or file found                     ;;
596
;;------------------------------------------------------------------------------------------------;;
610
;;------------------------------------------------------------------------------------------------;;
597
;< eax = [_def_val] (error) / found key value                                              ;;
611
;< eax = [_def_val] (error) / found key value                                              ;;
598
;;================================================================================================;;
612
;;================================================================================================;;
599
locals
613
locals
600
  buf rb 14
614
  buf rb 14
601
endl
615
endl
602
 
616
 
603
        push    ebx esi edi
617
	push	ebx esi edi
604
 
618
 
605
        lea     esi, [buf]
619
	lea	esi, [buf]
606
        stdcall ini.get_str, [_f_name], [_sec_name], [_key_name], esi, 14, 0
620
	stdcall ini.get_str, [_f_name], [_sec_name], [_key_name], esi, 14, 0
607
        cmp     byte[esi],0
621
	cmp	byte[esi],0
608
        je      .exit_error
622
	je	.exit_error
609
 
623
 
610
        xor     ebx, ebx
624
	xor	ebx, ebx
611
        stdcall libini._.str_to_int
625
	stdcall libini._.str_to_int
612
        movzx   ebx, al
626
	movzx	ebx, al
613
        shl     ebx, 16
627
	shl	ebx, 16
614
        lodsb
628
	lodsb
615
        cmp     al, ','
629
	cmp	al, ','
616
        jne     @f
630
	jne	@f
617
        stdcall libini._.str_to_int
631
	stdcall libini._.str_to_int
618
        mov     bh, al
632
	mov	bh, al
619
        lodsb
633
	lodsb
620
        cmp     al, ','
634
	cmp	al, ','
621
        jne     @f
635
	jne	@f
622
        stdcall libini._.str_to_int
636
	stdcall libini._.str_to_int
623
        mov     bl, al
637
	mov	bl, al
624
 
638
 
625
    @@: mov     eax, ebx
639
    @@: mov	eax, ebx
626
 
640
 
627
        pop     edi esi ebx
641
	pop	edi esi ebx
628
        ret
642
	ret
629
 
643
 
630
  .exit_error:
644
  .exit_error:
631
        mov     eax, [_def_val]
645
	mov	eax, [_def_val]
632
        pop     edi esi ebx
646
	pop	edi esi ebx
633
        ret
647
	ret
634
endp
648
endp
635
 
649
 
636
;;================================================================================================;;
650
;;================================================================================================;;
637
proc ini.set_color _f_name, _sec_name, _key_name, _val ;//////////////////////////////////////////;;
651
proc ini.set_color _f_name, _sec_name, _key_name, _val ;//////////////////////////////////////////;;
638
;;------------------------------------------------------------------------------------------------;;
652
;;------------------------------------------------------------------------------------------------;;
639
;? Write color                                                                                    ;;
653
;? Write color                                                                                    ;;
640
;;------------------------------------------------------------------------------------------------;;
654
;;------------------------------------------------------------------------------------------------;;
641
;> _f_name = ini filename                                                                 ;;
655
;> _f_name = ini filename                                                                 ;;
642
;> _sec_name = section name                                                               ;;
656
;> _sec_name = section name                                                               ;;
643
;> _key_name = key name                                                                   ;;
657
;> _key_name = key name                                                                   ;;
644
;> _val = value                                                                            ;;
658
;> _val = value                                                                            ;;
645
;;------------------------------------------------------------------------------------------------;;
659
;;------------------------------------------------------------------------------------------------;;
646
;< eax = -1 (error) / 0                                                                           ;;
660
;< eax = -1 (error) / 0                                                                           ;;
647
;;================================================================================================;;
661
;;================================================================================================;;
648
locals
662
locals
649
  buf rb 16
663
  buf rb 16
650
endl
664
endl
651
 
665
 
652
        push    ecx edx edi
666
	push	ecx edx edi
653
 
667
 
654
        lea     edi, [buf]
668
	lea	edi, [buf]
655
        mov     ecx, 10
669
	mov	ecx, 10
656
        mov     ebx, [_val]
670
	mov	ebx, [_val]
657
        mov     eax, ebx
671
	mov	eax, ebx
658
        shr     eax, 16
672
	shr	eax, 16
659
        and     eax, 0x0ff
673
	and	eax, 0x0ff
660
        stdcall libini._.int_to_str
674
	stdcall libini._.int_to_str
661
        mov     byte[edi], ','
675
	mov	byte[edi], ','
662
        inc     edi
676
	inc	edi
663
        movzx   eax, bh
677
	movzx	eax, bh
664
        stdcall libini._.int_to_str
678
	stdcall libini._.int_to_str
665
        mov     byte[edi], ','
679
	mov	byte[edi], ','
666
        inc     edi
680
	inc	edi
667
        movzx   eax, bl
681
	movzx	eax, bl
668
        stdcall libini._.int_to_str
682
	stdcall libini._.int_to_str
669
 
683
 
670
        lea     eax, [buf]
684
	lea	eax, [buf]
671
        sub     edi, eax
685
	sub	edi, eax
672
 
686
 
673
        stdcall ini.set_str, [_f_name], [_sec_name], [_key_name], eax, edi
687
	stdcall ini.set_str, [_f_name], [_sec_name], [_key_name], eax, edi
674
 
688
 
675
        pop     edi edx ecx
689
	pop	edi edx ecx
676
        ret
690
	ret
677
endp
691
endp
678
 
692
 
679
 
693
 
680
;;================================================================================================;;
694
;;================================================================================================;;
681
proc ini.del_section _f_name, _sec_name ;/////////////////////////////////////////////////////////;;
695
proc ini.del_section _f_name, _sec_name ;/////////////////////////////////////////////////////////;;
682
;;------------------------------------------------------------------------------------------------;;
696
;;------------------------------------------------------------------------------------------------;;
683
;? Delete section and all key in this section                                                     ;;
697
;? Delete section and all key in this section                                                     ;;
684
;;------------------------------------------------------------------------------------------------;;
698
;;------------------------------------------------------------------------------------------------;;
685
;> _f_name = ini filename                                                                 ;;
699
;> _f_name = ini filename                                                                 ;;
686
;> _sec_name = section name                                                               ;;
700
;> _sec_name = section name                                                               ;;
687
;;------------------------------------------------------------------------------------------------;;
701
;;------------------------------------------------------------------------------------------------;;
688
;< eax = 0 - success                                                                              ;;
702
;< eax = 0 - success                                                                              ;;
689
;<      -1 - file not found                                                                       ;;
703
;<      -1 - file not found                                                                       ;;
690
;<       1 - section not found                                                                    ;;
704
;<       1 - section not found                                                                    ;;
691
;;================================================================================================;;
705
;;================================================================================================;;
692
locals
706
locals
693
   funcFile     rb 25
707
   funcFile	rb 25
694
   fileInfo     rb 40
708
   fileInfo	rb 40
695
   begMem       rd 1
709
   begMem	rd 1
696
   endMem       rd 1
710
   endMem	rd 1
697
   begDel       rd 1
711
   begDel	rd 1
698
   endDel       rd 1
712
   endDel	rd 1
699
endl
713
endl
700
        push    ebx ecx edi esi
714
	push	ebx ecx edi esi
-
 
715
	xor	eax,eax
701
        mov     dword[funcFile],5               ;get file info
716
	mov	dword[funcFile],5		;get file info
702
        mov     dword[funcFile+4],0
717
	mov	dword[funcFile+4],eax
703
        mov     dword[funcFile+8],0
718
	mov	dword[funcFile+8],eax
704
        mov     dword[funcFile+12],0
719
	mov	dword[funcFile+12],eax
705
        lea     eax,[fileInfo]
720
	lea	eax,[fileInfo]
706
        mov     dword[funcFile+16],eax
721
	mov	dword[funcFile+16],eax
707
        mov     byte[funcFile+20],0
722
	mov	byte[funcFile+20],0
708
        m2m     dword[funcFile+21],[_f_name]
723
	m2m	dword[funcFile+21],[_f_name]
709
        lea     ebx,[funcFile]
724
	lea	ebx,[funcFile]
710
        mcall   70
725
	mcall	70
711
        test    eax,eax
726
	test	eax,eax
712
        jz      @f
727
	jz	@f
713
 
728
 
714
        or      eax,-1
729
	or	eax,-1
715
        pop     esi edi ecx ebx
730
	pop	esi edi ecx ebx
716
        ret
731
	ret
717
      @@:
732
      @@:
718
 
733
 
719
        mov     ecx,dword[fileInfo+32]          ;allocation mem for all file
734
	mov	ecx,dword[fileInfo+32]		;allocation mem for all file
720
        mcall   68,12
735
	mcall	68,12
721
 
736
 
722
        mov     [begMem],eax
737
	mov	[begMem],eax
723
        mov     [endMem],eax
738
	mov	[endMem],eax
724
        add     [endMem],ecx
739
	add	[endMem],ecx
725
 
740
 
726
        mov     dword[funcFile],0               ;read file to buffer
741
	mov	dword[funcFile],0		;read file to buffer
727
        mov     dword[funcFile+12],ecx
742
	mov	dword[funcFile+12],ecx
728
        mov     dword[funcFile+16],eax
743
	mov	dword[funcFile+16],eax
729
        lea     ebx,[funcFile]
744
	lea	ebx,[funcFile]
730
        mcall   70
745
	mcall	70
731
 
746
 
732
        mov     edi,[begMem]                    ;search begin section
747
	mov	edi,[begMem]			;search begin section
733
        jmp     .searchSect
748
	jmp	.searchSect
734
    .NoFindSect:
749
    .NoFindSect:
735
        mov     edi,[begDel]
750
	mov	edi,[begDel]
736
    .searchSect:
751
    .searchSect:
737
        mov     al,'['
752
	mov	al,'['
738
        repne   scasb
753
	repne	scasb
739
        test    ecx,ecx
754
	test	ecx,ecx
740
        jnz     @f
755
	jnz	@f
741
 
756
 
742
        pop     esi edi ecx ebx
757
	pop	esi edi ecx ebx
743
        mov     eax,1
758
	mov	eax,1
744
        ret
759
	ret
745
      @@:
760
      @@:
746
        mov     [begDel],edi
761
	mov	[begDel],edi
747
        mov     esi,[_sec_name]
762
	mov	esi,[_sec_name]
748
      @@:
763
      @@:
749
        lodsb
764
	lodsb
750
        test    al,al
765
	test	al,al
751
        jz      @f
766
	jz	@f
752
        scasb
767
	scasb
753
        jne     .NoFindSect
768
	jne	.NoFindSect
754
        jmp     @b
769
	jmp	@b
755
      @@:
770
      @@:
756
        cmp     byte[edi],']'
771
	cmp	byte[edi],']'
757
        jne     .NoFindSect
772
	jne	.NoFindSect
758
 
773
 
759
        mov     edi,[begDel]
774
	mov	edi,[begDel]
760
        dec     [begDel]
775
	dec	[begDel]
761
                                       ;search end section
776
				       ;search end section
762
    .searchEndSect:
777
    .searchEndSect:
763
        mov     al,'['
778
	mov	al,'['
764
        repne   scasb
779
	repne	scasb
765
 
780
 
766
        dec     edi
781
	dec	edi
767
        mov     [endDel],edi
782
	mov	[endDel],edi
768
 
783
 
769
        test    ecx,ecx
784
	test	ecx,ecx
770
        jnz     @f
785
	jnz	@f
771
        jmp     .SaveToFile
786
	jmp	.SaveToFile
772
      @@:
787
      @@:
773
 
788
 
774
 
789
 
775
        mov     esi,[endDel]
790
	mov	esi,[endDel]
776
        mov     edi,[begDel]
791
	mov	edi,[begDel]
777
   @@:  lodsb
792
   @@:	lodsb
778
        stosb
793
	stosb
779
        cmp     esi,[endMem]
794
	cmp	esi,[endMem]
780
        jb      @b
795
	jb	@b
781
 
796
 
782
   .SaveToFile:
797
   .SaveToFile:
783
        mov     eax,dword[funcFile+12]
798
	mov	eax,dword[funcFile+12]
784
        sub     eax,[endDel]
799
	sub	eax,[endDel]
785
        add     eax,[begDel]
800
	add	eax,[begDel]
786
        dec     eax
801
	dec	eax
787
 
802
 
788
        mov     dword[funcFile],2               ;write buffer to file
803
	mov	dword[funcFile],2		;write buffer to file
789
        mov     dword[funcFile+12],eax
804
	mov	dword[funcFile+12],eax
790
        m2m     dword[funcFile+16],[begMem]
805
	m2m	dword[funcFile+16],[begMem]
791
        lea     ebx,[funcFile]
806
	lea	ebx,[funcFile]
792
        mcall   70
807
	mcall	70
793
 
808
 
794
        mcall   68,13,[begMem]
809
	mcall	68,13,[begMem]
795
 
810
 
796
        xor     eax,eax
811
	xor	eax,eax
797
        pop     esi edi ecx ebx
812
	pop	esi edi ecx ebx
798
        ret
813
	ret
799
endp
814
endp
800
 
815
 
801
 
-
 
802
 
-
 
803
 
816
 
804
;;================================================================================================;;
817
;;================================================================================================;;
805
proc ini.get_shortcut _f_name, _sec_name, _key_name, _def_val, _modifiers ;///////////////////////;;
818
proc ini.get_shortcut _f_name, _sec_name, _key_name, _def_val, _modifiers ;///////////////////////;;
806
;;------------------------------------------------------------------------------------------------;;
819
;;------------------------------------------------------------------------------------------------;;
807
;? Read shortcut key                                                                              ;;
820
;? Read shortcut key                                                                              ;;
808
;;------------------------------------------------------------------------------------------------;;
821
;;------------------------------------------------------------------------------------------------;;
809
;> _f_name = ini filename                                                                 ;;
822
;> _f_name = ini filename                                                                 ;;
810
;> _sec_name = section name                                                               ;;
823
;> _sec_name = section name                                                               ;;
811
;> _key_name = key name                                                                   ;;
824
;> _key_name = key name                                                                   ;;
812
;> _def_val = default value to return if no key, section or file found                     ;;
825
;> _def_val = default value to return if no key, section or file found                     ;;
813
;> _modifiers = pointer to dword variable which receives modifiers state as in 66.4       ;;
826
;> _modifiers = pointer to dword variable which receives modifiers state as in 66.4       ;;
814
;;------------------------------------------------------------------------------------------------;;
827
;;------------------------------------------------------------------------------------------------;;
815
;< eax = [_def_val] (error) / shortcut key value as scancode                                 ;;
828
;< eax = [_def_val] (error) / shortcut key value as scancode                                 ;;
816
;< [[_modifiers]] = unchanged (error) / modifiers state for this shortcut                    ;;
829
;< [[_modifiers]] = unchanged (error) / modifiers state for this shortcut                    ;;
817
;;================================================================================================;;
830
;;================================================================================================;;
818
locals
831
locals
819
  buf rb 64
832
  buf rb 64
820
endl
833
endl
821
 
834
 
822
        push    ebx esi edi
835
	push	ebx esi edi
823
 
836
 
824
        lea     esi, [buf]
837
	lea	esi, [buf]
825
        stdcall ini.get_str, [_f_name], [_sec_name], [_key_name], esi, 64, 0
838
	stdcall ini.get_str, [_f_name], [_sec_name], [_key_name], esi, 64, 0
826
        cmp     byte[esi],0
839
	cmp	byte[esi],0
827
        je      .exit_error
840
	je	.exit_error
828
 
841
 
829
        xor     ebx, ebx        ; ebx holds the value of modifiers
842
	xor	ebx, ebx	; ebx holds the value of modifiers
830
.loop:
843
.loop:
831
; test for end
844
; test for end
832
        xor     eax, eax
845
	xor	eax, eax
833
        cmp     byte [esi], al
846
	cmp	byte [esi], al
834
        jz      .exit_ok        ; exit with scancode zero
847
	jz	.exit_ok	; exit with scancode zero
835
; skip all '+'s
848
; skip all '+'s
836
        cmp     byte [esi], '+'
849
	cmp	byte [esi], '+'
837
        jnz     @f
850
	jnz	@f
838
        inc     esi
851
	inc	esi
839
        jmp     .loop
852
	jmp	.loop
840
@@:
853
@@:
841
; test for names
854
; test for names
842
        mov     edi, .names_table
855
	mov	edi, .names_table
843
        xor     edx, edx
856
	xor	edx, edx
844
.names_loop:
857
.names_loop:
845
        movzx   ecx, byte [edi]
858
	movzx	ecx, byte [edi]
846
        inc     edi
859
	inc	edi
847
        push    esi
860
	push	esi
848
@@:
861
@@:
849
        lodsb
862
	lodsb
850
        or      al, 20h
863
	or	al, 20h
851
        scasb
864
	scasb
852
        loopz   @b
865
	loopz	@b
853
        jz      .name_found
866
	jz	.name_found
854
        pop     esi
867
	pop	esi
855
        lea     edi, [edi+ecx+4]
868
	lea	edi, [edi+ecx+4]
856
        inc     edx
869
	inc	edx
857
        cmp     byte [edi], 0
870
	cmp	byte [edi], 0
858
        jnz     .names_loop
871
	jnz	.names_loop
859
; special test: functional keys F
872
; special test: functional keys F
860
        cmp     byte [esi], 'f'
873
	cmp	byte [esi], 'f'
861
        jz      @f
874
	jz	@f
862
        cmp     byte [esi], 'F'
875
	cmp	byte [esi], 'F'
863
        jnz     .no_fx
876
	jnz	.no_fx
864
@@:
877
@@:
865
        mov     edi, esi
878
	mov	edi, esi
866
        inc     esi
879
	inc	esi
867
        call    libini._.str_to_int
880
	call	libini._.str_to_int
868
        test    eax, eax
881
	test	eax, eax
869
        jnz     .fx
882
	jnz	.fx
870
        mov     esi, edi
883
	mov	esi, edi
871
.no_fx:
884
.no_fx:
872
; name not found, that must be usual key
885
; name not found, that must be usual key
873
        movzx   eax, byte [esi]
886
	movzx	eax, byte [esi]
874
        stdcall libini._.ascii_to_scan, eax
887
	stdcall libini._.ascii_to_scan, eax
875
        test    eax, eax
888
	test	eax, eax
876
        jz      .exit_error
889
	jz	.exit_error
877
; all is ok
890
; all is ok
878
.exit_ok:
891
.exit_ok:
879
        mov     ecx, [_modifiers]
892
	mov	ecx, [_modifiers]
880
        test    ecx, ecx
893
	test	ecx, ecx
881
        jz      @f
894
	jz	@f
882
        mov     [ecx], ebx
895
	mov	[ecx], ebx
883
 
896
 
884
@@:
897
@@:
885
 
898
 
886
        pop     edi esi ebx
899
	pop	edi esi ebx
887
        ret
900
	ret
888
 
901
 
889
.exit_error:
902
.exit_error:
890
        mov     eax, [_def_val]
903
	mov	eax, [_def_val]
891
        pop     edi esi ebx
904
	pop	edi esi ebx
892
        ret
905
	ret
893
; handler for Fx
906
; handler for Fx
894
; eax = number
907
; eax = number
895
.fx:
908
.fx:
896
        cmp     eax, 10
909
	cmp	eax, 10
897
        ja      @f
910
	ja	@f
898
        add     eax, 3Bh-1
911
	add	eax, 3Bh-1
899
        jmp     .exit_ok
912
	jmp	.exit_ok
900
@@:
913
@@:
901
        add     eax, 57h-11
914
	add	eax, 57h-11
902
        jmp     .exit_ok
915
	jmp	.exit_ok
903
; handlers for names
916
; handlers for names
904
.name_found:
917
.name_found:
905
        pop     eax     ; ignore saved esi
918
	pop	eax	; ignore saved esi
906
        call    dword [edi]
919
	call	dword [edi]
907
        cmp     edx, .num_modifiers
920
	cmp	edx, .num_modifiers
908
        jae     .exit_ok
921
	jae	.exit_ok
909
        jmp     .loop
922
	jmp	.loop
910
; modifiers
923
; modifiers
911
; syntax of value for each modifier:
924
; syntax of value for each modifier:
912
; 0 = none, 1 = exactly one of L+R, 2 = both L+R, 3 = L, 4 = R
925
; 0 = none, 1 = exactly one of L+R, 2 = both L+R, 3 = L, 4 = R
913
; Logic for switching: LShift+RShift=LShift+Shift=Shift+Shift, LShift+LShift=LShift
926
; Logic for switching: LShift+RShift=LShift+Shift=Shift+Shift, LShift+LShift=LShift
914
; generic modifier: 0->1->2->2, 3->2, 4->2
927
; generic modifier: 0->1->2->2, 3->2, 4->2
915
; left modifier: 0->3->3, 1->2->2, 4->2
928
; left modifier: 0->3->3, 1->2->2, 4->2
916
; right modifier: 0->4->4, 1->2->2, 3->2
929
; right modifier: 0->4->4, 1->2->2, 3->2
917
; Shift corresponds to first hex digit, Ctrl - second, Alt - third
930
; Shift corresponds to first hex digit, Ctrl - second, Alt - third
918
macro shortcut_handle_modifiers name,reg,shift
931
macro shortcut_handle_modifiers name,reg,shift
919
{
932
{
920
local .set2,.set3,.set4
933
local .set2,.set3,.set4
921
.#name#_handler:        ; generic modifier
934
.#name#_handler:	; generic modifier
922
        test    reg, 0xF
935
	test	reg, 0xF
923
        jnz     .set2
936
	jnz	.set2
924
if shift
937
if shift
925
        or      reg, 1 shl shift
938
	or	reg, 1 shl shift
926
else
939
else
927
        inc     reg
940
	inc	reg
928
end if
941
end if
929
        retn
942
	retn
930
.set2:
943
.set2:
931
        and     reg, not (0xF shl shift)
944
	and	reg, not (0xF shl shift)
932
        or      reg, 2 shl shift
945
	or	reg, 2 shl shift
933
        retn
946
	retn
934
.l#name#_handler:
947
.l#name#_handler:
935
        mov     al, reg
948
	mov	al, reg
936
        and     al, 0xF shl shift
949
	and	al, 0xF shl shift
937
        jz      .set3
950
	jz	.set3
938
        cmp     al, 3 shl shift
951
	cmp	al, 3 shl shift
939
        jnz     .set2
952
	jnz	.set2
940
        retn
953
	retn
941
.set3:
954
.set3:
942
        add     reg, 3 shl shift
955
	add	reg, 3 shl shift
943
        retn
956
	retn
944
.r#name#_handler:
957
.r#name#_handler:
945
        mov     al, reg
958
	mov	al, reg
946
        and     al, 0xF shl shift
959
	and	al, 0xF shl shift
947
        jz      .set4
960
	jz	.set4
948
        cmp     al, 4 shl shift
961
	cmp	al, 4 shl shift
949
        jnz     .set2
962
	jnz	.set2
950
        retn
963
	retn
951
.set4:
964
.set4:
952
        add     reg, 4 shl shift
965
	add	reg, 4 shl shift
953
        retn
966
	retn
954
}
967
}
955
shortcut_handle_modifiers shift,bl,0
968
shortcut_handle_modifiers shift,bl,0
956
shortcut_handle_modifiers ctrl,bl,4
969
shortcut_handle_modifiers ctrl,bl,4
957
shortcut_handle_modifiers alt,bh,0
970
shortcut_handle_modifiers alt,bh,0
958
; names of keys
971
; names of keys
959
.name_handler:
972
.name_handler:
960
        movzx   eax, byte [.names_scancodes+edx-.num_modifiers]
973
	movzx	eax, byte [.names_scancodes+edx-.num_modifiers]
961
        retn
974
	retn
962
endp
975
endp
963
 
976
 
964
; note: comparison ignores case, so this table keeps lowercase names
977
; note: comparison ignores case, so this table keeps lowercase names
965
; macro does this
978
; macro does this
966
macro shortcut_name_with_handler name,handler
979
macro shortcut_name_with_handler name,handler
967
{
980
{
968
local .start, .end
981
local .start, .end
969
        db      .end - .start
982
	db	.end - .start
970
.start:
983
.start:
971
        db      name
984
	db	name
972
.end:
985
.end:
973
repeat .end - .start
986
repeat .end - .start
974
        load .a byte from .start + % - 1
987
	load .a byte from .start + % - 1
975
        store byte .a or 0x20 at .start + % - 1
988
	store byte .a or 0x20 at .start + % - 1
976
end repeat
989
end repeat
977
        dd      handler
990
	dd	handler
978
}
991
}
979
macro shortcut_name [name]
992
macro shortcut_name [name]
980
{
993
{
981
        shortcut_name_with_handler name, .name_handler
994
	shortcut_name_with_handler name, .name_handler
982
}
995
}
983
 
996
 
984
; all names here must be in english
997
; all names here must be in english
985
; ... or modify lowercasing in macro and in comparison
998
; ... or modify lowercasing in macro and in comparison
986
.names_table:
999
.names_table:
987
; generic modifiers
1000
; generic modifiers
988
        shortcut_name_with_handler 'Ctrl', .ctrl_handler
1001
	shortcut_name_with_handler 'Ctrl', .ctrl_handler
989
        shortcut_name_with_handler 'Alt', .alt_handler
1002
	shortcut_name_with_handler 'Alt', .alt_handler
990
        shortcut_name_with_handler 'Shift', .shift_handler
1003
	shortcut_name_with_handler 'Shift', .shift_handler
991
; concrete modifiers
1004
; concrete modifiers
992
        shortcut_name_with_handler 'LCtrl', .lctrl_handler
1005
	shortcut_name_with_handler 'LCtrl', .lctrl_handler
993
        shortcut_name_with_handler 'RCtrl', .rctrl_handler
1006
	shortcut_name_with_handler 'RCtrl', .rctrl_handler
994
        shortcut_name_with_handler 'LAlt', .lalt_handler
1007
	shortcut_name_with_handler 'LAlt', .lalt_handler
995
        shortcut_name_with_handler 'RAlt', .ralt_handler
1008
	shortcut_name_with_handler 'RAlt', .ralt_handler
996
        shortcut_name_with_handler 'LShift', .lshift_handler
1009
	shortcut_name_with_handler 'LShift', .lshift_handler
997
        shortcut_name_with_handler 'RShift', .rshift_handler
1010
	shortcut_name_with_handler 'RShift', .rshift_handler
998
.num_modifiers = 9
1011
.num_modifiers = 9
999
; symbolic names of keys
1012
; symbolic names of keys
1000
        shortcut_name 'Home', 'End', 'PgUp', 'PgDn', 'Ins', 'Insert', 'Del', 'Delete'
1013
	shortcut_name 'Home', 'End', 'PgUp', 'PgDn', 'Ins', 'Insert', 'Del', 'Delete'
1001
        shortcut_name 'Tab', 'Plus', 'Esc', 'Enter', 'Backspace', 'Space', 'Left', 'Right'
1014
	shortcut_name 'Tab', 'Plus', 'Esc', 'Enter', 'Backspace', 'Space', 'Left', 'Right'
1002
        shortcut_name 'Up', 'Down'
1015
	shortcut_name 'Up', 'Down'
1003
; end of table
1016
; end of table
1004
        db      0
1017
	db	0
1005
ini.get_shortcut.names_scancodes:
1018
ini.get_shortcut.names_scancodes:
1006
; scancodes for 'Home' ... 'Down'
1019
; scancodes for 'Home' ... 'Down'
1007
        db      47h, 4Fh, 49h, 51h, 52h, 52h, 53h, 53h
1020
	db	47h, 4Fh, 49h, 51h, 52h, 52h, 53h, 53h
1008
        db      0Fh, 4Eh, 01h, 1Ch, 0Eh, 39h, 4Bh, 4Dh
1021
	db	0Fh, 4Eh, 01h, 1Ch, 0Eh, 39h, 4Bh, 4Dh
1009
        db      48h, 50h
1022
	db	48h, 50h
1010
 
1023
 
1011
;;================================================================================================;;
1024
;;================================================================================================;;
1012
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
1025
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
1013
;;================================================================================================;;
1026
;;================================================================================================;;
1014
;! Imported functions section                                                                     ;;
1027
;! Imported functions section                                                                     ;;
1015
;;================================================================================================;;
1028
;;================================================================================================;;
1016
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
1029
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
1017
;;================================================================================================;;
1030
;;================================================================================================;;
1018
 
1031
 
1019
 
1032
 
1020
align 16
1033
align 16
1021
@IMPORT:
1034
@IMPORT:
1022
 
1035
 
1023
library \
1036
library \
1024
        libio , 'libio.obj'
1037
	libio , 'libio.obj'
1025
 
1038
 
1026
import  libio                       , \
1039
import	libio			    , \
1027
        file.size   , 'file_size'   , \
1040
	file.size   , 'file_size'   , \
1028
        file.open   , 'file_open'   , \
1041
	file.open   , 'file_open'   , \
1029
        file.read   , 'file_read'   , \
1042
	file.read   , 'file_read'   , \
1030
        file.write  , 'file_write'  , \
1043
	file.write  , 'file_write'  , \
1031
        file.seek   , 'file_seek'   , \
1044
	file.seek   , 'file_seek'   , \
1032
        file.eof?   , 'file_iseof'  , \
1045
	file.eof?   , 'file_iseof'  , \
1033
        file.seteof , 'file_seteof' , \
1046
	file.seteof , 'file_seteof' , \
1034
        file.tell   , 'file_tell'   , \
1047
	file.tell   , 'file_tell'   , \
1035
        file.close  , 'file_close'
1048
	file.close  , 'file_close'
1036
 
1049
 
1037
 
1050
 
1038
;;================================================================================================;;
1051
;;================================================================================================;;
1039
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
1052
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
1040
;;================================================================================================;;
1053
;;================================================================================================;;
1041
;! Exported functions section                                                                     ;;
1054
;! Exported functions section                                                                     ;;
1042
;;================================================================================================;;
1055
;;================================================================================================;;
1043
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
1056
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
1044
;;================================================================================================;;
1057
;;================================================================================================;;
1045
 
1058
 
1046
 
1059
 
1047
align 16
1060
align 16
1048
@EXPORT:
1061
@EXPORT:
1049
 
1062
 
1050
export                                            \
1063
export						  \
1051
        libini._.init     , 'lib_init'          , \
1064
	libini._.init	  , 'lib_init'		, \
1052
        0x00080009        , 'version'           , \
1065
	0x00080009	  , 'version'		, \
1053
        ini.enum_sections , 'ini_enum_sections' , \
1066
	ini.enum_sections , 'ini_enum_sections' , \
1054
        ini.enum_keys     , 'ini_enum_keys'     , \
1067
	ini.enum_keys	  , 'ini_enum_keys'	, \
1055
        ini.get_str       , 'ini_get_str'       , \
1068
	ini.get_str	  , 'ini_get_str'	, \
1056
        ini.get_int       , 'ini_get_int'       , \
1069
	ini.get_int	  , 'ini_get_int'	, \
1057
        ini.get_color     , 'ini_get_color'     , \
1070
	ini.get_color	  , 'ini_get_color'	, \
1058
        ini.set_str       , 'ini_set_str'       , \
1071
	ini.set_str	  , 'ini_set_str'	, \
1059
        ini.set_int       , 'ini_set_int'       , \
1072
	ini.set_int	  , 'ini_set_int'	, \
1060
        ini.set_color     , 'ini_set_color'     , \
1073
	ini.set_color	  , 'ini_set_color'	, \
1061
        ini.get_shortcut  , 'ini_get_shortcut'  , \
1074
	ini.get_shortcut  , 'ini_get_shortcut'	, \
1062
        ini.del_section   , 'ini_del_section'
1075
	ini.del_section   , 'ini_del_section'