diff options
author | Trojal <trojal@gmail.com> | 2013-01-10 20:09:39 -0800 |
---|---|---|
committer | shennetsind <ind@henn.et> | 2013-01-12 05:56:35 -0200 |
commit | c55855fcf627478f864c0f82a1a2f201fd407a38 (patch) | |
tree | b7f6d11b2058248d026f2d9944e8f4b6ac288d50 /src/common/conf.c | |
parent | 51bfeb38eb139e97e0e1c096c85c15fba234f35b (diff) | |
parent | 38e583df21eccd9e4f31d38acaae32579c6f0d27 (diff) | |
download | hercules-c55855fcf627478f864c0f82a1a2f201fd407a38.tar.gz hercules-c55855fcf627478f864c0f82a1a2f201fd407a38.tar.bz2 hercules-c55855fcf627478f864c0f82a1a2f201fd407a38.tar.xz hercules-c55855fcf627478f864c0f82a1a2f201fd407a38.zip |
Test1, testing for the commit widget, need to edit something.
Test2, testing for the commit widget, need to edit something.
Signed-off-by: shennetsind <ind@henn.et>
Diffstat (limited to 'src/common/conf.c')
-rw-r--r-- | src/common/conf.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/common/conf.c b/src/common/conf.c new file mode 100644 index 000000000..3057bd4dc --- /dev/null +++ b/src/common/conf.c @@ -0,0 +1,109 @@ +// Copyright (c) Athena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "conf.h" +#include "libconfig.h" + +#include "../common/showmsg.h" // ShowError + +int conf_read_file(config_t *config, const char *config_filename) +{ + config_init(config); + if (!config_read_file(config, config_filename)) { + ShowError("%s:%d - %s\n", config_error_file(config), + config_error_line(config), config_error_text(config)); + config_destroy(config); + return 1; + } + return 0; +} + +// +// Functions to copy settings from libconfig/contrib +// +static void config_setting_copy_simple(config_setting_t *parent, const config_setting_t *src); +static void config_setting_copy_elem(config_setting_t *parent, const config_setting_t *src); +static void config_setting_copy_aggregate(config_setting_t *parent, const config_setting_t *src); +int config_setting_copy(config_setting_t *parent, const config_setting_t *src); + +void config_setting_copy_simple(config_setting_t *parent, const config_setting_t *src) +{ + if (config_setting_is_aggregate(src)) { + config_setting_copy_aggregate(parent, src); + } + else { + config_setting_t *set = config_setting_add(parent, config_setting_name(src), config_setting_type(src)); + + if (set == NULL) + return; + + if (CONFIG_TYPE_INT == config_setting_type(src)) { + config_setting_set_int(set, config_setting_get_int(src)); + config_setting_set_format(set, src->format); + } else if (CONFIG_TYPE_INT64 == config_setting_type(src)) { + config_setting_set_int64(set, config_setting_get_int64(src)); + config_setting_set_format(set, src->format); + } else if (CONFIG_TYPE_FLOAT == config_setting_type(src)) { + config_setting_set_float(set, config_setting_get_float(src)); + } else if (CONFIG_TYPE_STRING == config_setting_type(src)) { + config_setting_set_string(set, config_setting_get_string(src)); + } else if (CONFIG_TYPE_BOOL == config_setting_type(src)) { + config_setting_set_bool(set, config_setting_get_bool(src)); + } + } +} + +void config_setting_copy_elem(config_setting_t *parent, const config_setting_t *src) +{ + config_setting_t *set = NULL; + + if (config_setting_is_aggregate(src)) + config_setting_copy_aggregate(parent, src); + else if (CONFIG_TYPE_INT == config_setting_type(src)) { + set = config_setting_set_int_elem(parent, -1, config_setting_get_int(src)); + config_setting_set_format(set, src->format); + } else if (CONFIG_TYPE_INT64 == config_setting_type(src)) { + set = config_setting_set_int64_elem(parent, -1, config_setting_get_int64(src)); + config_setting_set_format(set, src->format); + } else if (CONFIG_TYPE_FLOAT == config_setting_type(src)) { + config_setting_set_float_elem(parent, -1, config_setting_get_float(src)); + } else if (CONFIG_TYPE_STRING == config_setting_type(src)) { + config_setting_set_string_elem(parent, -1, config_setting_get_string(src)); + } else if (CONFIG_TYPE_BOOL == config_setting_type(src)) { + config_setting_set_bool_elem(parent, -1, config_setting_get_bool(src)); + } +} + +void config_setting_copy_aggregate(config_setting_t *parent, const config_setting_t *src) +{ + config_setting_t *newAgg; + int i, n; + + newAgg = config_setting_add(parent, config_setting_name(src), config_setting_type(src)); + + if (newAgg == NULL) + return; + + n = config_setting_length(src); + + for (i = 0; i < n; i++) { + if (config_setting_is_group(src)) { + config_setting_copy_simple(newAgg, config_setting_get_elem(src, i)); + } else { + config_setting_copy_elem(newAgg, config_setting_get_elem(src, i)); + } + } +} + +int config_setting_copy(config_setting_t *parent, const config_setting_t *src) +{ + if (!config_setting_is_group(parent) && !config_setting_is_list(parent)) + return CONFIG_FALSE; + + if (config_setting_is_aggregate(src)) { + config_setting_copy_aggregate(parent, src); + } else { + config_setting_copy_simple(parent, src); + } + return CONFIG_TRUE; +} |