initial commit
[platform/upstream/libconfig.git] / lib / libconfig.h
1 /* ----------------------------------------------------------------------------
2    libconfig - A library for processing structured configuration files
3    Copyright (C) 2005-2010  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    4
44 #define LIBCONFIG_VER_REVISION 9
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
63 #define CONFIG_TRUE  (1)
64 #define CONFIG_FALSE (0)
65
66 typedef union config_value_t
67 {
68   int ival;
69   long long llval;
70   double fval;
71   char *sval;
72   struct config_list_t *list;
73 } config_value_t;
74
75 typedef struct config_setting_t
76 {
77   char *name;
78   short type;
79   short format;
80   config_value_t value;
81   struct config_setting_t *parent;
82   struct config_t *config;
83   void *hook;
84   unsigned int line;
85   const char *file;
86 } config_setting_t;
87
88 typedef enum
89 {
90   CONFIG_ERR_NONE = 0,
91   CONFIG_ERR_FILE_IO = 1,
92   CONFIG_ERR_PARSE = 2
93 } config_error_t;
94
95 typedef struct config_list_t
96 {
97   unsigned int length;
98   config_setting_t **elements;
99 } config_list_t;
100
101 typedef struct config_t
102 {
103   config_setting_t *root;
104   void (*destructor)(void *);
105   unsigned short flags;
106   unsigned short tab_width;
107   short default_format;
108   const char *include_dir;
109   const char *error_text;
110   const char *error_file;
111   int error_line;
112   config_error_t error_type;
113   const char **filenames;
114   unsigned int num_filenames;
115 } config_t;
116
117 extern LIBCONFIG_API int config_read(config_t *config, FILE *stream);
118 extern LIBCONFIG_API void config_write(const config_t *config, FILE *stream);
119
120 extern LIBCONFIG_API void config_set_default_format(config_t *config,
121                                                     short format);
122
123 extern LIBCONFIG_API void config_set_auto_convert(config_t *config, int flag);
124 extern LIBCONFIG_API int config_get_auto_convert(const config_t *config);
125
126 extern LIBCONFIG_API int config_read_string(config_t *config, const char *str);
127
128 extern LIBCONFIG_API int config_read_file(config_t *config,
129                                           const char *filename);
130 extern LIBCONFIG_API int config_write_file(config_t *config,
131                                            const char *filename);
132
133 extern LIBCONFIG_API void config_set_destructor(config_t *config,
134                                                 void (*destructor)(void *));
135 extern LIBCONFIG_API void config_set_include_dir(config_t *config,
136                                                  const char *include_dir);
137
138 extern LIBCONFIG_API void config_init(config_t *config);
139 extern LIBCONFIG_API void config_destroy(config_t *config);
140
141 extern LIBCONFIG_API int config_setting_get_int(
142   const config_setting_t *setting);
143 extern LIBCONFIG_API long long config_setting_get_int64(
144   const config_setting_t *setting);
145 extern LIBCONFIG_API double config_setting_get_float(
146   const config_setting_t *setting);
147 extern LIBCONFIG_API int config_setting_get_bool(
148   const config_setting_t *setting);
149 extern LIBCONFIG_API const char *config_setting_get_string(
150   const config_setting_t *setting);
151
152 extern LIBCONFIG_API int config_setting_lookup_int(
153   const config_setting_t *setting, const char *name, int *value);
154 extern LIBCONFIG_API int config_setting_lookup_int64(
155   const config_setting_t *setting, const char *name, long long *value);
156 extern LIBCONFIG_API int config_setting_lookup_float(
157   const config_setting_t *setting, const char *name, double *value);
158 extern LIBCONFIG_API int config_setting_lookup_bool(
159   const config_setting_t *setting, const char *name, int *value);
160 extern LIBCONFIG_API int config_setting_lookup_string(
161   const config_setting_t *setting, const char *name, const char **value);
162
163 extern LIBCONFIG_API int config_setting_set_int(config_setting_t *setting,
164                                                 int value);
165 extern LIBCONFIG_API int config_setting_set_int64(config_setting_t *setting,
166                                                   long long value);
167 extern LIBCONFIG_API int config_setting_set_float(config_setting_t *setting,
168                                                   double value);
169 extern LIBCONFIG_API int config_setting_set_bool(config_setting_t *setting,
170                                                  int value);
171 extern LIBCONFIG_API int config_setting_set_string(config_setting_t *setting,
172                                                    const char *value);
173
174 extern LIBCONFIG_API int config_setting_set_format(config_setting_t *setting,
175                                                    short format);
176 extern LIBCONFIG_API short config_setting_get_format(
177   const config_setting_t *setting);
178
179 extern LIBCONFIG_API int config_setting_get_int_elem(
180   const config_setting_t *setting, int idx);
181 extern LIBCONFIG_API long long config_setting_get_int64_elem(
182   const config_setting_t *setting, int idx);
183 extern LIBCONFIG_API double config_setting_get_float_elem(
184   const config_setting_t *setting, int idx);
185 extern LIBCONFIG_API int config_setting_get_bool_elem(
186   const config_setting_t *setting, int idx);
187 extern LIBCONFIG_API const char *config_setting_get_string_elem(
188   const config_setting_t *setting, int idx);
189
190 extern LIBCONFIG_API config_setting_t *config_setting_set_int_elem(
191   config_setting_t *setting, int idx, int value);
192 extern LIBCONFIG_API config_setting_t *config_setting_set_int64_elem(
193   config_setting_t *setting, int idx, long long value);
194 extern LIBCONFIG_API config_setting_t *config_setting_set_float_elem(
195   config_setting_t *setting, int idx, double value);
196 extern LIBCONFIG_API config_setting_t *config_setting_set_bool_elem(
197   config_setting_t *setting, int idx, int value);
198 extern LIBCONFIG_API config_setting_t *config_setting_set_string_elem(
199   config_setting_t *setting, int idx, const char *value);
200
201 #define /* const char * */ config_get_include_dir(/* const config_t * */ C) \
202   ((C)->include_dir)
203
204 #define /* int */ config_setting_type(/* const config_setting_t * */ S) \
205   ((S)->type)
206
207 #define /* int */ config_setting_is_group(/* const config_setting_t * */ S) \
208   ((S)->type == CONFIG_TYPE_GROUP)
209 #define /* int */ config_setting_is_array(/* const config_setting_t * */ S) \
210   ((S)->type == CONFIG_TYPE_ARRAY)
211 #define /* int */ config_setting_is_list(/* const config_setting_t * */ S) \
212   ((S)->type == CONFIG_TYPE_LIST)
213
214 #define /* int */ config_setting_is_aggregate( \
215   /* const config_setting_t * */ S)                                     \
216   (((S)->type == CONFIG_TYPE_GROUP) || ((S)->type == CONFIG_TYPE_LIST)  \
217    || ((S)->type == CONFIG_TYPE_ARRAY))
218
219 #define /* int */ config_setting_is_number(/* const config_setting_t * */ S) \
220   (((S)->type == CONFIG_TYPE_INT)                                       \
221    || ((S)->type == CONFIG_TYPE_INT64)                                  \
222    || ((S)->type == CONFIG_TYPE_FLOAT))
223
224 #define /* int */ config_setting_is_scalar(/* const config_setting_t * */ S) \
225   (((S)->type == CONFIG_TYPE_BOOL) || ((S)->type == CONFIG_TYPE_STRING) \
226    || config_setting_is_number(S))
227
228 #define /* const char * */ config_setting_name( \
229   /* const config_setting_t * */ S)             \
230   ((S)->name)
231
232 #define /* config_setting_t * */ config_setting_parent( \
233   /* const config_setting_t * */ S)                     \
234   ((S)->parent)
235
236 #define /* int */ config_setting_is_root(       \
237   /* const config_setting_t * */ S)             \
238   ((S)->parent ? CONFIG_FALSE : CONFIG_TRUE)
239
240 extern LIBCONFIG_API int config_setting_index(const config_setting_t *setting);
241
242 extern LIBCONFIG_API int config_setting_length(
243   const config_setting_t *setting);
244 extern LIBCONFIG_API config_setting_t *config_setting_get_elem(
245   const config_setting_t *setting, unsigned int idx);
246
247 extern LIBCONFIG_API config_setting_t *config_setting_get_member(
248   const config_setting_t *setting, const char *name);
249
250 extern LIBCONFIG_API config_setting_t *config_setting_add(
251   config_setting_t *parent, const char *name, int type);
252 extern LIBCONFIG_API int config_setting_remove(config_setting_t *parent,
253                                                const char *name);
254 extern LIBCONFIG_API int config_setting_remove_elem(config_setting_t *parent,
255                                                     unsigned int idx);
256 extern LIBCONFIG_API void config_setting_set_hook(config_setting_t *setting,
257                                                   void *hook);
258
259 #define config_setting_get_hook(S) ((S)->hook)
260
261 extern LIBCONFIG_API config_setting_t *config_lookup(const config_t *config,
262                                                      const char *path);
263 extern LIBCONFIG_API config_setting_t *config_lookup_from(
264   config_setting_t *setting, const char *path);
265
266 extern LIBCONFIG_API int config_lookup_int(const config_t *config,
267                                            const char *path, int *value);
268 extern LIBCONFIG_API int config_lookup_int64(const config_t *config,
269                                              const char *path,
270                                              long long *value);
271 extern LIBCONFIG_API int config_lookup_float(const config_t *config,
272                                              const char *path, double *value);
273 extern LIBCONFIG_API int config_lookup_bool(const config_t *config,
274                                             const char *path, int *value);
275 extern LIBCONFIG_API int config_lookup_string(const config_t *config,
276                                               const char *path,
277                                               const char **value);
278
279 #define /* config_setting_t * */ config_root_setting( \
280   /* const config_t * */ C)                           \
281   ((C)->root)
282
283 #define  /* void */ config_set_default_format(/* config_t * */ C,       \
284                                               /* short */ F)            \
285   (C)->default_format = (F)
286
287 #define /* short */ config_get_default_format(/* config_t * */ C)       \
288   ((C)->default_format)
289
290 #define /* void */ config_set_tab_width(/* config_t * */ C,     \
291                                         /* unsigned short */ W) \
292   (C)->tab_width = ((W) & 0x0F)
293
294 #define /* unsigned char */ config_get_tab_width(/* const config_t * */ C) \
295   ((C)->tab_width)
296
297 #define /* unsigned short */ config_setting_source_line(   \
298   /* const config_setting_t * */ S)                        \
299   ((S)->line)
300
301 #define /* const char */ config_setting_source_file(    \
302   /* const config_setting_t * */ S)                     \
303   ((S)->file)
304
305 #define /* const char * */ config_error_text(/* const config_t * */ C)  \
306   ((C)->error_text)
307
308 #define /* const char * */ config_error_file(/* const config_t * */ C)  \
309   ((C)->error_file)
310
311 #define /* int */ config_error_line(/* const config_t * */ C)   \
312   ((C)->error_line)
313
314 #define /* config_error_t */ config_error_type(/* const config_t * */ C) \
315   ((C)->error_type)
316
317 #ifdef __cplusplus
318 }
319 #endif /* __cplusplus */
320
321 #endif /* __libconfig_h */