xref: /aosp_15_r20/external/libconfig/contrib/copy_setting.c (revision 2e9d491483b805f09ea864149eadd5680efcc72a)
1*2e9d4914SAndroid Build Coastguard Worker void config_setting_copy_simple(config_setting_t * parent, const config_setting_t * src);
2*2e9d4914SAndroid Build Coastguard Worker void config_setting_copy_elem(config_setting_t * parent, const config_setting_t * src);
3*2e9d4914SAndroid Build Coastguard Worker 
4*2e9d4914SAndroid Build Coastguard Worker void config_setting_copy_aggregate(config_setting_t * parent, const config_setting_t * src);
5*2e9d4914SAndroid Build Coastguard Worker int config_setting_copy(config_setting_t * parent, const config_setting_t * src);
6*2e9d4914SAndroid Build Coastguard Worker 
config_setting_copy_simple(config_setting_t * parent,const config_setting_t * src)7*2e9d4914SAndroid Build Coastguard Worker void config_setting_copy_simple(config_setting_t * parent, const config_setting_t * src)
8*2e9d4914SAndroid Build Coastguard Worker {
9*2e9d4914SAndroid Build Coastguard Worker     if(config_setting_is_aggregate(src))
10*2e9d4914SAndroid Build Coastguard Worker     {
11*2e9d4914SAndroid Build Coastguard Worker         config_setting_copy_aggregate(parent, src);
12*2e9d4914SAndroid Build Coastguard Worker     }
13*2e9d4914SAndroid Build Coastguard Worker     else
14*2e9d4914SAndroid Build Coastguard Worker     {
15*2e9d4914SAndroid Build Coastguard Worker         config_setting_t * set;
16*2e9d4914SAndroid Build Coastguard Worker 
17*2e9d4914SAndroid Build Coastguard Worker         set = config_setting_add(parent, config_setting_name(src), config_setting_type(src));
18*2e9d4914SAndroid Build Coastguard Worker 
19*2e9d4914SAndroid Build Coastguard Worker         if(CONFIG_TYPE_INT == config_setting_type(src))
20*2e9d4914SAndroid Build Coastguard Worker         {
21*2e9d4914SAndroid Build Coastguard Worker             config_setting_set_int(set, config_setting_get_int(src));
22*2e9d4914SAndroid Build Coastguard Worker             config_setting_set_format(set, src->format);
23*2e9d4914SAndroid Build Coastguard Worker         }
24*2e9d4914SAndroid Build Coastguard Worker         else if(CONFIG_TYPE_INT64 == config_setting_type(src))
25*2e9d4914SAndroid Build Coastguard Worker         {
26*2e9d4914SAndroid Build Coastguard Worker             config_setting_set_int64(set, config_setting_get_int64(src));
27*2e9d4914SAndroid Build Coastguard Worker             config_setting_set_format(set, src->format);
28*2e9d4914SAndroid Build Coastguard Worker         }
29*2e9d4914SAndroid Build Coastguard Worker         else if(CONFIG_TYPE_FLOAT == config_setting_type(src))
30*2e9d4914SAndroid Build Coastguard Worker             config_setting_set_float(set, config_setting_get_float(src));
31*2e9d4914SAndroid Build Coastguard Worker         else if(CONFIG_TYPE_STRING == config_setting_type(src))
32*2e9d4914SAndroid Build Coastguard Worker             config_setting_set_string(set, config_setting_get_string(src));
33*2e9d4914SAndroid Build Coastguard Worker         else if(CONFIG_TYPE_BOOL == config_setting_type(src))
34*2e9d4914SAndroid Build Coastguard Worker             config_setting_set_bool(set, config_setting_get_bool(src));
35*2e9d4914SAndroid Build Coastguard Worker     }
36*2e9d4914SAndroid Build Coastguard Worker }
37*2e9d4914SAndroid Build Coastguard Worker 
config_setting_copy_elem(config_setting_t * parent,const config_setting_t * src)38*2e9d4914SAndroid Build Coastguard Worker void config_setting_copy_elem(config_setting_t * parent, const config_setting_t * src)
39*2e9d4914SAndroid Build Coastguard Worker {
40*2e9d4914SAndroid Build Coastguard Worker     config_setting_t * set;
41*2e9d4914SAndroid Build Coastguard Worker 
42*2e9d4914SAndroid Build Coastguard Worker     set = NULL;
43*2e9d4914SAndroid Build Coastguard Worker     if(config_setting_is_aggregate(src))
44*2e9d4914SAndroid Build Coastguard Worker         config_setting_copy_aggregate(parent, src);
45*2e9d4914SAndroid Build Coastguard Worker     else if(CONFIG_TYPE_INT == config_setting_type(src))
46*2e9d4914SAndroid Build Coastguard Worker     {
47*2e9d4914SAndroid Build Coastguard Worker         set = config_setting_set_int_elem(parent, -1, config_setting_get_int(src));
48*2e9d4914SAndroid Build Coastguard Worker         config_setting_set_format(set, src->format);
49*2e9d4914SAndroid Build Coastguard Worker     }
50*2e9d4914SAndroid Build Coastguard Worker     else if(CONFIG_TYPE_INT64 == config_setting_type(src))
51*2e9d4914SAndroid Build Coastguard Worker     {
52*2e9d4914SAndroid Build Coastguard Worker         set = config_setting_set_int64_elem(parent, -1, config_setting_get_int64(src));
53*2e9d4914SAndroid Build Coastguard Worker         config_setting_set_format(set, src->format);
54*2e9d4914SAndroid Build Coastguard Worker     }
55*2e9d4914SAndroid Build Coastguard Worker     else if(CONFIG_TYPE_FLOAT == config_setting_type(src))
56*2e9d4914SAndroid Build Coastguard Worker         set = config_setting_set_float_elem(parent, -1, config_setting_get_float(src));
57*2e9d4914SAndroid Build Coastguard Worker     else if(CONFIG_TYPE_STRING == config_setting_type(src))
58*2e9d4914SAndroid Build Coastguard Worker         set = config_setting_set_string_elem(parent, -1, config_setting_get_string(src));
59*2e9d4914SAndroid Build Coastguard Worker     else if(CONFIG_TYPE_BOOL == config_setting_type(src))
60*2e9d4914SAndroid Build Coastguard Worker         set = config_setting_set_bool_elem(parent, -1, config_setting_get_bool(src));
61*2e9d4914SAndroid Build Coastguard Worker }
62*2e9d4914SAndroid Build Coastguard Worker 
config_setting_copy_aggregate(config_setting_t * parent,const config_setting_t * src)63*2e9d4914SAndroid Build Coastguard Worker void config_setting_copy_aggregate(config_setting_t * parent, const config_setting_t * src)
64*2e9d4914SAndroid Build Coastguard Worker {
65*2e9d4914SAndroid Build Coastguard Worker     config_setting_t * newAgg;
66*2e9d4914SAndroid Build Coastguard Worker     int i, n;
67*2e9d4914SAndroid Build Coastguard Worker 
68*2e9d4914SAndroid Build Coastguard Worker     newAgg = config_setting_add(parent, config_setting_name(src), config_setting_type(src));
69*2e9d4914SAndroid Build Coastguard Worker 
70*2e9d4914SAndroid Build Coastguard Worker     n = config_setting_length(src);
71*2e9d4914SAndroid Build Coastguard Worker     for(i = 0; i < n; i++)
72*2e9d4914SAndroid Build Coastguard Worker     {
73*2e9d4914SAndroid Build Coastguard Worker         if(config_setting_is_group(src))
74*2e9d4914SAndroid Build Coastguard Worker         {
75*2e9d4914SAndroid Build Coastguard Worker             config_setting_copy_simple(newAgg, config_setting_get_elem(src, i));
76*2e9d4914SAndroid Build Coastguard Worker         }
77*2e9d4914SAndroid Build Coastguard Worker         else
78*2e9d4914SAndroid Build Coastguard Worker         {
79*2e9d4914SAndroid Build Coastguard Worker             config_setting_copy_elem(newAgg, config_setting_get_elem(src, i));
80*2e9d4914SAndroid Build Coastguard Worker         }
81*2e9d4914SAndroid Build Coastguard Worker     }
82*2e9d4914SAndroid Build Coastguard Worker }
83*2e9d4914SAndroid Build Coastguard Worker 
config_setting_copy(config_setting_t * parent,const config_setting_t * src)84*2e9d4914SAndroid Build Coastguard Worker int config_setting_copy(config_setting_t * parent, const config_setting_t * src)
85*2e9d4914SAndroid Build Coastguard Worker {
86*2e9d4914SAndroid Build Coastguard Worker     if((!config_setting_is_group(parent)) &&
87*2e9d4914SAndroid Build Coastguard Worker        (!config_setting_is_list(parent)))
88*2e9d4914SAndroid Build Coastguard Worker         return CONFIG_FALSE;
89*2e9d4914SAndroid Build Coastguard Worker 
90*2e9d4914SAndroid Build Coastguard Worker     if(config_setting_is_aggregate(src))
91*2e9d4914SAndroid Build Coastguard Worker     {
92*2e9d4914SAndroid Build Coastguard Worker         config_setting_copy_aggregate(parent, src);
93*2e9d4914SAndroid Build Coastguard Worker     }
94*2e9d4914SAndroid Build Coastguard Worker     else
95*2e9d4914SAndroid Build Coastguard Worker     {
96*2e9d4914SAndroid Build Coastguard Worker         config_setting_copy_simple(parent, src);
97*2e9d4914SAndroid Build Coastguard Worker     }
98*2e9d4914SAndroid Build Coastguard Worker 
99*2e9d4914SAndroid Build Coastguard Worker     return CONFIG_TRUE;
100*2e9d4914SAndroid Build Coastguard Worker }
101*2e9d4914SAndroid Build Coastguard Worker 
102*2e9d4914SAndroid Build Coastguard Worker 
103*2e9d4914SAndroid Build Coastguard Worker //Some sample code
104*2e9d4914SAndroid Build Coastguard Worker 
105*2e9d4914SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
main(int argc,char * argv[])106*2e9d4914SAndroid Build Coastguard Worker int main(int argc, char *argv[])
107*2e9d4914SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
108*2e9d4914SAndroid Build Coastguard Worker {
109*2e9d4914SAndroid Build Coastguard Worker     config_t cfgSrc;
110*2e9d4914SAndroid Build Coastguard Worker     config_t cfgSrcCopy;
111*2e9d4914SAndroid Build Coastguard Worker     config_t cfgDst;
112*2e9d4914SAndroid Build Coastguard Worker 
113*2e9d4914SAndroid Build Coastguard Worker 
114*2e9d4914SAndroid Build Coastguard Worker     config_init(&cfgSrc);
115*2e9d4914SAndroid Build Coastguard Worker     config_init(&cfgSrcCopy);
116*2e9d4914SAndroid Build Coastguard Worker     config_init(&cfgDst);
117*2e9d4914SAndroid Build Coastguard Worker 
118*2e9d4914SAndroid Build Coastguard Worker     if(CONFIG_FALSE == config_read_file(&cfgSrc, "/data/menu/cfgSrc.cfg"))
119*2e9d4914SAndroid Build Coastguard Worker     {
120*2e9d4914SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to open cfgSrc.cfg\n");
121*2e9d4914SAndroid Build Coastguard Worker     }
122*2e9d4914SAndroid Build Coastguard Worker     if(CONFIG_FALSE == config_read_file(&cfgDst, "/data/menu/cfgDst.cfg"))
123*2e9d4914SAndroid Build Coastguard Worker     {
124*2e9d4914SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to open cfgDst.cfg\n");
125*2e9d4914SAndroid Build Coastguard Worker     }
126*2e9d4914SAndroid Build Coastguard Worker 
127*2e9d4914SAndroid Build Coastguard Worker     /*
128*2e9d4914SAndroid Build Coastguard Worker     printf("Dump cfgSrc.cfg\n");
129*2e9d4914SAndroid Build Coastguard Worker     DumpCfgSetting(config_root_setting(&cfgSrc));
130*2e9d4914SAndroid Build Coastguard Worker 
131*2e9d4914SAndroid Build Coastguard Worker     printf("Dump cfgDst.cfg\n");
132*2e9d4914SAndroid Build Coastguard Worker     DumpCfgSetting(config_root_setting(&cfgDst));
133*2e9d4914SAndroid Build Coastguard Worker     */
134*2e9d4914SAndroid Build Coastguard Worker 
135*2e9d4914SAndroid Build Coastguard Worker     config_setting_t * src;
136*2e9d4914SAndroid Build Coastguard Worker     config_setting_t * dst;
137*2e9d4914SAndroid Build Coastguard Worker 
138*2e9d4914SAndroid Build Coastguard Worker     dst = config_lookup(&cfgDst, "grp1");
139*2e9d4914SAndroid Build Coastguard Worker 
140*2e9d4914SAndroid Build Coastguard Worker     if((0 != (dst = config_lookup(&cfgDst, "grp1"))) &&
141*2e9d4914SAndroid Build Coastguard Worker        (0 != (src = config_lookup(&cfgSrc, "application.window"))))
142*2e9d4914SAndroid Build Coastguard Worker        //(0 != (src = config_lookup(&cfgSrc, "list"))))
143*2e9d4914SAndroid Build Coastguard Worker 
144*2e9d4914SAndroid Build Coastguard Worker     {
145*2e9d4914SAndroid Build Coastguard Worker         if(CONFIG_FALSE == config_setting_copy(dst, src))
146*2e9d4914SAndroid Build Coastguard Worker         {
147*2e9d4914SAndroid Build Coastguard Worker             printf("Failed to copy src to dst\n");
148*2e9d4914SAndroid Build Coastguard Worker         }
149*2e9d4914SAndroid Build Coastguard Worker     }
150*2e9d4914SAndroid Build Coastguard Worker 
151*2e9d4914SAndroid Build Coastguard Worker     config_setting_copy(config_root_setting(&cfgSrcCopy), config_root_setting(&cfgSrc));
152*2e9d4914SAndroid Build Coastguard Worker 
153*2e9d4914SAndroid Build Coastguard Worker     config_write_file(&cfgDst, "/data/menu/cfgDstMod.cfg");
154*2e9d4914SAndroid Build Coastguard Worker     config_write_file(&cfgSrcCopy, "/data/menu/cfgSrcCpy.cfg");
155*2e9d4914SAndroid Build Coastguard Worker     config_write_file(&cfgSrc, "/data/menu/cfgSrcOrig.cfg");
156*2e9d4914SAndroid Build Coastguard Worker 
157*2e9d4914SAndroid Build Coastguard Worker     config_destroy(&cfgSrc);
158*2e9d4914SAndroid Build Coastguard Worker     config_destroy(&cfgDst);
159*2e9d4914SAndroid Build Coastguard Worker 
160*2e9d4914SAndroid Build Coastguard Worker     return 0;
161*2e9d4914SAndroid Build Coastguard Worker }
162