/* * Copyright (c) 2012, Marius Barbu * Copyright (c) 2013, Paul Irofti */ #include /* sscanf/snprintf */ #include /* stricmp */ #include #include "tree.h" #include "config.h" #if _MSC_VER #define snprintf _snprintf #endif struct ConfigMap { char *name; char *value; RB_ENTRY(ConfigMap) entry; }; int cfg_cmp(struct ConfigMap *cfg1, struct ConfigMap *cfg2) { return (strcmp(cfg1->name, cfg2->name)); } RB_HEAD(cfgtree, ConfigMap) cfg_head = RB_INITIALIZER(&cfg_head); RB_GENERATE(cfgtree, ConfigMap, entry, cfg_cmp); void config_set_string(char *name, char *value) { struct ConfigMap *dup = NULL; struct ConfigMap *cfg = malloc(sizeof *cfg); if (cfg == NULL || name == NULL || value == NULL) return; cfg->name = strdup(name); if (cfg->name == NULL) return; cfg->value = strdup(value); if (cfg->value == NULL) return; if ((dup = RB_INSERT(cfgtree, &cfg_head, cfg))) { dup->value = cfg->value; free(cfg->name); free(cfg); } } void config_set_int(char *name, int value) { char buff[20]; snprintf(buff, sizeof buff, "%d", value); config_set_string(name, buff); } void config_set_bool(char *name, int value) { char buff[20]; snprintf(buff, sizeof buff, "%d", value ? 1 : 0); config_set_string(name, buff); } char* config_get_string(char *name, char *def) { struct ConfigMap find, *found = NULL; find.name = (char *)name; found = RB_FIND(cfgtree, &cfg_head, &find); if (found == NULL) { return def; } return found->value; } int config_get_int(char *name, int def) { int val = def; struct ConfigMap find, *found = NULL; find.name = (char *)name; found = RB_FIND(cfgtree, &cfg_head, &find); if (found == NULL) { return def; } sscanf(found->value, "%i", &val); return val; } int config_get_bool(char *name, int def) { struct ConfigMap find, *found = NULL; find.name = (char *)name; found = RB_FIND(cfgtree, &cfg_head, &find); if (found == NULL) { return def; } if (strcmp(found->value, "0") == 0 || strcmp(found->value, "false") == 0) { return 0; } return 1; } void config_destroy() { struct ConfigMap *var, *nxt; for (var = RB_MIN(cfgtree, &cfg_head); var != NULL; var = nxt) { nxt = RB_NEXT(cfgtree, &cfg_head, var); RB_REMOVE(cfgtree, &cfg_head, var); free(var->name); free(var->value); free(var); } }