libconfig.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. /* ----------------------------------------------------------------------------
  2. libconfig - A library for processing structured configuration files
  3. Copyright (C) 2005-2010 Mark A Lindner
  4. This file is part of libconfig.
  5. This library is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation, either version 3 of the License, or
  8. (at your option) any later version.
  9. This library is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this library. If not, see <http://www.gnu.org/licenses/>.
  15. ----------------------------------------------------------------------------
  16. */
  17. #ifndef __libconfig_h
  18. #define __libconfig_h
  19. #ifdef __cplusplus
  20. extern "C" {
  21. #endif /* __cplusplus */
  22. #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
  23. #if defined(LIBCONFIG_STATIC)
  24. #define LIBCONFIG_API
  25. #elif defined(LIBCONFIG_EXPORTS)
  26. #define LIBCONFIG_API __declspec(dllexport)
  27. #else /* ! LIBCONFIG_EXPORTS */
  28. #define LIBCONFIG_API __declspec(dllimport)
  29. #endif /* LIBCONFIG_STATIC */
  30. #else /* ! WIN32 */
  31. #define LIBCONFIG_API
  32. #endif /* WIN32 */
  33. #define LIBCONFIG_VER_MAJOR 1
  34. #define LIBCONFIG_VER_MINOR 4
  35. #define LIBCONFIG_VER_REVISION 8
  36. #include <stdio.h>
  37. #define CONFIG_TYPE_NONE 0
  38. #define CONFIG_TYPE_GROUP 1
  39. #define CONFIG_TYPE_INT 2
  40. #define CONFIG_TYPE_INT64 3
  41. #define CONFIG_TYPE_FLOAT 4
  42. #define CONFIG_TYPE_STRING 5
  43. #define CONFIG_TYPE_BOOL 6
  44. #define CONFIG_TYPE_ARRAY 7
  45. #define CONFIG_TYPE_LIST 8
  46. #define CONFIG_FORMAT_DEFAULT 0
  47. #define CONFIG_FORMAT_HEX 1
  48. #define CONFIG_OPTION_AUTOCONVERT 0x01
  49. #define CONFIG_TRUE (1)
  50. #define CONFIG_FALSE (0)
  51. typedef union config_value_t
  52. {
  53. int ival;
  54. long long llval;
  55. double fval;
  56. char *sval;
  57. struct config_list_t *list;
  58. } config_value_t;
  59. typedef struct config_setting_t
  60. {
  61. char *name;
  62. short type;
  63. short format;
  64. config_value_t value;
  65. struct config_setting_t *parent;
  66. struct config_t *config;
  67. void *hook;
  68. unsigned int line;
  69. const char *file;
  70. } config_setting_t;
  71. typedef enum
  72. {
  73. CONFIG_ERR_NONE = 0,
  74. CONFIG_ERR_FILE_IO = 1,
  75. CONFIG_ERR_PARSE = 2
  76. } config_error_t;
  77. typedef struct config_list_t
  78. {
  79. unsigned int length;
  80. config_setting_t **elements;
  81. } config_list_t;
  82. typedef struct config_t
  83. {
  84. config_setting_t *root;
  85. void (*destructor)(void *);
  86. unsigned short flags;
  87. unsigned short tab_width;
  88. short default_format;
  89. const char *include_dir;
  90. const char *error_text;
  91. const char *error_file;
  92. int error_line;
  93. config_error_t error_type;
  94. const char **filenames;
  95. unsigned int num_filenames;
  96. } config_t;
  97. extern LIBCONFIG_API int config_read(config_t *config, FILE *stream);
  98. extern LIBCONFIG_API void config_write(const config_t *config, FILE *stream);
  99. extern LIBCONFIG_API void config_set_default_format(config_t *config,
  100. short format);
  101. extern LIBCONFIG_API void config_set_auto_convert(config_t *config, int flag);
  102. extern LIBCONFIG_API int config_get_auto_convert(const config_t *config);
  103. extern LIBCONFIG_API int config_read_string(config_t *config, const char *str);
  104. extern LIBCONFIG_API int config_read_file(config_t *config,
  105. const char *filename);
  106. extern LIBCONFIG_API int config_write_file(config_t *config,
  107. const char *filename);
  108. extern LIBCONFIG_API void config_set_destructor(config_t *config,
  109. void (*destructor)(void *));
  110. extern LIBCONFIG_API void config_set_include_dir(config_t *config,
  111. const char *include_dir);
  112. extern LIBCONFIG_API void config_init(config_t *config);
  113. extern LIBCONFIG_API void config_destroy(config_t *config);
  114. extern LIBCONFIG_API int config_setting_get_int(
  115. const config_setting_t *setting);
  116. extern LIBCONFIG_API long long config_setting_get_int64(
  117. const config_setting_t *setting);
  118. extern LIBCONFIG_API double config_setting_get_float(
  119. const config_setting_t *setting);
  120. extern LIBCONFIG_API int config_setting_get_bool(
  121. const config_setting_t *setting);
  122. extern LIBCONFIG_API const char *config_setting_get_string(
  123. const config_setting_t *setting);
  124. extern LIBCONFIG_API int config_setting_lookup_int(
  125. const config_setting_t *setting, const char *name, int *value);
  126. extern LIBCONFIG_API int config_setting_lookup_int64(
  127. const config_setting_t *setting, const char *name, long long *value);
  128. extern LIBCONFIG_API int config_setting_lookup_float(
  129. const config_setting_t *setting, const char *name, double *value);
  130. extern LIBCONFIG_API int config_setting_lookup_bool(
  131. const config_setting_t *setting, const char *name, int *value);
  132. extern LIBCONFIG_API int config_setting_lookup_string(
  133. const config_setting_t *setting, const char *name, const char **value);
  134. extern LIBCONFIG_API int config_setting_set_int(config_setting_t *setting,
  135. int value);
  136. extern LIBCONFIG_API int config_setting_set_int64(config_setting_t *setting,
  137. long long value);
  138. extern LIBCONFIG_API int config_setting_set_float(config_setting_t *setting,
  139. double value);
  140. extern LIBCONFIG_API int config_setting_set_bool(config_setting_t *setting,
  141. int value);
  142. extern LIBCONFIG_API int config_setting_set_string(config_setting_t *setting,
  143. const char *value);
  144. extern LIBCONFIG_API int config_setting_set_format(config_setting_t *setting,
  145. short format);
  146. extern LIBCONFIG_API short config_setting_get_format(
  147. const config_setting_t *setting);
  148. extern LIBCONFIG_API int config_setting_get_int_elem(
  149. const config_setting_t *setting, int idx);
  150. extern LIBCONFIG_API long long config_setting_get_int64_elem(
  151. const config_setting_t *setting, int idx);
  152. extern LIBCONFIG_API double config_setting_get_float_elem(
  153. const config_setting_t *setting, int idx);
  154. extern LIBCONFIG_API int config_setting_get_bool_elem(
  155. const config_setting_t *setting, int idx);
  156. extern LIBCONFIG_API const char *config_setting_get_string_elem(
  157. const config_setting_t *setting, int idx);
  158. extern LIBCONFIG_API config_setting_t *config_setting_set_int_elem(
  159. config_setting_t *setting, int idx, int value);
  160. extern LIBCONFIG_API config_setting_t *config_setting_set_int64_elem(
  161. config_setting_t *setting, int idx, long long value);
  162. extern LIBCONFIG_API config_setting_t *config_setting_set_float_elem(
  163. config_setting_t *setting, int idx, double value);
  164. extern LIBCONFIG_API config_setting_t *config_setting_set_bool_elem(
  165. config_setting_t *setting, int idx, int value);
  166. extern LIBCONFIG_API config_setting_t *config_setting_set_string_elem(
  167. config_setting_t *setting, int idx, const char *value);
  168. #define /* const char * */ config_get_include_dir(/* const config_t * */ C) \
  169. ((C)->include_dir)
  170. #define /* int */ config_setting_type(/* const config_setting_t * */ S) \
  171. ((S)->type)
  172. #define /* int */ config_setting_is_group(/* const config_setting_t * */ S) \
  173. ((S)->type == CONFIG_TYPE_GROUP)
  174. #define /* int */ config_setting_is_array(/* const config_setting_t * */ S) \
  175. ((S)->type == CONFIG_TYPE_ARRAY)
  176. #define /* int */ config_setting_is_list(/* const config_setting_t * */ S) \
  177. ((S)->type == CONFIG_TYPE_LIST)
  178. #define /* int */ config_setting_is_aggregate( \
  179. /* const config_setting_t * */ S) \
  180. (((S)->type == CONFIG_TYPE_GROUP) || ((S)->type == CONFIG_TYPE_LIST) \
  181. || ((S)->type == CONFIG_TYPE_ARRAY))
  182. #define /* int */ config_setting_is_number(/* const config_setting_t * */ S) \
  183. (((S)->type == CONFIG_TYPE_INT) \
  184. || ((S)->type == CONFIG_TYPE_INT64) \
  185. || ((S)->type == CONFIG_TYPE_FLOAT))
  186. #define /* int */ config_setting_is_scalar(/* const config_setting_t * */ S) \
  187. (((S)->type == CONFIG_TYPE_BOOL) || ((S)->type == CONFIG_TYPE_STRING) \
  188. || config_setting_is_number(S))
  189. #define /* const char * */ config_setting_name( \
  190. /* const config_setting_t * */ S) \
  191. ((S)->name)
  192. #define /* config_setting_t * */ config_setting_parent( \
  193. /* const config_setting_t * */ S) \
  194. ((S)->parent)
  195. #define /* int */ config_setting_is_root( \
  196. /* const config_setting_t * */ S) \
  197. ((S)->parent ? CONFIG_FALSE : CONFIG_TRUE)
  198. extern LIBCONFIG_API int config_setting_index(const config_setting_t *setting);
  199. extern LIBCONFIG_API int config_setting_length(
  200. const config_setting_t *setting);
  201. extern LIBCONFIG_API config_setting_t *config_setting_get_elem(
  202. const config_setting_t *setting, unsigned int idx);
  203. extern LIBCONFIG_API config_setting_t *config_setting_get_member(
  204. const config_setting_t *setting, const char *name);
  205. extern LIBCONFIG_API config_setting_t *config_setting_add(
  206. config_setting_t *parent, const char *name, int type);
  207. extern LIBCONFIG_API int config_setting_remove(config_setting_t *parent,
  208. const char *name);
  209. extern LIBCONFIG_API int config_setting_remove_elem(config_setting_t *parent,
  210. unsigned int idx);
  211. extern LIBCONFIG_API void config_setting_set_hook(config_setting_t *setting,
  212. void *hook);
  213. #define config_setting_get_hook(S) ((S)->hook)
  214. extern LIBCONFIG_API config_setting_t *config_lookup(const config_t *config,
  215. const char *path);
  216. extern LIBCONFIG_API config_setting_t *config_lookup_from(
  217. config_setting_t *setting, const char *path);
  218. extern LIBCONFIG_API int config_lookup_int(const config_t *config,
  219. const char *path, int *value);
  220. extern LIBCONFIG_API int config_lookup_int64(const config_t *config,
  221. const char *path,
  222. long long *value);
  223. extern LIBCONFIG_API int config_lookup_float(const config_t *config,
  224. const char *path, double *value);
  225. extern LIBCONFIG_API int config_lookup_bool(const config_t *config,
  226. const char *path, int *value);
  227. extern LIBCONFIG_API int config_lookup_string(const config_t *config,
  228. const char *path,
  229. const char **value);
  230. #define /* config_setting_t * */ config_root_setting( \
  231. /* const config_t * */ C) \
  232. ((C)->root)
  233. #define /* void */ config_set_default_format(/* config_t * */ C, \
  234. /* short */ F) \
  235. (C)->default_format = (F)
  236. #define /* short */ config_get_default_format(/* config_t * */ C) \
  237. ((C)->default_format)
  238. #define /* void */ config_set_tab_width(/* config_t * */ C, \
  239. /* unsigned short */ W) \
  240. (C)->tab_width = ((W) & 0x0F)
  241. #define /* unsigned char */ config_get_tab_width(/* const config_t * */ C) \
  242. ((C)->tab_width)
  243. #define /* unsigned short */ config_setting_source_line( \
  244. /* const config_setting_t * */ S) \
  245. ((S)->line)
  246. #define /* const char */ config_setting_source_file( \
  247. /* const config_setting_t * */ S) \
  248. ((S)->file)
  249. #define /* const char * */ config_error_text(/* const config_t * */ C) \
  250. ((C)->error_text)
  251. #define /* const char * */ config_error_file(/* const config_t * */ C) \
  252. ((C)->error_file)
  253. #define /* int */ config_error_line(/* const config_t * */ C) \
  254. ((C)->error_line)
  255. #define /* config_error_t */ config_error_type(/* const config_t * */ C) \
  256. ((C)->error_type)
  257. #ifdef __cplusplus
  258. }
  259. #endif /* __cplusplus */
  260. #endif /* __libconfig_h */