31 #include <string.h> |
31 #include <string.h> |
32 |
32 |
33 static void flib_schemelist_destroy(flib_schemelist *list) { |
33 static void flib_schemelist_destroy(flib_schemelist *list) { |
34 if(list) { |
34 if(list) { |
35 for(int i=0; i<list->schemeCount; i++) { |
35 for(int i=0; i<list->schemeCount; i++) { |
36 flib_cfg_release(list->schemes[i]); |
36 flib_scheme_release(list->schemes[i]); |
37 } |
37 } |
38 free(list->schemes); |
38 free(list->schemes); |
39 free(list); |
39 free(list); |
40 } |
40 } |
41 } |
41 } |
42 |
42 |
43 static char *makePrefixedName(int schemeIndex, const char *settingName) { |
43 static char *makePrefixedName(int schemeIndex, const char *settingName) { |
44 return flib_asprintf("%i\\%s", schemeIndex, settingName); |
44 return flib_asprintf("%i\\%s", schemeIndex, settingName); |
45 } |
45 } |
46 |
46 |
47 static int readSettingsFromIni(flib_ini *ini, flib_cfg *scheme, int index) { |
47 static int readSettingsFromIni(flib_ini *ini, flib_scheme *scheme, int index) { |
48 flib_cfg_meta *meta = scheme->meta; |
48 flib_metascheme *meta = scheme->meta; |
49 bool error = false; |
49 bool error = false; |
50 for(int i=0; i<meta->settingCount && !error; i++) { |
50 for(int i=0; i<meta->settingCount && !error; i++) { |
51 char *key = makePrefixedName(index, meta->settings[i].name); |
51 char *key = makePrefixedName(index, meta->settings[i].name); |
52 if(!key) { |
52 if(!key) { |
53 error = true; |
53 error = true; |
58 free(key); |
58 free(key); |
59 } |
59 } |
60 return error; |
60 return error; |
61 } |
61 } |
62 |
62 |
63 static int readModsFromIni(flib_ini *ini, flib_cfg *scheme, int index) { |
63 static int readModsFromIni(flib_ini *ini, flib_scheme *scheme, int index) { |
64 flib_cfg_meta *meta = scheme->meta; |
64 flib_metascheme *meta = scheme->meta; |
65 bool error = false; |
65 bool error = false; |
66 for(int i=0; i<meta->modCount && !error; i++) { |
66 for(int i=0; i<meta->modCount && !error; i++) { |
67 char *key = makePrefixedName(index, meta->mods[i].name); |
67 char *key = makePrefixedName(index, meta->mods[i].name); |
68 if(!key) { |
68 if(!key) { |
69 error = true; |
69 error = true; |
74 free(key); |
74 free(key); |
75 } |
75 } |
76 return error; |
76 return error; |
77 } |
77 } |
78 |
78 |
79 static flib_cfg *readSchemeFromIni(flib_cfg_meta *meta, flib_ini *ini, int index) { |
79 static flib_scheme *readSchemeFromIni(flib_metascheme *meta, flib_ini *ini, int index) { |
80 flib_cfg *result = NULL; |
80 flib_scheme *result = NULL; |
81 char *schemeNameKey = makePrefixedName(index+1, "name"); |
81 char *schemeNameKey = makePrefixedName(index+1, "name"); |
82 if(schemeNameKey) { |
82 if(schemeNameKey) { |
83 char *schemeName = NULL; |
83 char *schemeName = NULL; |
84 if(!flib_ini_get_str_opt(ini, &schemeName, schemeNameKey, "Unnamed")) { |
84 if(!flib_ini_get_str_opt(ini, &schemeName, schemeNameKey, "Unnamed")) { |
85 flib_cfg *scheme = flib_cfg_create(meta, schemeName); |
85 flib_scheme *scheme = flib_scheme_create(meta, schemeName); |
86 if(scheme) { |
86 if(scheme) { |
87 if(!readSettingsFromIni(ini, scheme, index) && !readModsFromIni(ini, scheme, index)) { |
87 if(!readSettingsFromIni(ini, scheme, index) && !readModsFromIni(ini, scheme, index)) { |
88 result = flib_cfg_retain(scheme); |
88 result = flib_scheme_retain(scheme); |
89 } |
89 } |
90 } |
90 } |
91 flib_cfg_release(scheme); |
91 flib_scheme_release(scheme); |
92 } |
92 } |
93 free(schemeName); |
93 free(schemeName); |
94 } |
94 } |
95 free(schemeNameKey); |
95 free(schemeNameKey); |
96 return result; |
96 return result; |
100 flib_ini_destroy(ini); |
100 flib_ini_destroy(ini); |
101 flib_schemelist_destroy(result); |
101 flib_schemelist_destroy(result); |
102 return NULL; |
102 return NULL; |
103 } |
103 } |
104 |
104 |
105 flib_schemelist *flib_schemelist_from_ini(flib_cfg_meta *meta, const char *filename) { |
105 flib_schemelist *flib_schemelist_from_ini(flib_metascheme *meta, const char *filename) { |
106 if(log_badargs_if2(meta==NULL, filename==NULL)) { |
106 if(log_badargs_if2(meta==NULL, filename==NULL)) { |
107 return NULL; |
107 return NULL; |
108 } |
108 } |
109 |
109 |
110 flib_schemelist *list = NULL; |
110 flib_schemelist *list = NULL; |
124 flib_log_e("Missing or malformed scheme count in config file %s.", filename); |
124 flib_log_e("Missing or malformed scheme count in config file %s.", filename); |
125 return fromIniHandleError(list, ini); |
125 return fromIniHandleError(list, ini); |
126 } |
126 } |
127 |
127 |
128 for(int i=0; i<schemeCount; i++) { |
128 for(int i=0; i<schemeCount; i++) { |
129 flib_cfg *scheme = readSchemeFromIni(meta, ini, i); |
129 flib_scheme *scheme = readSchemeFromIni(meta, ini, i); |
130 if(!scheme || flib_schemelist_insert(list, scheme, i)) { |
130 if(!scheme || flib_schemelist_insert(list, scheme, i)) { |
131 flib_cfg_release(scheme); |
131 flib_scheme_release(scheme); |
132 flib_log_e("Error reading scheme %i from config file %s.", i, filename); |
132 flib_log_e("Error reading scheme %i from config file %s.", i, filename); |
133 return fromIniHandleError(list, ini); |
133 return fromIniHandleError(list, ini); |
134 } |
134 } |
135 flib_cfg_release(scheme); |
135 flib_scheme_release(scheme); |
136 } |
136 } |
137 |
137 |
138 |
138 |
139 flib_ini_destroy(ini); |
139 flib_ini_destroy(ini); |
140 return list; |
140 return list; |
141 } |
141 } |
142 |
142 |
143 static int writeSchemeToIni(flib_cfg *scheme, flib_ini *ini, int index) { |
143 static int writeSchemeToIni(flib_scheme *scheme, flib_ini *ini, int index) { |
144 flib_cfg_meta *meta = scheme->meta; |
144 flib_metascheme *meta = scheme->meta; |
145 bool error = false; |
145 bool error = false; |
146 |
146 |
147 char *key = makePrefixedName(index+1, "name"); |
147 char *key = makePrefixedName(index+1, "name"); |
148 error |= !key || flib_ini_set_str(ini, key, scheme->name); |
148 error |= !key || flib_ini_set_str(ini, key, scheme->name); |
149 free(key); |
149 free(key); |
197 if(list && flib_release(&list->_referenceCount, "flib_schemelist")) { |
197 if(list && flib_release(&list->_referenceCount, "flib_schemelist")) { |
198 flib_schemelist_destroy(list); |
198 flib_schemelist_destroy(list); |
199 } |
199 } |
200 } |
200 } |
201 |
201 |
202 flib_cfg *flib_schemelist_find(flib_schemelist *list, const char *name) { |
202 flib_scheme *flib_schemelist_find(flib_schemelist *list, const char *name) { |
203 if(!log_badargs_if2(list==NULL, name==NULL)) { |
203 if(!log_badargs_if2(list==NULL, name==NULL)) { |
204 for(int i=0; i<list->schemeCount; i++) { |
204 for(int i=0; i<list->schemeCount; i++) { |
205 if(!strcmp(name, list->schemes[i]->name)) { |
205 if(!strcmp(name, list->schemes[i]->name)) { |
206 return list->schemes[i]; |
206 return list->schemes[i]; |
207 } |
207 } |
208 } |
208 } |
209 } |
209 } |
210 return NULL; |
210 return NULL; |
211 } |
211 } |
212 |
212 |
213 GENERATE_STATIC_LIST_INSERT(insertScheme, flib_cfg*) |
213 GENERATE_STATIC_LIST_INSERT(insertScheme, flib_scheme*) |
214 GENERATE_STATIC_LIST_DELETE(deleteScheme, flib_cfg*) |
214 GENERATE_STATIC_LIST_DELETE(deleteScheme, flib_scheme*) |
215 |
215 |
216 int flib_schemelist_insert(flib_schemelist *list, flib_cfg *cfg, int pos) { |
216 int flib_schemelist_insert(flib_schemelist *list, flib_scheme *cfg, int pos) { |
217 if(!log_badargs_if2(list==NULL, cfg==NULL) |
217 if(!log_badargs_if2(list==NULL, cfg==NULL) |
218 && !insertScheme(&list->schemes, &list->schemeCount, cfg, pos)) { |
218 && !insertScheme(&list->schemes, &list->schemeCount, cfg, pos)) { |
219 flib_cfg_retain(cfg); |
219 flib_scheme_retain(cfg); |
220 return 0; |
220 return 0; |
221 } |
221 } |
222 return -1; |
222 return -1; |
223 } |
223 } |
224 |
224 |
225 int flib_schemelist_delete(flib_schemelist *list, int pos) { |
225 int flib_schemelist_delete(flib_schemelist *list, int pos) { |
226 if(!log_badargs_if(list==NULL)) { |
226 if(!log_badargs_if(list==NULL)) { |
227 flib_cfg *elem = list->schemes[pos]; |
227 flib_scheme *elem = list->schemes[pos]; |
228 if(!deleteScheme(&list->schemes, &list->schemeCount, pos)) { |
228 if(!deleteScheme(&list->schemes, &list->schemeCount, pos)) { |
229 flib_cfg_release(elem); |
229 flib_scheme_release(elem); |
230 return 0; |
230 return 0; |
231 } |
231 } |
232 } |
232 } |
233 return -1; |
233 return -1; |
234 } |
234 } |