diff options
Diffstat (limited to 'src/miav_config.cc')
-rw-r--r-- | src/miav_config.cc | 144 |
1 files changed, 125 insertions, 19 deletions
diff --git a/src/miav_config.cc b/src/miav_config.cc index 2af0ef1..9364131 100644 --- a/src/miav_config.cc +++ b/src/miav_config.cc @@ -30,27 +30,24 @@ MiavConfig::MiavConfig(char *file) { configs = NULL; - _cfg *cfg; - - // TODO: Read config from file. - - // Add a config - configs = cfg = (_cfg*) malloc(sizeof(_cfg)); - cfg->name = new string("cpr_host"); - cfg->stringval = new string("cpr.j.auh.dk"); - cfg->next = (_cfg*) malloc(sizeof(_cfg)); + // Read config file + FILE* fp = fopen(file, "r"); + + if(!fp) { + fprintf(stderr, "Error reading configuration file %s\n", file); + return; + } + fseek(fp, 0, SEEK_END); + int fsz = ftell(fp); + fseek(fp, 0, SEEK_SET); + + char *raw = (char*)calloc(fsz, 1); + fread(raw, 1, fsz, fp); - // Add another config - cfg = cfg->next; - cfg->name = new string("cpr_port"); - cfg->intval = 10301; - cfg->next = (_cfg*) malloc(sizeof(_cfg)); + fclose(fp); - // Add another config - cfg = cfg->next; - cfg->name = new string("screensize"); - cfg->floatval = 19.0f; - cfg->next = NULL; + parse(raw); + free(raw); } MiavConfig::~MiavConfig() @@ -66,6 +63,115 @@ MiavConfig::~MiavConfig() if(die) free(die); } +_cfg *MiavConfig::addConfig(_cfg *parent, char* conf) +{ + _cfg *cfg; + + printf("[%s]\n", conf); + + cfg = (_cfg*) malloc(sizeof(_cfg)); + if(!parent) configs = cfg; + + int namelen = strchr(conf, '=') - conf; + char* name = (char*)calloc(namelen + 1, 1); + strncpy(name, conf, namelen); + printf("name [%s]#%d - ", name, namelen); + + int vallen = conf + strlen(conf) - (strchr(conf, '=') + 1); + char* val = (char*)calloc(vallen + 1, 1); + strncpy(val, conf + strlen(conf) - vallen, vallen); + printf("val [%s]#%d\n", val, vallen); + + cfg->name = new string((const char*)name); + free(name); + + cfg->stringval = new string((const char*)val); + cfg->intval = atoi(val); + cfg->floatval = atof(val); + cfg->boolval = atoi(val) != 0; + free(val); + + cfg->next = NULL; + + if(parent) parent->next = cfg; + return cfg; +} + +int MiavConfig::parse(char* raw) +{ + // Strip the string + char *conf = strip(raw); + char *conf_end = conf + strlen(conf); + char *start = conf; + char *p; + + _cfg *cfg = NULL; + + // Iterate the lines in the string + for(p = conf; p < conf_end; p++) { + if(*p == '\n') { + *p = '\0'; + cfg = addConfig(cfg, start); + start = p+1; + } + } + free(conf); + printf("done!\n"); + return 0; +} + +char* MiavConfig::strip(char* conf) +{ + char *stripped = (char*)calloc(strlen(conf) + 2, 1); + char *r; + char *w = stripped; + + bool instring = false; + bool incomment = false; + + // Iterate over the characters in the input string. + for(r = conf; r < conf + strlen(conf); r++) { + if(strchr("#", *r)) incomment = true; + if(strchr("\n", *r)) incomment = false; + + if(!incomment) { + if(instring) { + // When in a string, accept anything, except ". + if(*r != '\"') { + *w = *r; + w++; + } + } else { + // Only copy valid characters + if(strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-_,.=", *r)) { + // Change comma into dot + if(*r == ',') *r = '.'; + *w = *r; + w++; + } + // We don't want double newlines and initial newline! + if((*r == '\n') && (*(w-1) != '\n') && (w != stripped)) { + *w = *r; + w++; + } + } + } + + if(strchr("\"", *r)) instring = !instring; + } + + // If we are not ending on a newline, we better append one + if(*(w-1) != '\n') { + *w = '\n'; + w++; + } + + // Make sure we are nullterminated. + *w = '\0'; + + return stripped; +} + int MiavConfig::readInt(char *node) { return findNode(node)->intval; |