1 /**********************************************************************
2 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2, or (at your option)
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12 ***********************************************************************/
13 #ifndef FC__REGISTRY_INI_H
14 #define FC__REGISTRY_INI_H
18 #endif /* __cplusplus */
22 #include "support.h" /* bool type and fc__attribute */
30 typedef const void *secfile_data_t
;
32 typedef bool (*secfile_enum_is_valid_fn_t
) (int enumerator
);
33 typedef const char * (*secfile_enum_name_fn_t
) (int enumerator
);
34 typedef int (*secfile_enum_by_name_fn_t
) (const char *enum_name
,
35 int (*strcmp_fn
)(const char *,
37 typedef int (*secfile_enum_iter_fn_t
) (void);
38 typedef int (*secfile_enum_next_fn_t
) (int enumerator
);
39 typedef const char * (*secfile_enum_name_data_fn_t
) (secfile_data_t data
,
42 /* Create a 'struct section_list' and related functions: */
43 #define SPECLIST_TAG section
45 #define section_list_iterate(seclist, psection) \
46 TYPED_LIST_ITERATE(struct section, seclist, psection)
47 #define section_list_iterate_end LIST_ITERATE_END
48 #define section_list_iterate_rev(seclist, psection) \
49 TYPED_LIST_ITERATE_REV(struct section, seclist, psection)
50 #define section_list_iterate_rev_end LIST_ITERATE_REV_END
52 /* Create a 'struct entry_list' and related functions: */
53 #define SPECLIST_TAG entry
55 #define entry_list_iterate(entlist, pentry) \
56 TYPED_LIST_ITERATE(struct entry, entlist, pentry)
57 #define entry_list_iterate_end LIST_ITERATE_END
60 struct section_file
*secfile_load_section(const char *filename
,
62 bool allow_duplicates
);
63 struct section_file
*secfile_from_stream(fz_FILE
*stream
,
64 bool allow_duplicates
);
66 bool secfile_save(const struct section_file
*secfile
, const char *filename
,
67 int compression_level
, enum fz_method compression_method
);
68 void secfile_check_unused(const struct section_file
*secfile
);
69 const char *secfile_name(const struct section_file
*secfile
);
71 enum entry_special_type
{ EST_NORMAL
, EST_INCLUDE
, EST_COMMENT
};
73 /* Insertion functions. */
74 struct entry
*secfile_insert_bool_full(struct section_file
*secfile
,
75 bool value
, const char *comment
,
77 const char *path
, ...)
78 fc__attribute((__format__(__printf__
, 5, 6)));
79 #define secfile_insert_bool(secfile, value, path, ...) \
80 secfile_insert_bool_full(secfile, value, NULL, FALSE, \
82 #define secfile_insert_bool_comment(secfile, value, comment, path, ...) \
83 secfile_insert_bool_full(secfile, value, comment, FALSE, \
85 #define secfile_replace_bool(secfile, value, path, ...) \
86 secfile_insert_bool_full(secfile, value, NULL, TRUE, \
88 #define secfile_replace_bool_comment(secfile, value, comment, path, ...) \
89 secfile_insert_bool_full(secfile, value, comment, TRUE, \
91 size_t secfile_insert_bool_vec_full(struct section_file
*secfile
,
92 const bool *values
, size_t dim
,
93 const char *comment
, bool allow_replace
,
94 const char *path
, ...)
95 fc__attribute((__format__(__printf__
, 6, 7)));
96 #define secfile_insert_bool_vec(secfile, values, dim, path, ...) \
97 secfile_insert_bool_vec_full(secfile, values, dim, NULL, FALSE, \
99 #define secfile_insert_bool_vec_comment(secfile, values, dim, \
100 comment, path, ...) \
101 secfile_insert_bool_vec_full(secfile, values, dim, comment, FALSE, \
102 path, ## __VA_ARGS__)
103 #define secfile_replace_bool_vec(secfile, values, dim, path, ...) \
104 secfile_insert_bool_vec_full(secfile, values, dim, NULL, TRUE, \
105 path, ## __VA_ARGS__)
106 #define secfile_replace_bool_vec_comment(secfile, values, dim, \
107 comment, path, ...) \
108 secfile_insert_bool_vec_full(secfile, values, comment, TRUE, \
109 path, ## __VA_ARGS__)
111 struct entry
*secfile_insert_int_full(struct section_file
*secfile
,
112 int value
, const char *comment
,
114 const char *path
, ...)
115 fc__attribute((__format__ (__printf__
, 5, 6)));
116 #define secfile_insert_int(secfile, value, path, ...) \
117 secfile_insert_int_full(secfile, value, NULL, FALSE, \
118 path, ## __VA_ARGS__)
119 #define secfile_insert_int_comment(secfile, value, comment, path, ...) \
120 secfile_insert_int_full(secfile, value, comment, FALSE, \
121 path, ## __VA_ARGS__)
122 #define secfile_replace_int(secfile, value, path, ...) \
123 secfile_insert_int_full(secfile, value, NULL, TRUE, \
124 path, ## __VA_ARGS__)
125 #define secfile_replace_int_comment(secfile, value, comment, path, ...) \
126 secfile_insert_int_full(secfile, value, comment, TRUE, \
127 path, ## __VA_ARGS__)
128 size_t secfile_insert_int_vec_full(struct section_file
*secfile
,
129 const int *values
, size_t dim
,
130 const char *comment
, bool allow_replace
,
131 const char *path
, ...)
132 fc__attribute((__format__ (__printf__
, 6, 7)));
133 #define secfile_insert_int_vec(secfile, values, dim, path, ...) \
134 secfile_insert_int_vec_full(secfile, values, dim, NULL, FALSE, \
135 path, ## __VA_ARGS__)
136 #define secfile_insert_int_vec_comment(secfile, values, dim, \
137 comment, path, ...) \
138 secfile_insert_int_vec_full(secfile, values, dim, comment, FALSE, \
139 path, ## __VA_ARGS__)
140 #define secfile_replace_int_vec(secfile, values, dim, path, ...) \
141 secfile_insert_int_vec_full(secfile, values, dim, NULL, TRUE, \
142 path, ## __VA_ARGS__)
143 #define secfile_replace_int_vec_comment(secfile, values, dim, \
144 comment, path, ...) \
145 secfile_insert_int_vec_full(secfile, values, dim, comment, TRUE, \
146 path, ## __VA_ARGS__)
148 struct entry
*secfile_insert_float_full(struct section_file
*secfile
,
149 float value
, const char *comment
,
151 const char *path
, ...)
152 fc__attribute((__format__ (__printf__
, 5, 6)));
153 #define secfile_insert_float(secfile, value, path, ...) \
154 secfile_insert_float_full(secfile, value, NULL, FALSE, \
155 path, ## __VA_ARGS__)
157 struct section
*secfile_insert_include(struct section_file
*secfile
,
158 const char *filename
);
160 struct section
*secfile_insert_long_comment(struct section_file
*secfile
,
161 const char *comment
);
163 struct entry
*secfile_insert_str_full(struct section_file
*secfile
,
166 bool allow_replace
, bool no_escape
,
167 enum entry_special_type stype
,
168 const char *path
, ...)
169 fc__attribute((__format__(__printf__
, 7, 8)));
170 #define secfile_insert_str(secfile, string, path, ...) \
171 secfile_insert_str_full(secfile, string, NULL, FALSE, FALSE, FALSE, \
172 path, ## __VA_ARGS__)
173 #define secfile_insert_str_noescape(secfile, string, path, ...) \
174 secfile_insert_str_full(secfile, string, NULL, FALSE, TRUE, FALSE, \
175 path, ## __VA_ARGS__)
176 #define secfile_insert_str_comment(secfile, string, comment, path, ...) \
177 secfile_insert_str_full(secfile, string, comment, FALSE, TRUE, FALSE, \
178 path, ## __VA_ARGS__)
179 #define secfile_insert_str_noescape_comment(secfile, string, \
180 comment, path, ...) \
181 secfile_insert_str_full(secfile, string, comment, FALSE, TRUE, FALSE, \
182 path, ## __VA_ARGS__)
183 #define secfile_replace_str(secfile, string, path, ...) \
184 secfile_insert_str_full(secfile, string, NULL, TRUE, FALSE, FALSE, \
185 path, ## __VA_ARGS__)
186 #define secfile_replace_str_noescape(secfile, string, path, ...) \
187 secfile_insert_str_full(secfile, string, NULL, TRUE, TRUE, FALSE, \
188 path, ## __VA_ARGS__)
189 #define secfile_replace_str_comment(secfile, string, comment, path, ...) \
190 secfile_insert_str_full(secfile, string, comment, TRUE, TRUE, FALSE, \
191 path, ## __VA_ARGS__)
192 #define secfile_replace_str_noescape_comment(secfile, string, \
193 comment, path, ...) \
194 secfile_insert_str_full(secfile, string, comment, TRUE, TRUE, FALSE, \
195 path, ## __VA_ARGS__)
196 size_t secfile_insert_str_vec_full(struct section_file
*secfile
,
197 const char *const *strings
, size_t dim
,
198 const char *comment
, bool allow_replace
,
199 bool no_escape
, const char *path
, ...)
200 fc__attribute((__format__(__printf__
, 7, 8)));
201 #define secfile_insert_str_vec(secfile, strings, dim, path, ...) \
202 secfile_insert_str_vec_full(secfile, strings, dim, NULL, FALSE, FALSE, \
203 path, ## __VA_ARGS__)
204 #define secfile_insert_str_vec_noescape(secfile, strings, dim, path, ...) \
205 secfile_insert_str_vec_full(secfile, strings, dim, NULL, FALSE, TRUE, \
206 path, ## __VA_ARGS__)
207 #define secfile_insert_str_vec_comment(secfile, strings, dim, \
208 comment, path, ...) \
209 secfile_insert_str_vec_full(secfile, strings, dim, comment, FALSE, TRUE, \
210 path, ## __VA_ARGS__)
211 #define secfile_insert_str_vec_noescape_comment(secfile, strings, dim, \
212 comment, path, ...) \
213 secfile_insert_str_vec_full(secfile, strings, dim, comment, FALSE, TRUE, \
214 path, ## __VA_ARGS__)
215 #define secfile_replace_str_vec(secfile, strings, dim, path, ...) \
216 secfile_insert_str_vec_full(secfile, strings, dim, NULL, TRUE, FALSE, \
217 path, ## __VA_ARGS__)
218 #define secfile_replace_str_vec_noescape(secfile, strings, dim, path, ...) \
219 secfile_insert_str_vec_full(secfile, strings, dim, NULL, TRUE, TRUE, \
220 path, ## __VA_ARGS__)
221 #define secfile_replace_str_vec_comment(secfile, strings, dim, \
222 comment, path, ...) \
223 secfile_insert_str_vec_full(secfile, strings, dim, comment, TRUE, TRUE, \
224 path, ## __VA_ARGS__)
225 #define secfile_replace_str_vec_noescape_comment(secfile, strings, dim, \
226 comment, path, ...) \
227 secfile_insert_str_vec_full(secfile, strings, dim, comment, TRUE, TRUE, \
228 path, ## __VA_ARGS__)
230 struct entry
*secfile_insert_plain_enum_full(struct section_file
*secfile
,
232 secfile_enum_name_fn_t name_fn
,
235 const char *path
, ...)
236 fc__attribute((__format__(__printf__
, 6, 7)));
237 struct entry
*secfile_insert_bitwise_enum_full(struct section_file
*secfile
,
239 secfile_enum_name_fn_t name_fn
,
240 secfile_enum_iter_fn_t begin_fn
,
241 secfile_enum_iter_fn_t end_fn
,
242 secfile_enum_next_fn_t next_fn
,
245 const char *path
, ...)
246 fc__attribute((__format__(__printf__
, 9, 10)));
247 #define secfile_insert_enum_full(secfile, enumerator, specenum_type, \
248 comment, allow_replace, path, ...) \
249 (specenum_type##_is_bitwise() \
250 ? secfile_insert_bitwise_enum_full(secfile, enumerator, \
251 (secfile_enum_name_fn_t) \
252 specenum_type##_name, \
253 (secfile_enum_iter_fn_t) \
254 specenum_type##_begin, \
255 (secfile_enum_iter_fn_t) \
256 specenum_type##_end, \
257 (secfile_enum_next_fn_t) \
258 specenum_type##_next, \
259 comment, allow_replace, \
260 path, ## __VA_ARGS__) \
261 : secfile_insert_plain_enum_full(secfile, enumerator, \
262 (secfile_enum_name_fn_t) \
263 specenum_type##_name, \
264 comment, allow_replace, \
265 path, ## __VA_ARGS__))
266 #define secfile_insert_enum(secfile, enumerator, specenum_type, path, ...) \
267 secfile_insert_enum_full(secfile, enumerator, specenum_type, NULL, FALSE, \
268 path, ## __VA_ARGS__)
269 #define secfile_insert_enum_comment(secfile, enumerator, specenum_type, \
270 comment, path, ...) \
271 secfile_insert_enum_full(secfile, enumerator, specenum_type, comment, \
272 FALSE, path, ## __VA_ARGS__)
273 #define secfile_replace_enum(secfile, enumerator, specenum_type, path, ...) \
274 secfile_insert_enum_full(secfile, enumerator, specenum_type, NULL, TRUE, \
275 path, ## __VA_ARGS__)
276 #define secfile_replace_enum_comment(secfile, enumerator, specenum_type, \
277 comment, path, ...) \
278 secfile_insert_enum_full(secfile, enumerator, specenum_type, comment, \
279 TRUE, path, ## __VA_ARGS__)
280 size_t secfile_insert_plain_enum_vec_full(struct section_file
*secfile
,
281 const int *enumurators
, size_t dim
,
282 secfile_enum_name_fn_t name_fn
,
285 const char *path
, ...)
286 fc__attribute((__format__(__printf__
, 7, 8)));
287 size_t secfile_insert_bitwise_enum_vec_full(struct section_file
*secfile
,
288 const int *bitwise_vals
,
290 secfile_enum_name_fn_t name_fn
,
291 secfile_enum_iter_fn_t begin_fn
,
292 secfile_enum_iter_fn_t end_fn
,
293 secfile_enum_next_fn_t next_fn
,
296 const char *path
, ...)
297 fc__attribute((__format__(__printf__
, 10, 11)));
298 #define secfile_insert_enum_vec_full(secfile, enumerators, dim, \
299 specenum_type, comment, allow_replace, \
301 (specenum_type##_is_bitwise() \
302 ? secfile_insert_bitwise_enum_vec_full(secfile, (const int *) enumerators, \
304 (secfile_enum_name_fn_t) \
305 specenum_type##_name, \
306 (secfile_enum_iter_fn_t) \
307 specenum_type##_begin, \
308 (secfile_enum_iter_fn_t) \
309 specenum_type##_end, \
310 (secfile_enum_next_fn_t) \
311 specenum_type##_next, \
312 comment, allow_replace, \
313 path, ## __VA_ARGS__) \
314 : secfile_insert_plain_enum_vec_full(secfile, (const int *) enumerators, \
316 (secfile_enum_name_fn_t) \
317 specenum_type##_name, \
318 comment, allow_replace, \
319 path, ## __VA_ARGS__))
320 #define secfile_insert_enum_vec(secfile, enumerators, dim, specenum_type, \
322 secfile_insert_enum_vec_full(secfile, enumerators, dim, specenum_type, \
323 NULL, FALSE, path, ## __VA_ARGS__)
324 #define secfile_insert_enum_vec_comment(secfile, enumerators, dim, \
325 specenum_type, comment, path, ...) \
326 secfile_insert_enum_vec_full(secfile, enumerators, dim, specenum_type, \
327 comment, FALSE, path, ## __VA_ARGS__)
328 #define secfile_replace_enum_vec(secfile, enumerators, dim, specenum_type, \
330 secfile_insert_enum_vec_full(secfile, enumerators, dim, specenum_type, \
331 NULL, TRUE, path, ## __VA_ARGS__)
332 #define secfile_replace_enum_vec_comment(secfile, enumerators, dim, \
333 specenum_type, comment, path, ...) \
334 secfile_insert_enum_vec_full(secfile, enumerators, dim, specenum_type, \
335 comment, TRUE, path, ## __VA_ARGS__)
337 struct entry
*secfile_insert_enum_data_full(struct section_file
*secfile
,
338 int value
, bool bitwise
,
339 secfile_enum_name_data_fn_t name_fn
,
343 const char *path
, ...)
344 fc__attribute((__format__(__printf__
, 8, 9)));
345 #define secfile_insert_enum_data(secfile, value, bitwise, name_fn, data, \
347 secfile_insert_enum_data_full(secfile, value, bitwise, name_fn, data, \
348 NULL, FALSE, path, ## __VA_ARGS__)
349 #define secfile_insert_enum_data_comment(secfile, value, bitwise, name_fn, \
351 secfile_insert_enum_data_full(secfile, value, bitwise, name_fn, data, \
352 comment, FALSE, path, ## __VA_ARGS__)
353 #define secfile_replace_enum_data(secfile, value, bitwise, name_fn, data, \
355 secfile_insert_enum_data_full(secfile, value, bitwise, name_fn, data, \
356 NULL, TRUE, path, ## __VA_ARGS__)
357 #define secfile_replace_enum_data_comment(secfile, value, bitwise, name_fn, \
359 secfile_insert_enum_data_full(secfile, value, bitwise, name_fn, data, \
360 comment, TRUE, path, ## __VA_ARGS__)
361 size_t secfile_insert_enum_vec_data_full(struct section_file
*secfile
,
362 const int *values
, size_t dim
,
364 secfile_enum_name_data_fn_t name_fn
,
368 const char *path
, ...)
369 fc__attribute((__format__(__printf__
, 9, 10)));
370 #define secfile_insert_enum_vec_data(secfile, values, dim, bitwise, \
371 name_fn, data, path, ...) \
372 secfile_insert_enum_vec_data_full(secfile, values, dim, bitwise, name_fn, \
373 data, NULL, FALSE, path, ## __VA_ARGS__)
374 #define secfile_insert_enum_vec_data_comment(secfile, values, dim, bitwise, \
375 name_fn, data, path, ...) \
376 secfile_insert_enum_vec_data_full(secfile, values, dim, bitwise, name_fn, \
377 data, comment, FALSE, path, \
379 #define secfile_replace_enum_vec_data(secfile, values, dim, bitwise, \
380 name_fn, data, path, ...) \
381 secfile_insert_enum_vec_data_full(secfile, values, dim, bitwise, name_fn, \
382 data, NULL, TRUE, path, ## __VA_ARGS__)
383 #define secfile_replace_enum_vec_data_comment(secfile, values, dim, \
384 bitwise, name_fn, data, path, \
386 secfile_insert_enum_vec_data_full(secfile, values, dim, bitwise, name_fn, \
387 data, comment, TRUE, path, \
390 struct entry
*secfile_insert_filereference(struct section_file
*secfile
,
391 char *filename
, char *path
, ...)
392 fc__attribute((__format__ (__printf__
, 3, 4)));
394 /* Deletion function. */
395 bool secfile_entry_delete(struct section_file
*secfile
,
396 const char *path
, ...)
397 fc__attribute((__format__ (__printf__
, 2, 3)));
399 /* Lookup functions. */
400 struct entry
*secfile_entry_by_path(const struct section_file
*secfile
,
402 struct entry
*secfile_entry_lookup(const struct section_file
*secfile
,
403 const char *path
, ...)
404 fc__attribute((__format__ (__printf__
, 2, 3)));
406 bool secfile_lookup_bool(const struct section_file
*secfile
, bool *bval
,
407 const char *path
, ...)
408 fc__warn_unused_result
409 fc__attribute((__format__ (__printf__
, 3, 4)));
410 bool secfile_lookup_bool_default(const struct section_file
*secfile
,
411 bool def
, const char *path
, ...)
412 fc__warn_unused_result
413 fc__attribute((__format__ (__printf__
, 3, 4)));
414 bool *secfile_lookup_bool_vec(const struct section_file
*secfile
,
415 size_t *dim
, const char *path
, ...)
416 fc__warn_unused_result
417 fc__attribute((__format__ (__printf__
, 3, 4)));
419 bool secfile_lookup_int(const struct section_file
*secfile
, int *ival
,
420 const char *path
, ...)
421 fc__warn_unused_result
422 fc__attribute((__format__ (__printf__
, 3, 4)));
423 int secfile_lookup_int_default(const struct section_file
*secfile
, int def
,
424 const char *path
, ...)
425 fc__warn_unused_result
426 fc__attribute((__format__ (__printf__
, 3, 4)));
427 int secfile_lookup_int_def_min_max(const struct section_file
*secfile
,
428 int defval
, int minval
, int maxval
,
429 const char *path
, ...)
430 fc__warn_unused_result
431 fc__attribute((__format__ (__printf__
, 5, 6)));
432 int *secfile_lookup_int_vec(const struct section_file
*secfile
,
433 size_t *dim
, const char *path
, ...)
434 fc__warn_unused_result
435 fc__attribute((__format__ (__printf__
, 3, 4)));
437 bool secfile_lookup_float(const struct section_file
*secfile
, float *fval
,
438 const char *path
, ...)
439 fc__warn_unused_result
440 fc__attribute((__format__ (__printf__
, 3, 4)));
441 float secfile_lookup_float_default(const struct section_file
*secfile
,
442 float def
, const char *path
, ...);
444 const char *secfile_lookup_str(const struct section_file
*secfile
,
445 const char *path
, ...)
446 fc__warn_unused_result
447 fc__attribute((__format__ (__printf__
, 2, 3)));
448 const char *secfile_lookup_str_default(const struct section_file
*secfile
,
450 const char *path
, ...)
451 fc__warn_unused_result
452 fc__attribute((__format__ (__printf__
, 3, 4)));
453 const char **secfile_lookup_str_vec(const struct section_file
*secfile
,
454 size_t *dim
, const char *path
, ...)
455 fc__attribute((__format__ (__printf__
, 3, 4)));
457 bool secfile_lookup_plain_enum_full(const struct section_file
*secfile
,
459 secfile_enum_is_valid_fn_t is_valid_fn
,
460 secfile_enum_by_name_fn_t by_name_fn
,
461 const char *path
, ...)
462 fc__warn_unused_result
463 fc__attribute((__format__ (__printf__
, 5, 6)));
464 bool secfile_lookup_bitwise_enum_full(const struct section_file
*secfile
,
466 secfile_enum_is_valid_fn_t is_valid_fn
,
467 secfile_enum_by_name_fn_t by_name_fn
,
468 const char *path
, ...)
469 fc__warn_unused_result
470 fc__attribute((__format__ (__printf__
, 5, 6)));
471 #define secfile_lookup_enum(secfile, enumerator, specenum_type, path, ...) \
472 (specenum_type##_is_bitwise() \
473 ? secfile_lookup_bitwise_enum_full(secfile, FC_ENUM_PTR(enumerator), \
474 (secfile_enum_is_valid_fn_t) \
475 specenum_type##_is_valid, \
476 (secfile_enum_by_name_fn_t) \
477 specenum_type##_by_name, \
478 path, ## __VA_ARGS__) \
479 : secfile_lookup_plain_enum_full(secfile, FC_ENUM_PTR(enumerator), \
480 (secfile_enum_is_valid_fn_t) \
481 specenum_type##_is_valid, \
482 (secfile_enum_by_name_fn_t) \
483 specenum_type##_by_name, \
484 path, ## __VA_ARGS__))
485 int secfile_lookup_plain_enum_default_full(const struct section_file
486 *secfile
, int defval
,
487 secfile_enum_is_valid_fn_t
489 secfile_enum_by_name_fn_t
491 const char *path
, ...)
492 fc__warn_unused_result
493 fc__attribute((__format__ (__printf__
, 5, 6)));
494 int secfile_lookup_bitwise_enum_default_full(const struct section_file
495 *secfile
, int defval
,
496 secfile_enum_is_valid_fn_t
498 secfile_enum_by_name_fn_t
500 const char *path
, ...)
501 fc__warn_unused_result
502 fc__attribute((__format__ (__printf__
, 5, 6)));
503 #define secfile_lookup_enum_default(secfile, defval, specenum_type, \
505 (specenum_type##_is_bitwise() \
506 ? secfile_lookup_bitwise_enum_default_full(secfile, defval, \
507 (secfile_enum_is_valid_fn_t) \
508 specenum_type##_is_valid, \
509 (secfile_enum_by_name_fn_t) \
510 specenum_type##_by_name, \
511 path, ## __VA_ARGS__) \
512 : secfile_lookup_plain_enum_default_full(secfile, defval, \
513 (secfile_enum_is_valid_fn_t) \
514 specenum_type##_is_valid, \
515 (secfile_enum_by_name_fn_t) \
516 specenum_type##_by_name, \
517 path, ## __VA_ARGS__))
518 int *secfile_lookup_plain_enum_vec_full(const struct section_file
*secfile
,
520 secfile_enum_is_valid_fn_t
522 secfile_enum_by_name_fn_t
524 const char *path
, ...)
525 fc__warn_unused_result
526 fc__attribute((__format__ (__printf__
, 5, 6)));
527 int *secfile_lookup_bitwise_enum_vec_full(const struct section_file
*secfile
,
529 secfile_enum_is_valid_fn_t
531 secfile_enum_by_name_fn_t
533 const char *path
, ...)
534 fc__warn_unused_result
535 fc__attribute((__format__ (__printf__
, 5, 6)));
536 #define secfile_lookup_enum_vec(secfile, dim, specenum_type, \
538 (specenum_type##_is_bitwise() \
539 ? (enum specenum_type *) \
540 secfile_lookup_bitwise_enum_vec_full(secfile, dim, \
541 (secfile_enum_is_valid_fn_t) \
542 specenum_type##_is_valid, \
543 (secfile_enum_by_name_fn_t) \
544 specenum_type##_by_name, \
545 path, ## __VA_ARGS__) \
546 : (enum specenum_type *) \
547 secfile_lookup_plain_enum_vec_full(secfile, dim, \
548 (secfile_enum_is_valid_fn_t) \
549 specenum_type##_is_valid, \
550 (secfile_enum_by_name_fn_t) \
551 specenum_type##_by_name, \
552 path, ## __VA_ARGS__))
554 bool secfile_lookup_enum_data(const struct section_file
*secfile
,
555 int *pvalue
, bool bitwise
,
556 secfile_enum_name_data_fn_t name_fn
,
557 secfile_data_t data
, const char *path
, ...)
558 fc__warn_unused_result
559 fc__attribute((__format__ (__printf__
, 6, 7)));
560 int secfile_lookup_enum_default_data(const struct section_file
*secfile
,
561 int defval
, bool bitwise
,
562 secfile_enum_name_data_fn_t name_fn
,
564 const char *path
, ...)
565 fc__warn_unused_result
566 fc__attribute((__format__ (__printf__
, 6, 7)));
567 int *secfile_lookup_enum_vec_data(const struct section_file
*secfile
,
568 size_t *dim
, bool bitwise
,
569 secfile_enum_name_data_fn_t name_fn
,
570 secfile_data_t data
, const char *path
, ...)
571 fc__warn_unused_result
572 fc__attribute((__format__ (__printf__
, 6, 7)));
574 /* Sections functions. */
575 struct section
*secfile_section_by_name(const struct section_file
*secfile
,
576 const char *section_name
);
577 struct section
*secfile_section_lookup(const struct section_file
*secfile
,
578 const char *path
, ...)
579 fc__attribute((__format__ (__printf__
, 2, 3)));
580 const struct section_list
*
581 secfile_sections(const struct section_file
*secfile
);
582 struct section_list
*
583 secfile_sections_by_name_prefix(const struct section_file
*secfile
,
585 struct section
*secfile_section_new(struct section_file
*secfile
,
586 const char *section_name
);
589 /* Independant section functions. */
590 void section_destroy(struct section
*psection
);
591 void section_clear_all(struct section
*psection
);
593 bool section_set_name(struct section
*psection
, const char *section_name
);
595 /* Entry functions. */
596 const struct entry_list
*section_entries(const struct section
*psection
);
597 struct entry
*section_entry_by_name(const struct section
*psection
,
598 const char *entry_name
);
599 struct entry
*section_entry_lookup(const struct section
*psection
,
600 const char *path
, ...)
601 fc__attribute((__format__ (__printf__
, 2, 3)));
602 struct entry
*section_entry_int_new(struct section
*psection
,
603 const char *entry_name
,
605 struct entry
*section_entry_bool_new(struct section
*psection
,
606 const char *entry_name
,
608 struct entry
*section_entry_float_new(struct section
*psection
,
609 const char *entry_name
,
611 struct entry
*section_entry_str_new(struct section
*psection
,
612 const char *entry_name
,
613 const char *value
, bool escaped
);
615 /* Independant entry functions. */
624 void entry_destroy(struct entry
*pentry
);
626 struct section
*entry_section(const struct entry
*pentry
);
627 enum entry_type
entry_type(const struct entry
*pentry
);
628 int entry_path(const struct entry
*pentry
, char *buf
, size_t buf_len
);
630 const char *entry_name(const struct entry
*pentry
);
631 bool entry_set_name(struct entry
*pentry
, const char *entry_name
);
633 const char *entry_comment(const struct entry
*pentry
);
634 void entry_set_comment(struct entry
*pentry
, const char *comment
);
636 bool entry_int_get(const struct entry
*pentry
, int *value
);
637 bool entry_int_set(struct entry
*pentry
, int value
);
639 bool entry_bool_get(const struct entry
*pentry
, bool *value
);
640 bool entry_bool_set(struct entry
*pentry
, bool value
);
642 bool entry_float_get(const struct entry
*pentry
, float *value
);
643 bool entry_float_set(struct entry
*pentry
, float value
);
645 bool entry_str_get(const struct entry
*pentry
, const char **value
);
646 bool entry_str_set(struct entry
*pentry
, const char *value
);
647 bool entry_str_escaped(const struct entry
*pentry
);
648 bool entry_str_set_escaped(struct entry
*pentry
, bool escaped
);
649 bool entry_str_set_gt_marking(struct entry
*pentry
, bool gt_marking
);
653 #endif /* __cplusplus */
655 #endif /* FC__REGISTRY_INI_H */