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