1 /* ----------------------------------------------------------------------------
2    libconfig - A library for processing structured configuration files
3    Copyright (C) 2005-2018  Mark A Lindner
4 
5    This file is part of libconfig.
6 
7    This library is free software; you can redistribute it and/or
8    modify it under the terms of the GNU Lesser General Public License
9    as published by the Free Software Foundation; either version 2.1 of
10    the License, or (at your option) any later version.
11 
12    This library is distributed in the hope that it will be useful, but
13    WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    Lesser General Public License for more details.
16 
17    You should have received a copy of the GNU Library General Public
18    License along with this library; if not, see
19    <http://www.gnu.org/licenses/>.
20    ----------------------------------------------------------------------------
21 */
22 
23 #ifndef __libconfig_h
24 #define __libconfig_h
25 
26 #ifdef __cplusplus
27 extern "C" {
28 #endif /* __cplusplus */
29 
30 #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
31 #if defined(LIBCONFIG_STATIC)
32 #define LIBCONFIG_API
33 #elif defined(LIBCONFIG_EXPORTS)
34 #define LIBCONFIG_API __declspec(dllexport)
35 #else /* ! LIBCONFIG_EXPORTS */
36 #define LIBCONFIG_API __declspec(dllimport)
37 #endif /* LIBCONFIG_STATIC */
38 #else /* ! WIN32 */
39 #define LIBCONFIG_API
40 #endif /* WIN32 */
41 
42 #define LIBCONFIG_VER_MAJOR    1
43 #define LIBCONFIG_VER_MINOR    7
44 #define LIBCONFIG_VER_REVISION 0
45 
46 #include <stdio.h>
47 
48 #define CONFIG_TYPE_NONE    0
49 #define CONFIG_TYPE_GROUP   1
50 #define CONFIG_TYPE_INT     2
51 #define CONFIG_TYPE_INT64   3
52 #define CONFIG_TYPE_FLOAT   4
53 #define CONFIG_TYPE_STRING  5
54 #define CONFIG_TYPE_BOOL    6
55 #define CONFIG_TYPE_ARRAY   7
56 #define CONFIG_TYPE_LIST    8
57 
58 #define CONFIG_FORMAT_DEFAULT  0
59 #define CONFIG_FORMAT_HEX      1
60 
61 #define CONFIG_OPTION_AUTOCONVERT                     0x01
62 #define CONFIG_OPTION_SEMICOLON_SEPARATORS            0x02
63 #define CONFIG_OPTION_COLON_ASSIGNMENT_FOR_GROUPS     0x04
64 #define CONFIG_OPTION_COLON_ASSIGNMENT_FOR_NON_GROUPS 0x08
65 #define CONFIG_OPTION_OPEN_BRACE_ON_SEPARATE_LINE     0x10
66 #define CONFIG_OPTION_ALLOW_SCIENTIFIC_NOTATION       0x20
67 #define CONFIG_OPTION_FSYNC                           0x40
68 
69 #define CONFIG_TRUE  (1)
70 #define CONFIG_FALSE (0)
71 
72 typedef union config_value_t
73 {
74   int ival;
75   long long llval;
76   double fval;
77   char *sval;
78   struct config_list_t *list;
79 } config_value_t;
80 
81 typedef struct config_setting_t
82 {
83   char *name;
84   short type;
85   short format;
86   config_value_t value;
87   struct config_setting_t *parent;
88   struct config_t *config;
89   void *hook;
90   unsigned int line;
91   const char *file;
92 } config_setting_t;
93 
94 typedef enum
95 {
96   CONFIG_ERR_NONE = 0,
97   CONFIG_ERR_FILE_IO = 1,
98   CONFIG_ERR_PARSE = 2
99 } config_error_t;
100 
101 typedef struct config_list_t
102 {
103   unsigned int length;
104   config_setting_t **elements;
105 } config_list_t;
106 
107 typedef const char ** (*config_include_fn_t)(struct config_t *,
108                                              const char *,
109                                              const char *,
110                                              const char **);
111 
112 typedef struct config_t
113 {
114   config_setting_t *root;
115   void (*destructor)(void *);
116   int options;
117   unsigned short tab_width;
118   unsigned short float_precision;
119   unsigned short default_format;
120   const char *include_dir;
121   config_include_fn_t include_fn;
122   const char *error_text;
123   const char *error_file;
124   int error_line;
125   config_error_t error_type;
126   const char **filenames;
127   void *hook;
128 } config_t;
129 
130 extern LIBCONFIG_API int config_read(config_t *config, FILE *stream);
131 extern LIBCONFIG_API void config_write(const config_t *config, FILE *stream);
132 
133 extern LIBCONFIG_API void config_set_default_format(config_t *config,
134                                                     short format);
135 
136 extern LIBCONFIG_API void config_set_options(config_t *config, int options);
137 extern LIBCONFIG_API int config_get_options(const config_t *config);
138 
139 extern LIBCONFIG_API void config_set_option(config_t *config, int option,
140                                             int flag);
141 extern LIBCONFIG_API int config_get_option(const config_t *config, int option);
142 
143 extern LIBCONFIG_API int config_read_string(config_t *config, const char *str);
144 
145 extern LIBCONFIG_API int config_read_file(config_t *config,
146                                           const char *filename);
147 extern LIBCONFIG_API int config_write_file(config_t *config,
148                                            const char *filename);
149 
150 extern LIBCONFIG_API void config_set_destructor(config_t *config,
151                                                 void (*destructor)(void *));
152 extern LIBCONFIG_API void config_set_include_dir(config_t *config,
153                                                  const char *include_dir);
154 extern LIBCONFIG_API void config_set_include_func(config_t *config,
155                                                   config_include_fn_t func);
156 
157 extern LIBCONFIG_API void config_set_float_precision(config_t *config,
158                                                      unsigned short digits);
159 extern LIBCONFIG_API unsigned short config_get_float_precision(
160   const config_t *config);
161 
162 extern LIBCONFIG_API void config_set_tab_width(config_t *config,
163                                                unsigned short width);
164 extern LIBCONFIG_API unsigned short config_get_tab_width(
165   const config_t *config);
166 
167 extern LIBCONFIG_API void config_set_hook(config_t *config, void *hook);
168 
169 #define config_get_hook(C) ((C)->hook)
170 
171 extern LIBCONFIG_API void config_init(config_t *config);
172 extern LIBCONFIG_API void config_destroy(config_t *config);
173 extern LIBCONFIG_API void config_clear(config_t *config);
174 
175 extern LIBCONFIG_API int config_setting_get_int(
176   const config_setting_t *setting);
177 extern LIBCONFIG_API long long config_setting_get_int64(
178   const config_setting_t *setting);
179 extern LIBCONFIG_API double config_setting_get_float(
180   const config_setting_t *setting);
181 extern LIBCONFIG_API int config_setting_get_bool(
182   const config_setting_t *setting);
183 extern LIBCONFIG_API const char *config_setting_get_string(
184   const config_setting_t *setting);
185 
186 extern LIBCONFIG_API int config_setting_lookup_int(
187   const config_setting_t *setting, const char *name, int *value);
188 extern LIBCONFIG_API int config_setting_lookup_int64(
189   const config_setting_t *setting, const char *name, long long *value);
190 extern LIBCONFIG_API int config_setting_lookup_float(
191   const config_setting_t *setting, const char *name, double *value);
192 extern LIBCONFIG_API int config_setting_lookup_bool(
193   const config_setting_t *setting, const char *name, int *value);
194 extern LIBCONFIG_API int config_setting_lookup_string(
195   const config_setting_t *setting, const char *name, const char **value);
196 
197 extern LIBCONFIG_API int config_setting_set_int(config_setting_t *setting,
198                                                 int value);
199 extern LIBCONFIG_API int config_setting_set_int64(config_setting_t *setting,
200                                                   long long value);
201 extern LIBCONFIG_API int config_setting_set_float(config_setting_t *setting,
202                                                   double value);
203 extern LIBCONFIG_API int config_setting_set_bool(config_setting_t *setting,
204                                                  int value);
205 extern LIBCONFIG_API int config_setting_set_string(config_setting_t *setting,
206                                                    const char *value);
207 
208 extern LIBCONFIG_API int config_setting_set_format(config_setting_t *setting,
209                                                    short format);
210 extern LIBCONFIG_API short config_setting_get_format(
211   const config_setting_t *setting);
212 
213 extern LIBCONFIG_API int config_setting_get_int_elem(
214   const config_setting_t *setting, int idx);
215 extern LIBCONFIG_API long long config_setting_get_int64_elem(
216   const config_setting_t *setting, int idx);
217 extern LIBCONFIG_API double config_setting_get_float_elem(
218   const config_setting_t *setting, int idx);
219 extern LIBCONFIG_API int config_setting_get_bool_elem(
220   const config_setting_t *setting, int idx);
221 extern LIBCONFIG_API const char *config_setting_get_string_elem(
222   const config_setting_t *setting, int idx);
223 
224 extern LIBCONFIG_API config_setting_t *config_setting_set_int_elem(
225   config_setting_t *setting, int idx, int value);
226 extern LIBCONFIG_API config_setting_t *config_setting_set_int64_elem(
227   config_setting_t *setting, int idx, long long value);
228 extern LIBCONFIG_API config_setting_t *config_setting_set_float_elem(
229   config_setting_t *setting, int idx, double value);
230 extern LIBCONFIG_API config_setting_t *config_setting_set_bool_elem(
231   config_setting_t *setting, int idx, int value);
232 extern LIBCONFIG_API config_setting_t *config_setting_set_string_elem(
233   config_setting_t *setting, int idx, const char *value);
234 
235 extern LIBCONFIG_API const char **config_default_include_func(
236     config_t *config, const char *include_dir, const char *path,
237     const char **error);
238 
239 extern LIBCONFIG_API int config_setting_is_scalar(
240     const config_setting_t *setting);
241 
242 extern LIBCONFIG_API int config_setting_is_aggregate(
243     const config_setting_t *setting);
244 
245 #define /* const char * */ config_get_include_dir(/* const config_t * */ C) \
246   ((C)->include_dir)
247 
248 #define /* void */ config_set_auto_convert(/* config_t * */ C, F) \
249   config_set_option((C), CONFIG_OPTION_AUTOCONVERT, (F))
250 #define /* int */ config_get_auto_convert(/* const config_t * */ C) \
251   config_get_option((C), CONFIG_OPTION_AUTOCONVERT)
252 
253 #define /* int */ config_setting_type(/* const config_setting_t * */ S) \
254   ((S)->type)
255 
256 #define /* int */ config_setting_is_group(/* const config_setting_t * */ S) \
257   ((S)->type == CONFIG_TYPE_GROUP)
258 #define /* int */ config_setting_is_array(/* const config_setting_t * */ S) \
259   ((S)->type == CONFIG_TYPE_ARRAY)
260 #define /* int */ config_setting_is_list(/* const config_setting_t * */ S) \
261   ((S)->type == CONFIG_TYPE_LIST)
262 
263 #define /* int */ config_setting_is_number(/* const config_setting_t * */ S) \
264   (((S)->type == CONFIG_TYPE_INT)                                       \
265    || ((S)->type == CONFIG_TYPE_INT64)                                  \
266    || ((S)->type == CONFIG_TYPE_FLOAT))
267 
268 #define /* const char * */ config_setting_name( \
269   /* const config_setting_t * */ S)             \
270   ((S)->name)
271 
272 #define /* config_setting_t * */ config_setting_parent( \
273   /* const config_setting_t * */ S)                     \
274   ((S)->parent)
275 
276 #define /* int */ config_setting_is_root(       \
277   /* const config_setting_t * */ S)             \
278   ((S)->parent ? CONFIG_FALSE : CONFIG_TRUE)
279 
280 extern LIBCONFIG_API int config_setting_index(const config_setting_t *setting);
281 
282 extern LIBCONFIG_API int config_setting_length(
283   const config_setting_t *setting);
284 extern LIBCONFIG_API config_setting_t *config_setting_get_elem(
285   const config_setting_t *setting, unsigned int idx);
286 
287 extern LIBCONFIG_API config_setting_t *config_setting_get_member(
288   const config_setting_t *setting, const char *name);
289 
290 extern LIBCONFIG_API config_setting_t *config_setting_add(
291   config_setting_t *parent, const char *name, int type);
292 extern LIBCONFIG_API int config_setting_remove(config_setting_t *parent,
293                                                const char *name);
294 extern LIBCONFIG_API int config_setting_remove_elem(config_setting_t *parent,
295                                                     unsigned int idx);
296 extern LIBCONFIG_API void config_setting_set_hook(config_setting_t *setting,
297                                                   void *hook);
298 
299 #define config_setting_get_hook(S) ((S)->hook)
300 
301 extern LIBCONFIG_API config_setting_t *config_lookup(const config_t *config,
302                                                      const char *path);
303 extern LIBCONFIG_API config_setting_t *config_setting_lookup(
304   config_setting_t *setting, const char *path);
305 
306 extern LIBCONFIG_API int config_lookup_int(const config_t *config,
307                                            const char *path, int *value);
308 extern LIBCONFIG_API int config_lookup_int64(const config_t *config,
309                                              const char *path,
310                                              long long *value);
311 extern LIBCONFIG_API int config_lookup_float(const config_t *config,
312                                              const char *path, double *value);
313 extern LIBCONFIG_API int config_lookup_bool(const config_t *config,
314                                             const char *path, int *value);
315 extern LIBCONFIG_API int config_lookup_string(const config_t *config,
316                                               const char *path,
317                                               const char **value);
318 
319 #define /* config_setting_t * */ config_root_setting( \
320   /* const config_t * */ C)                           \
321   ((C)->root)
322 
323 #define  /* void */ config_set_default_format(/* config_t * */ C,       \
324                                               /* short */ F)            \
325   (C)->default_format = (F)
326 
327 #define /* short */ config_get_default_format(/* config_t * */ C)       \
328   ((C)->default_format)
329 
330 #define /* unsigned short */ config_setting_source_line(   \
331   /* const config_setting_t * */ S)                        \
332   ((S)->line)
333 
334 #define /* const char */ config_setting_source_file(    \
335   /* const config_setting_t * */ S)                     \
336   ((S)->file)
337 
338 #define /* const char * */ config_error_text(/* const config_t * */ C)  \
339   ((C)->error_text)
340 
341 #define /* const char * */ config_error_file(/* const config_t * */ C)  \
342   ((C)->error_file)
343 
344 #define /* int */ config_error_line(/* const config_t * */ C)   \
345   ((C)->error_line)
346 
347 #define /* config_error_t */ config_error_type(/* const config_t * */ C) \
348   ((C)->error_type)
349 
350 #ifdef __cplusplus
351 }
352 #endif /* __cplusplus */
353 
354 #endif /* __libconfig_h */
355