webperimental: killstack decides stack protects.
[freeciv.git] / utility / registry_ini.h
blobbcec5861421c1feec08dc491618cafafe7a22fc3
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)
6 any later version.
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
16 #ifdef __cplusplus
17 extern "C" {
18 #endif /* __cplusplus */
20 /* utility */
21 #include "ioz.h"
22 #include "support.h" /* bool type and fc__attribute */
24 /* Opaque types. */
25 struct section_file;
26 struct section;
27 struct entry;
29 /* Typedefs. */
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 *,
36 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,
40 int enumerator);
42 /* Create a 'struct section_list' and related functions: */
43 #define SPECLIST_TAG section
44 #include "speclist.h"
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
54 #include "speclist.h"
55 #define entry_list_iterate(entlist, pentry) \
56 TYPED_LIST_ITERATE(struct entry, entlist, pentry)
57 #define entry_list_iterate_end LIST_ITERATE_END
59 /* Main functions. */
60 struct section_file *secfile_load_section(const char *filename,
61 const char *section,
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,
76 bool allow_replace,
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, \
81 path, ## __VA_ARGS__)
82 #define secfile_insert_bool_comment(secfile, value, comment, path, ...) \
83 secfile_insert_bool_full(secfile, value, comment, FALSE, \
84 path, ## __VA_ARGS__)
85 #define secfile_replace_bool(secfile, value, path, ...) \
86 secfile_insert_bool_full(secfile, value, NULL, TRUE, \
87 path, ## __VA_ARGS__)
88 #define secfile_replace_bool_comment(secfile, value, comment, path, ...) \
89 secfile_insert_bool_full(secfile, value, comment, TRUE, \
90 path, ## __VA_ARGS__)
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, \
98 path, ## __VA_ARGS__)
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,
113 bool allow_replace,
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,
150 bool allow_replace,
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,
164 const char *str,
165 const char *comment,
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,
231 int enumerator,
232 secfile_enum_name_fn_t name_fn,
233 const char *comment,
234 bool allow_replace,
235 const char *path, ...)
236 fc__attribute((__format__(__printf__, 6, 7)));
237 struct entry *secfile_insert_bitwise_enum_full(struct section_file *secfile,
238 int bitwise_val,
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,
243 const char *comment,
244 bool allow_replace,
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,
283 const char *comment,
284 bool allow_replace,
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,
289 size_t dim,
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,
294 const char *comment,
295 bool allow_replace,
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, \
300 path, ...) \
301 (specenum_type##_is_bitwise() \
302 ? secfile_insert_bitwise_enum_vec_full(secfile, (const int *) enumerators, \
303 dim, \
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, \
315 dim, \
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, \
321 path, ...) \
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, \
329 path, ...) \
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,
340 secfile_data_t data,
341 const char *comment,
342 bool allow_replace,
343 const char *path, ...)
344 fc__attribute((__format__(__printf__, 8, 9)));
345 #define secfile_insert_enum_data(secfile, value, bitwise, name_fn, data, \
346 path, ...) \
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, \
350 data, path, ...) \
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, \
354 path, ...) \
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, \
358 data, path, ...) \
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,
363 bool bitwise,
364 secfile_enum_name_data_fn_t name_fn,
365 secfile_data_t data,
366 const char *comment,
367 bool allow_replace,
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, \
378 ## __VA_ARGS__)
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, \
385 ...) \
386 secfile_insert_enum_vec_data_full(secfile, values, dim, bitwise, name_fn, \
387 data, comment, TRUE, path, \
388 ## __VA_ARGS__)
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,
401 const char *path);
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,
449 const char *def,
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,
458 int *penumerator,
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,
465 int *penumerator,
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
488 is_valid_fn,
489 secfile_enum_by_name_fn_t
490 by_name_fn,
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
497 is_valid_fn,
498 secfile_enum_by_name_fn_t
499 by_name_fn,
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, \
504 path, ...) \
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,
519 size_t *dim,
520 secfile_enum_is_valid_fn_t
521 is_valid_fn,
522 secfile_enum_by_name_fn_t
523 by_name_fn,
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,
528 size_t *dim,
529 secfile_enum_is_valid_fn_t
530 is_valid_fn,
531 secfile_enum_by_name_fn_t
532 by_name_fn,
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, \
537 path, ...) \
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,
563 secfile_data_t data,
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,
584 const char *prefix);
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,
604 int value);
605 struct entry *section_entry_bool_new(struct section *psection,
606 const char *entry_name,
607 bool value);
608 struct entry *section_entry_float_new(struct section *psection,
609 const char *entry_name,
610 float value);
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. */
616 enum entry_type {
617 ENTRY_BOOL,
618 ENTRY_INT,
619 ENTRY_FLOAT,
620 ENTRY_STR,
621 ENTRY_FILEREFERENCE
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);
651 #ifdef __cplusplus
653 #endif /* __cplusplus */
655 #endif /* FC__REGISTRY_INI_H */