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