project_files/frontlib/model/cfg.c
changeset 7227 1c859f572d72
parent 7224 5143861c83bd
child 7230 240620f46dd7
equal deleted inserted replaced
7224:5143861c83bd 7227:1c859f572d72
     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) {