summaryrefslogtreecommitdiff
path: root/src/miav_config.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/miav_config.cc')
-rw-r--r--src/miav_config.cc144
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;