00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef __libconfig_h
00024 #define __libconfig_h
00025
00026 #ifdef __cplusplus
00027 extern "C" {
00028 #endif
00029
00030 #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
00031 #if defined(LIBCONFIG_STATIC)
00032 #define LIBCONFIG_API
00033 #elif defined(LIBCONFIG_EXPORTS)
00034 #define LIBCONFIG_API __declspec(dllexport)
00035 #else
00036 #define LIBCONFIG_API __declspec(dllimport)
00037 #endif
00038 #else
00039 #define LIBCONFIG_API
00040 #endif
00041
00042 #include <stdio.h>
00043
00044 #define CONFIG_TYPE_NONE 0
00045 #define CONFIG_TYPE_GROUP 1
00046 #define CONFIG_TYPE_INT 2
00047 #define CONFIG_TYPE_INT64 3
00048 #define CONFIG_TYPE_FLOAT 4
00049 #define CONFIG_TYPE_STRING 5
00050 #define CONFIG_TYPE_BOOL 6
00051 #define CONFIG_TYPE_ARRAY 7
00052 #define CONFIG_TYPE_LIST 8
00053
00054 #define CONFIG_FORMAT_DEFAULT 0
00055 #define CONFIG_FORMAT_HEX 1
00056
00057 #define CONFIG_OPTION_AUTOCONVERT 0x01
00058
00059 #define CONFIG_TRUE (1)
00060 #define CONFIG_FALSE (0)
00061
00062 typedef union config_value_t
00063 {
00064 long ival;
00065 long long llval;
00066 double fval;
00067 char *sval;
00068 struct config_list_t *list;
00069 } config_value_t;
00070
00071 typedef struct config_setting_t
00072 {
00073 char *name;
00074 short type;
00075 short format;
00076 config_value_t value;
00077 struct config_setting_t *parent;
00078 struct config_t *config;
00079 void *hook;
00080 unsigned int line;
00081 } config_setting_t;
00082
00083 typedef struct config_list_t
00084 {
00085 unsigned int length;
00086 unsigned int capacity;
00087 config_setting_t **elements;
00088 } config_list_t;
00089
00090 typedef struct config_t
00091 {
00092 config_setting_t *root;
00093 void (*destructor)(void *);
00094 int flags;
00095 const char *error_text;
00096 int error_line;
00097 } config_t;
00098
00099 extern LIBCONFIG_API int config_read(config_t *config, FILE *stream);
00100 extern LIBCONFIG_API void config_write(const config_t *config, FILE *stream);
00101
00102 extern LIBCONFIG_API void config_set_auto_convert(config_t *config, int flag);
00103 extern LIBCONFIG_API int config_get_auto_convert(const config_t *config);
00104
00105 extern LIBCONFIG_API int config_read_file(config_t *config,
00106 const char *filename);
00107 extern LIBCONFIG_API int config_write_file(config_t *config,
00108 const char *filename);
00109
00110 extern LIBCONFIG_API void config_set_destructor(config_t *config,
00111 void (*destructor)(void *));
00112
00113 extern LIBCONFIG_API void config_init(config_t *config);
00114 extern LIBCONFIG_API void config_destroy(config_t *config);
00115
00116 extern LIBCONFIG_API long config_setting_get_int(
00117 const config_setting_t *setting);
00118 extern LIBCONFIG_API long long config_setting_get_int64(
00119 const config_setting_t *setting);
00120 extern LIBCONFIG_API double config_setting_get_float(
00121 const config_setting_t *setting);
00122 extern LIBCONFIG_API int config_setting_get_bool(
00123 const config_setting_t *setting);
00124 extern LIBCONFIG_API const char *config_setting_get_string(
00125 const config_setting_t *setting);
00126
00127 extern LIBCONFIG_API int config_setting_lookup_int(
00128 const config_setting_t *setting, const char *name, long *value);
00129 extern LIBCONFIG_API int config_setting_lookup_int64(
00130 const config_setting_t *setting, const char *name, long long *value);
00131 extern LIBCONFIG_API int config_setting_lookup_float(
00132 const config_setting_t *setting, const char *name, double *value);
00133 extern LIBCONFIG_API int config_setting_lookup_bool(
00134 const config_setting_t *setting, const char *name, int *value);
00135 extern LIBCONFIG_API int config_setting_lookup_string(
00136 const config_setting_t *setting, const char *name, const char **value);
00137
00138 extern LIBCONFIG_API int config_setting_set_int(config_setting_t *setting,
00139 long value);
00140 extern LIBCONFIG_API int config_setting_set_int64(config_setting_t *setting,
00141 long long value);
00142 extern LIBCONFIG_API int config_setting_set_float(config_setting_t *setting,
00143 double value);
00144 extern LIBCONFIG_API int config_setting_set_bool(config_setting_t *setting,
00145 int value);
00146 extern LIBCONFIG_API int config_setting_set_string(config_setting_t *setting,
00147 const char *value);
00148
00149 extern LIBCONFIG_API int config_setting_set_format(config_setting_t *setting,
00150 short format);
00151 extern LIBCONFIG_API short config_setting_get_format(config_setting_t *setting);
00152
00153 extern LIBCONFIG_API long config_setting_get_int_elem(
00154 const config_setting_t *setting, int idx);
00155 extern LIBCONFIG_API long long config_setting_get_int64_elem(
00156 const config_setting_t *setting, int idx);
00157 extern LIBCONFIG_API double config_setting_get_float_elem(
00158 const config_setting_t *setting, int idx);
00159 extern LIBCONFIG_API int config_setting_get_bool_elem(
00160 const config_setting_t *setting, int idx);
00161 extern LIBCONFIG_API const char *config_setting_get_string_elem(
00162 const config_setting_t *setting, int idx);
00163
00164 extern LIBCONFIG_API config_setting_t *config_setting_set_int_elem(
00165 config_setting_t *setting, int idx, long value);
00166 extern LIBCONFIG_API config_setting_t *config_setting_set_int64_elem(
00167 config_setting_t *setting, int idx, long long value);
00168 extern LIBCONFIG_API config_setting_t *config_setting_set_float_elem(
00169 config_setting_t *setting, int idx, double value);
00170 extern LIBCONFIG_API config_setting_t *config_setting_set_bool_elem(
00171 config_setting_t *setting, int idx, int value);
00172 extern LIBCONFIG_API config_setting_t *config_setting_set_string_elem(
00173 config_setting_t *setting, int idx, const char *value);
00174
00175 #define config_setting_type( S) \
00176 ((S)->type)
00177
00178 #define config_setting_is_group( S) \
00179 ((S)->type == CONFIG_TYPE_GROUP)
00180 #define config_setting_is_array( S) \
00181 ((S)->type == CONFIG_TYPE_ARRAY)
00182 #define config_setting_is_list( S) \
00183 ((S)->type == CONFIG_TYPE_LIST)
00184
00185 #define config_setting_is_aggregate( \
00186 S) \
00187 (((S)->type == CONFIG_TYPE_GROUP) || ((S)->type == CONFIG_TYPE_LIST) \
00188 || ((S)->type == CONFIG_TYPE_ARRAY))
00189
00190 #define config_setting_is_number( S) \
00191 (((S)->type == CONFIG_TYPE_INT) \
00192 || ((S)->type == CONFIG_TYPE_INT64) \
00193 || ((S)->type == CONFIG_TYPE_FLOAT))
00194
00195 #define config_setting_is_scalar( S) \
00196 (((S)->type == CONFIG_TYPE_BOOL) || ((S)->type == CONFIG_TYPE_STRING) \
00197 || config_setting_is_number(S))
00198
00199 #define config_setting_name( \
00200 S) \
00201 ((S)->name)
00202
00203 #define config_setting_parent( \
00204 S) \
00205 ((S)->parent)
00206
00207 #define config_setting_is_root( \
00208 S) \
00209 ((S)->parent ? CONFIG_FALSE : CONFIG_TRUE)
00210
00211 extern LIBCONFIG_API int config_setting_index(const config_setting_t *setting);
00212
00213 extern LIBCONFIG_API int config_setting_length(
00214 const config_setting_t *setting);
00215 extern LIBCONFIG_API config_setting_t *config_setting_get_elem(
00216 const config_setting_t *setting, unsigned int idx);
00217
00218 extern LIBCONFIG_API config_setting_t *config_setting_get_member(
00219 const config_setting_t *setting, const char *name);
00220
00221 extern LIBCONFIG_API config_setting_t *config_setting_add(
00222 config_setting_t *parent, const char *name, int type);
00223 extern LIBCONFIG_API int config_setting_remove(config_setting_t *parent,
00224 const char *name);
00225 extern LIBCONFIG_API int config_setting_remove_elem(config_setting_t *parent,
00226 unsigned int idx);
00227 extern LIBCONFIG_API void config_setting_set_hook(config_setting_t *setting,
00228 void *hook);
00229
00230 #define config_setting_get_hook(S) ((S)->hook)
00231
00232 extern LIBCONFIG_API config_setting_t *config_lookup(const config_t *config,
00233 const char *path);
00234
00235 extern LIBCONFIG_API int config_lookup_int(const config_t *config,
00236 const char *path, long *value);
00237 extern LIBCONFIG_API int config_lookup_int64(const config_t *config,
00238 const char *path,
00239 long long *value);
00240 extern LIBCONFIG_API int config_lookup_float(const config_t *config,
00241 const char *path, double *value);
00242 extern LIBCONFIG_API int config_lookup_bool(const config_t *config,
00243 const char *path, int *value);
00244 extern LIBCONFIG_API int config_lookup_string(const config_t *config,
00245 const char *path,
00246 const char **value);
00247
00248 #define config_root_setting( \
00249 C) \
00250 ((C)->root)
00251
00252 #define config_setting_source_line( \
00253 C) \
00254 ((C)->line)
00255
00256 #define config_error_text( C) \
00257 ((C)->error_text)
00258
00259 #define config_error_line( C) \
00260 ((C)->error_line)
00261
00262 #ifdef __cplusplus
00263 }
00264 #endif
00265
00266 #endif