1 #include "cfg.h" |
1 #include "cfg.h" |
2 |
2 |
3 #include "../iniparser/iniparser.h" |
|
4 #include "../iniparser/dictionary.h" |
|
5 #include "../util/inihelper.h" |
3 #include "../util/inihelper.h" |
6 #include "../util/logging.h" |
4 #include "../util/logging.h" |
7 #include "../util/util.h" |
5 #include "../util/util.h" |
8 |
6 |
9 #include <stdio.h> |
7 #include <stdio.h> |
10 |
8 #include <stdlib.h> |
11 static flib_cfg_meta *flib_cfg_meta_from_ini_handleError(flib_cfg_meta *result, dictionary *settingfile, dictionary *modfile) { |
9 |
|
10 static flib_cfg_meta *flib_cfg_meta_from_ini_handleError(flib_cfg_meta *result, flib_ini *settingfile, flib_ini *modfile) { |
12 flib_cfg_meta_destroy(result); |
11 flib_cfg_meta_destroy(result); |
13 iniparser_freedict(settingfile); |
12 flib_ini_destroy(settingfile); |
14 iniparser_freedict(modfile); |
13 flib_ini_destroy(modfile); |
15 return NULL; |
14 return NULL; |
16 } |
15 } |
17 |
16 |
18 flib_cfg_meta *flib_cfg_meta_from_ini(const char *settingpath, const char *modpath) { |
17 flib_cfg_meta *flib_cfg_meta_from_ini(const char *settingpath, const char *modpath) { |
19 if(!settingpath || !modpath) { |
18 if(!settingpath || !modpath) { |
20 flib_log_e("null parameter in flib_cfg_meta_from_ini"); |
19 flib_log_e("null parameter in flib_cfg_meta_from_ini"); |
21 return NULL; |
20 return NULL; |
22 } |
21 } |
23 flib_cfg_meta *result = flib_calloc(1, sizeof(flib_cfg_meta)); |
22 flib_cfg_meta *result = flib_calloc(1, sizeof(flib_cfg_meta)); |
24 dictionary *settingfile = iniparser_load(settingpath); |
23 flib_ini *settingfile = flib_ini_load(settingpath); |
25 dictionary *modfile = iniparser_load(modpath); |
24 flib_ini *modfile = flib_ini_load(modpath); |
26 |
25 |
27 if(!result || !settingfile || !modfile) { |
26 if(!result || !settingfile || !modfile) { |
28 return flib_cfg_meta_from_ini_handleError(result, settingfile, modfile); |
27 return flib_cfg_meta_from_ini_handleError(result, settingfile, modfile); |
29 } |
28 } |
30 |
29 |
31 result->settingCount = iniparser_getnsec(settingfile); |
30 result->settingCount = flib_ini_get_sectioncount(settingfile); |
32 result->modCount = iniparser_getnsec(modfile); |
31 result->modCount = flib_ini_get_sectioncount(modfile); |
33 result->settings = flib_calloc(result->settingCount, sizeof(flib_cfg_setting_meta)); |
32 result->settings = flib_calloc(result->settingCount, sizeof(flib_cfg_setting_meta)); |
34 result->mods = flib_calloc(result->modCount, sizeof(flib_cfg_mod_meta)); |
33 result->mods = flib_calloc(result->modCount, sizeof(flib_cfg_mod_meta)); |
35 |
34 |
36 if(!result->settings || !result->mods) { |
35 if(!result->settings || !result->mods) { |
37 return flib_cfg_meta_from_ini_handleError(result, settingfile, modfile); |
36 return flib_cfg_meta_from_ini_handleError(result, settingfile, modfile); |
38 } |
37 } |
39 |
38 |
40 for(int i=0; i<result->settingCount; i++) { |
39 for(int i=0; i<result->settingCount; i++) { |
41 char *sectionName = iniparser_getsecname(settingfile, i); |
40 result->settings[i].iniName = flib_ini_get_sectionname(settingfile, i); |
42 if(!sectionName) { |
41 if(!result->settings[i].iniName) { |
43 return flib_cfg_meta_from_ini_handleError(result, settingfile, modfile); |
42 return flib_cfg_meta_from_ini_handleError(result, settingfile, modfile); |
44 } |
43 } |
45 |
44 |
46 bool error = false; |
45 bool error = false; |
47 result->settings[i].iniName = flib_strdupnull(sectionName); |
46 error |= flib_ini_enter_section(settingfile, result->settings[i].iniName); |
48 result->settings[i].title = inihelper_getstringdup(settingfile, &error, sectionName, "title"); |
47 error |= flib_ini_get_str(settingfile, &result->settings[i].title, "title"); |
49 result->settings[i].engineCommand = inihelper_getstringdup(settingfile, &error, sectionName, "command"); |
48 error |= flib_ini_get_str(settingfile, &result->settings[i].engineCommand, "command"); |
50 result->settings[i].image = inihelper_getstringdup(settingfile, &error, sectionName, "image"); |
49 error |= flib_ini_get_str(settingfile, &result->settings[i].image, "image"); |
51 result->settings[i].checkOverMax = inihelper_getbool(settingfile, &error, sectionName, "checkOverMax"); |
50 error |= flib_ini_get_bool(settingfile, &result->settings[i].checkOverMax, "checkOverMax"); |
52 result->settings[i].times1000 = inihelper_getbool(settingfile, &error, sectionName, "times1000"); |
51 error |= flib_ini_get_bool(settingfile, &result->settings[i].times1000, "times1000"); |
53 result->settings[i].min = inihelper_getint(settingfile, &error, sectionName, "min"); |
52 error |= flib_ini_get_int(settingfile, &result->settings[i].min, "min"); |
54 result->settings[i].max = inihelper_getint(settingfile, &error, sectionName, "max"); |
53 error |= flib_ini_get_int(settingfile, &result->settings[i].max, "max"); |
55 result->settings[i].def = inihelper_getint(settingfile, &error, sectionName, "default"); |
54 error |= flib_ini_get_int(settingfile, &result->settings[i].def, "default"); |
|
55 |
56 if(error) { |
56 if(error) { |
57 flib_log_e("Missing or malformed ini parameter in file %s, section %s", settingpath, sectionName); |
57 flib_log_e("Missing or malformed ini parameter in file %s, section %s", settingpath, result->settings[i].iniName); |
58 return flib_cfg_meta_from_ini_handleError(result, settingfile, modfile); |
58 return flib_cfg_meta_from_ini_handleError(result, settingfile, modfile); |
59 } |
59 } |
60 } |
60 } |
61 |
61 |
62 for(int i=0; i<result->modCount; i++) { |
62 for(int i=0; i<result->modCount; i++) { |
63 char *sectionName = iniparser_getsecname(modfile, i); |
63 result->mods[i].iniName = flib_ini_get_sectionname(modfile, i); |
64 if(!sectionName) { |
64 if(!result->mods[i].iniName) { |
65 return flib_cfg_meta_from_ini_handleError(result, settingfile, modfile); |
65 return flib_cfg_meta_from_ini_handleError(result, settingfile, modfile); |
66 } |
66 } |
67 |
67 |
68 bool error = false; |
68 bool error = false; |
69 result->mods[i].iniName = flib_strdupnull(sectionName); |
69 error |= flib_ini_enter_section(modfile, result->mods[i].iniName); |
70 result->mods[i].bitmaskIndex = inihelper_getint(modfile, &error, sectionName, "bitmaskIndex"); |
70 error |= flib_ini_get_int(modfile, &result->mods[i].bitmaskIndex, "bitmaskIndex"); |
71 if(error) { |
71 if(error) { |
72 flib_log_e("Missing or malformed ini parameter in file %s, section %s", modpath, sectionName); |
72 flib_log_e("Missing or malformed ini parameter in file %s, section %s", modpath, result->mods[i].iniName); |
73 return flib_cfg_meta_from_ini_handleError(result, settingfile, modfile); |
73 return flib_cfg_meta_from_ini_handleError(result, settingfile, modfile); |
74 } |
74 } |
75 } |
75 } |
76 |
76 |
77 iniparser_freedict(settingfile); |
77 flib_ini_destroy(settingfile); |
78 iniparser_freedict(modfile); |
78 flib_ini_destroy(modfile); |
79 return result; |
79 return result; |
80 } |
80 } |
81 |
81 |
82 void flib_cfg_meta_destroy(flib_cfg_meta *cfg) { |
82 void flib_cfg_meta_destroy(flib_cfg_meta *cfg) { |
83 if(cfg) { |
83 if(cfg) { |
122 result->settings[i] = meta->settings[i].def; |
122 result->settings[i] = meta->settings[i].def; |
123 } |
123 } |
124 return result; |
124 return result; |
125 } |
125 } |
126 |
126 |
127 flib_cfg *flib_cfg_from_ini_handleError(flib_cfg *result, dictionary *settingfile) { |
127 flib_cfg *flib_cfg_from_ini_handleError(flib_cfg *result, flib_ini *settingfile) { |
128 iniparser_freedict(settingfile); |
128 flib_ini_destroy(settingfile); |
129 flib_cfg_destroy(result); |
129 flib_cfg_destroy(result); |
130 return NULL; |
130 return NULL; |
131 } |
131 } |
132 |
132 |
133 flib_cfg *flib_cfg_from_ini(const flib_cfg_meta *meta, const char *filename) { |
133 flib_cfg *flib_cfg_from_ini(const flib_cfg_meta *meta, const char *filename) { |
134 if(!meta || !filename) { |
134 if(!meta || !filename) { |
135 flib_log_e("null parameter in flib_cfg_from_ini"); |
135 flib_log_e("null parameter in flib_cfg_from_ini"); |
136 return NULL; |
136 return NULL; |
137 } |
137 } |
138 dictionary *settingfile = iniparser_load(filename); |
138 flib_ini *settingfile = flib_ini_load(filename); |
139 if(!settingfile) { |
139 if(!settingfile) { |
140 return NULL; |
140 return NULL; |
141 } |
141 } |
142 |
142 |
143 bool error = false; |
143 char *schemename = NULL; |
144 char *schemename = inihelper_getstring(settingfile, &error, "Scheme", "name"); |
144 if(flib_ini_enter_section(settingfile, "Scheme")) { |
145 if(!schemename) { |
145 flib_log_e("Missing section \"Scheme\" in config file %s.", filename); |
146 return flib_cfg_from_ini_handleError(NULL, settingfile); |
146 return flib_cfg_from_ini_handleError(NULL, settingfile); |
147 } |
147 } |
|
148 if(flib_ini_get_str(settingfile, &schemename, "name")) { |
|
149 flib_log_e("Missing scheme name in config file %s.", filename); |
|
150 return flib_cfg_from_ini_handleError(NULL, settingfile); |
|
151 } |
148 |
152 |
149 flib_cfg *result = flib_cfg_create(meta, schemename); |
153 flib_cfg *result = flib_cfg_create(meta, schemename); |
150 |
154 |
151 for(int i=0; i<meta->settingCount; i++) { |
155 if(flib_ini_enter_section(settingfile, "BasicSettings")) { |
152 char *key = inihelper_createDictKey("BasicSettings", meta->settings[i].iniName); |
156 flib_log_w("Missing section \"BasicSettings\" in config file %s, using defaults.", filename); |
153 if(!key) { |
157 } else { |
154 return flib_cfg_from_ini_handleError(result, settingfile); |
158 for(int i=0; i<meta->settingCount; i++) { |
155 } |
159 if(flib_ini_get_int_opt(settingfile, &result->settings[i], meta->settings[i].iniName, meta->settings[i].def)) { |
156 result->settings[i] = iniparser_getint(settingfile, key, meta->settings[i].def); |
160 flib_log_e("Error reading BasicSetting %s in config file %s.", meta->settings[i].iniName, filename); |
157 free(key); |
161 return flib_cfg_from_ini_handleError(result, settingfile); |
158 } |
162 } |
159 for(int i=0; i<meta->modCount; i++) { |
163 } |
160 char *key = inihelper_createDictKey("GameMods", meta->mods[i].iniName); |
164 } |
161 if(!key) { |
165 |
162 return flib_cfg_from_ini_handleError(result, settingfile); |
166 if(flib_ini_enter_section(settingfile, "GameMods")) { |
163 } |
167 flib_log_w("Missing section \"GameMods\" in config file %s, using defaults.", filename); |
164 result->mods[i] = iniparser_getboolean(settingfile, key, false); |
168 } else { |
165 free(key); |
169 for(int i=0; i<meta->modCount; i++) { |
166 } |
170 if(flib_ini_get_bool_opt(settingfile, &result->mods[i], meta->mods[i].iniName, false)) { |
167 iniparser_freedict(settingfile); |
171 flib_log_e("Error reading GameMod %s in config file %s.", meta->mods[i].iniName, filename); |
|
172 return flib_cfg_from_ini_handleError(result, settingfile); |
|
173 } |
|
174 } |
|
175 } |
|
176 flib_ini_destroy(settingfile); |
168 return result; |
177 return result; |
169 } |
178 } |
170 |
179 |
171 int flib_cfg_to_ini(const flib_cfg_meta *meta, const char *filename, const flib_cfg *config) { |
180 int flib_cfg_to_ini(const flib_cfg_meta *meta, const char *filename, const flib_cfg *config) { |
172 int result = -1; |
181 int result = -1; |
173 if(!meta || !filename || !config || config->modCount!=meta->modCount || config->settingCount!=meta->settingCount) { |
182 if(!meta || !filename || !config || config->modCount!=meta->modCount || config->settingCount!=meta->settingCount) { |
174 flib_log_e("Invalid parameter in flib_cfg_to_ini"); |
183 flib_log_e("Invalid parameter in flib_cfg_to_ini"); |
175 } else { |
184 } else { |
176 dictionary *dict = iniparser_load(filename); |
185 flib_ini *ini = flib_ini_create(filename); |
177 if(!dict) { |
186 if(ini) { |
178 dict = dictionary_new(0); |
|
179 } |
|
180 if(dict) { |
|
181 bool error = false; |
187 bool error = false; |
182 // Add the sections |
|
183 error |= iniparser_set(dict, "Scheme", NULL); |
|
184 error |= iniparser_set(dict, "BasicSettings", NULL); |
|
185 error |= iniparser_set(dict, "GameMods", NULL); |
|
186 |
188 |
187 // Add the values |
189 // Add the values |
188 error |= inihelper_setstr(dict, "Scheme", "name", config->schemeName); |
190 error |= flib_ini_create_section(ini, "Scheme"); |
189 for(int i=0; i<config->settingCount; i++) { |
191 if(!error) { |
190 error |= inihelper_setint(dict, "BasicSettings", meta->settings[i].iniName, config->settings[i]); |
192 error |= flib_ini_set_str(ini, "name", config->schemeName); |
191 } |
193 } |
192 for(int i=0; i<config->modCount; i++) { |
194 |
193 error |= inihelper_setbool(dict, "GameMods", meta->mods[i].iniName, config->mods[i]); |
195 |
194 } |
196 error |= flib_ini_create_section(ini, "BasicSettings"); |
195 if(!error) { |
197 if(!error) { |
196 FILE *inifile = fopen(filename, "wb"); |
198 for(int i=0; i<config->settingCount; i++) { |
197 if(inifile) { |
199 error |= flib_ini_set_int(ini, meta->settings[i].iniName, config->settings[i]); |
198 iniparser_dump_ini(dict, inifile); |
|
199 fclose(inifile); |
|
200 result = 0; |
|
201 } |
200 } |
202 } |
201 } |
203 dictionary_del(dict); |
202 |
204 } |
203 error |= flib_ini_create_section(ini, "GameMods"); |
|
204 if(!error) { |
|
205 for(int i=0; i<config->modCount; i++) { |
|
206 error |= flib_ini_set_bool(ini, meta->mods[i].iniName, config->mods[i]); |
|
207 } |
|
208 } |
|
209 |
|
210 if(!error) { |
|
211 result = flib_ini_save(ini, filename); |
|
212 } |
|
213 } |
|
214 flib_ini_destroy(ini); |
205 } |
215 } |
206 return result; |
216 return result; |
207 } |
217 } |
208 |
218 |
209 void flib_cfg_destroy(flib_cfg* cfg) { |
219 void flib_cfg_destroy(flib_cfg* cfg) { |