xbot/include/libconfig-1.7.3/contrib/copy_setting.c

162 lines
5.2 KiB
C
Raw Permalink Normal View History

2024-02-13 07:22:10 +00:00
void config_setting_copy_simple(config_setting_t * parent, const config_setting_t * src);
void config_setting_copy_elem(config_setting_t * parent, const config_setting_t * src);
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;
set = config_setting_add(parent, config_setting_name(src), config_setting_type(src));
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;
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))
set = config_setting_set_float_elem(parent, -1, config_setting_get_float(src));
else if(CONFIG_TYPE_STRING == config_setting_type(src))
set = config_setting_set_string_elem(parent, -1, config_setting_get_string(src));
else if(CONFIG_TYPE_BOOL == config_setting_type(src))
set = 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));
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;
}
//Some sample code
//-----------------------------------------------------------------------------
int main(int argc, char *argv[])
//-----------------------------------------------------------------------------
{
config_t cfgSrc;
config_t cfgSrcCopy;
config_t cfgDst;
config_init(&cfgSrc);
config_init(&cfgSrcCopy);
config_init(&cfgDst);
if(CONFIG_FALSE == config_read_file(&cfgSrc, "/data/menu/cfgSrc.cfg"))
{
fprintf(stderr, "Failed to open cfgSrc.cfg\n");
}
if(CONFIG_FALSE == config_read_file(&cfgDst, "/data/menu/cfgDst.cfg"))
{
fprintf(stderr, "Failed to open cfgDst.cfg\n");
}
/*
printf("Dump cfgSrc.cfg\n");
DumpCfgSetting(config_root_setting(&cfgSrc));
printf("Dump cfgDst.cfg\n");
DumpCfgSetting(config_root_setting(&cfgDst));
*/
config_setting_t * src;
config_setting_t * dst;
dst = config_lookup(&cfgDst, "grp1");
if((0 != (dst = config_lookup(&cfgDst, "grp1"))) &&
(0 != (src = config_lookup(&cfgSrc, "application.window"))))
//(0 != (src = config_lookup(&cfgSrc, "list"))))
{
if(CONFIG_FALSE == config_setting_copy(dst, src))
{
printf("Failed to copy src to dst\n");
}
}
config_setting_copy(config_root_setting(&cfgSrcCopy), config_root_setting(&cfgSrc));
config_write_file(&cfgDst, "/data/menu/cfgDstMod.cfg");
config_write_file(&cfgSrcCopy, "/data/menu/cfgSrcCpy.cfg");
config_write_file(&cfgSrc, "/data/menu/cfgSrcOrig.cfg");
config_destroy(&cfgSrc);
config_destroy(&cfgDst);
return 0;
}