project_files/frontlib/model/schemelist.c
changeset 7320 e704706008d4
parent 7316 f7b49b2c5d84
child 7464 859ab6859854
equal deleted inserted replaced
7318:a446eafcddeb 7320:e704706008d4
    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 }