diff -r bf6cf4dd847a -r f84805e6df03 project_files/frontlib/util/inihelper.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/frontlib/util/inihelper.c Sat Jun 09 03:28:38 2012 +0200 @@ -0,0 +1,168 @@ +#include "inihelper.h" +#include "logging.h" +#include "util.h" + +#include +#include +#include +#include +#include +#include + +static bool keychar_needs_urlencoding(char c) { + return !isalnum(c); +} + +char *inihelper_urlencode(const char *inbuf) { + if(!inbuf) { + return NULL; + } + size_t insize = strlen(inbuf); + if(insize > SIZE_MAX/4) { + return NULL; + } + + char *outbuf = malloc(insize*3+1); + if(!outbuf) { + return NULL; + } + + size_t inpos = 0, outpos = 0; + while(inbuf[inpos]) { + if(!keychar_needs_urlencoding(inbuf[inpos])) { + outbuf[outpos++] = inbuf[inpos++]; + } else { + if(snprintf(outbuf+outpos, 4, "%%%02X", (unsigned)((uint8_t*)inbuf)[inpos])<0) { + free(outbuf); + return NULL; + } + inpos++; + outpos += 3; + } + } + outbuf[outpos] = 0; + return outbuf; +} + +char *inihelper_urldecode(const char *inbuf) { + char *outbuf = malloc(strlen(inbuf)+1); + if(!outbuf) { + return NULL; + } + + size_t inpos = 0, outpos = 0; + while(inbuf[inpos]) { + if(inbuf[inpos] == '%' && isxdigit(inbuf[inpos+1]) && isxdigit(inbuf[inpos+2])) { + char temp[3] = {inbuf[inpos+1],inbuf[inpos+2],0}; + outbuf[outpos++] = strtol(temp, NULL, 16); + inpos += 3; + } else { + outbuf[outpos++] = inbuf[inpos++]; + } + } + outbuf[outpos] = 0; + return outbuf; +} + +char *inihelper_createDictKey(const char *sectionName, const char *keyName) { + if(!sectionName || !keyName) { + return NULL; + } + return flib_asprintf("%s:%s", sectionName, keyName); +} + +char *inihelper_getstring(dictionary *inifile, bool *error, const char *sectionName, const char *keyName) { + if(!inifile || !sectionName || !keyName) { + *error = true; + return NULL; + } + char *extendedkey = inihelper_createDictKey(sectionName, keyName); + if(!extendedkey) { + *error = true; + return NULL; + } + char *result = iniparser_getstring(inifile, extendedkey, NULL); + free(extendedkey); + if(!result) { + flib_log_i("Missing ini setting: %s/%s", sectionName, keyName); + *error = true; + } + return result; +} + +char *inihelper_getstringdup(dictionary *inifile, bool *error, const char *sectionName, const char *keyName) { + return flib_strdupnull(inihelper_getstring(inifile, error, sectionName, keyName)); +} + +int inihelper_getint(dictionary *inifile, bool *error, const char *sectionName, const char *keyName) { + char *value = inihelper_getstring(inifile, error, sectionName, keyName); + if(!value) { + return 0; + } else { + errno = 0; + long val = strtol(value, NULL, 10); + if(errno!=0) { + *error = true; + return 0; + } + if(valINT_MAX) { + *error = true; + return 0; + } + return (int)val; + } +} + +bool inihelper_getbool(dictionary *inifile, bool *error, const char *sectionName, const char *keyName) { + char *value = inihelper_getstring(inifile, error, sectionName, keyName); + if(!value) { + return false; + } else { + bool trueval = strchr("1tTyY", value[0]); + bool falseval = strchr("0fFnN", value[0]); + if(!trueval && !falseval) { + *error = true; + return false; + } else { + return trueval; + } + } +} + +int inihelper_setstr(dictionary *dict, const char *sectionName, const char *keyName, const char *value) { + int result = -1; + if(!dict || !sectionName || !keyName || !value) { + flib_log_e("inihelper_setstr called with bad parameters"); + } else { + char *extendedkey = inihelper_createDictKey(sectionName, keyName); + if(extendedkey) { + result = iniparser_set(dict, extendedkey, value); + free(extendedkey); + } + } + return result; +} + +int inihelper_setint(dictionary *dict, const char *sectionName, const char *keyName, int value) { + int result = -1; + if(!dict || !sectionName || !keyName) { + flib_log_e("inihelper_setint called with bad parameters"); + } else { + char *strvalue = flib_asprintf("%i", value); + if(strvalue) { + result = inihelper_setstr(dict, sectionName, keyName, strvalue); + free(strvalue); + } + } + return result; +} + +int inihelper_setbool(dictionary *dict, const char *sectionName, const char *keyName, bool value) { + int result = -1; + if(!dict || !sectionName || !keyName) { + flib_log_e("inihelper_setint called with bad parameters"); + } else { + result = inihelper_setstr(dict, sectionName, keyName, value ? "true" : "false"); + } + return result; +}