src/server/config/objconf.c

changeset 17
d2a97bbeb57d
parent 16
a9bbd82d2dce
child 23
a2c8fc23c90e
--- a/src/server/config/objconf.c	Sun Jan 15 17:00:16 2012 +0100
+++ b/src/server/config/objconf.c	Sun Jan 15 20:30:45 2012 +0100
@@ -47,6 +47,7 @@
     ObjectConfig *conf = malloc(sizeof(ObjectConfig));
     conf->parser.parse = objconf_parse;
     conf->file = file;
+    conf->conditions = NULL;
 
     int r = cfg_parse_basic_file((ConfigParser*)conf, in);
     if(r != 0) {
@@ -57,46 +58,80 @@
     return conf;
 }
 
+void free_object_config(ObjectConfig *conf) {
+    // free all objects
+    UcxDlist *objects = conf->objects;
+    while(objects != NULL) {
+        ConfigObject *obj = objects->data;
+        // free all directive lists
+        for(int i=0;i<6;i++) {
+            if(obj->directives[i]) {
+                ucx_dlist_free(obj->directives[i]);
+            }
+        }
+
+        objects = objects->next;
+    }
+    if(conf->objects) {
+        ucx_dlist_free(conf->objects);
+    }
+
+    // free other lists
+    if(conf->levels) {
+        ucx_list_free(conf->levels);
+    }
+    if(conf->lines) {
+        ucx_dlist_free(conf->lines);
+    }
+    if(conf->conditions) {
+        ucx_dlist_free(conf->conditions);
+    }
+
+    // free mempool
+    ucx_mempool_free(conf->parser.mp);
+    free(conf);
+}
+
 
 
 int objconf_parse(void *p, ConfigLine *begin, ConfigLine *end, sstr_t line) {
     ObjectConfig *conf = p;
 
-    begin->type = objconf_get_line_type(line);
+    begin->type = cfg_get_line_type(line);
     switch(begin->type) {
         case LINE_BEGIN_TAG: {
-            ConfigTag *tag = objconf_parse_begin_tag(line, conf->parser.mp);
+            ConfigTag *tag = cfg_parse_begin_tag(line, conf->parser.mp);
             if(tag == NULL) {
                 fprintf(stderr, "Parse error!\n");
                 exit(-1); // TODO: better error handling
             }
             tag->begin = begin;
             tag->end = end;
-            tag->type_num = objconf_get_tag_type(tag->name);
+            tag->type_num = cfg_get_tag_type(tag->name);
             //printf("line {%s}\n", sstrdub(ll).ptr);
             if(objconf_on_begin_tag(conf, tag) != 0) {
-                fprintf(stderr, "1error!\n");
+                fprintf(stderr, "1error\n");
                 exit(-1);
             }
             break;
         }
         case LINE_END_TAG: {
-            sstr_t tag = objconf_get_end_tag_name(line);
+            sstr_t tag = cfg_get_end_tag_name(line);
             if(objconf_on_end_tag(conf, tag) != 0) {
-                fprintf(stderr, "2error!\n");
+                fprintf(stderr, "2error\n");
                 exit(-1);
             }
 
             break;
         }
         case LINE_DIRECTIVE: {
-            ConfigDirective *dir = objconf_parse_directive(
+            ConfigDirective *dir = cfg_parse_directive(
                     line,
                     conf->parser.mp);
             dir->begin = begin;
             dir->end = end;
             if(objconf_on_directive(conf, dir) != 0) {
-                fprintf(stderr, "3error!\n");
+                fprintf(stderr, "3error\n");
                 exit(-1);
             }
         }
@@ -118,7 +153,7 @@
             ConfigObject *obj = OBJ_NEW_N(conf->parser.mp, ConfigObject);
             obj->begin = tag->begin;
             obj->end = tag->end;
-
+            
             obj->name = cfg_param_get(tag->param, sstr("name"));
             obj->ppath = cfg_param_get(tag->param, sstr("ppath"));
 
@@ -138,7 +173,10 @@
             // create tree level object
             ConfigParserLevel *last_lvl = conf->levels->data;
 
-            ConfigParserLevel *lvl = OBJ_NEW(conf->parser.mp, ConfigParserLevel);
+            ConfigParserLevel *lvl = OBJ_NEW(
+                    conf->parser.mp,
+                    ConfigParserLevel);
+            
             lvl->iftag = NULL;
             lvl->levelnum = last_lvl->levelnum + 1;
             lvl->tag = tag;
@@ -182,7 +220,7 @@
 }
 
 int objconf_on_end_tag(ObjectConfig *conf, sstr_t tagname) {
-    int type = objconf_get_tag_type(tagname);
+    int type = cfg_get_tag_type(tagname);
     if(type == -1) {
         fprintf(stderr, "unknown tag\n");
         return 1;
@@ -215,185 +253,3 @@
     return 0;
 }
 
-/*
- * checks if the line contains a begin/end tag or a directive
- */
-int objconf_get_line_type(sstr_t line) {
-    if(line.length < 3) {
-        // this line is to short to be correct
-        return LINE_ERROR;
-    }
-    
-    if(line.ptr[0] == '<') {
-        // start or end tag
-        // TODO: check for space between '<' and '/'
-        if(line.ptr[1] == '/') {
-            return LINE_END_TAG;
-        } else {
-            return LINE_BEGIN_TAG;
-        }
-    } else {
-        return LINE_DIRECTIVE;
-    }
-}
-
-ConfigTag* objconf_parse_begin_tag(sstr_t line, UcxMempool *mp) {
-    if(line.length < 4) {
-        return NULL; // this line can't contain a valid tag
-    }
-
-    if(line.ptr[0] != '<' || line.ptr[line.length - 1] != '>') {
-        return NULL; // syntax error
-    }
-
-    sstr_t name;
-    name.ptr = line.ptr + 1;
-    int i;
-    for(i=1;i<line.length - 1;i++) {
-        if(line.ptr[i] < 33) { // char is space
-            name.length = i - 1;
-            break;
-        }
-    }
-    if(name.length < 1) {
-        return NULL; // syntax error
-    }
-
-    // create tag object
-    ConfigTag *tag = OBJ_NEW(mp, ConfigTag);
-    tag->name = sstrdub_mp(mp, name);
-    tag->param = NULL;
-
-    // parse parameters
-    sstr_t param_str;
-    param_str.ptr = line.ptr + i;
-    param_str.length = line.length - name.length - 2;
-    param_str = sstrtrim(param_str);
-    if(param_str.length <= 0) {
-        return tag; // no parameters
-    }
-
-    sstr_t pname;
-    sstr_t pvalue;
-    for(;;) {
-        param_str = cfg_param(param_str, &pname, &pvalue);
-        if(pname.length <= 0) {
-            break;
-        }
-
-        // create param object
-        ConfigParam *param = OBJ_NEW(mp, ConfigParam);
-        param->name = sstrdub_mp(mp, pname);
-        if(pvalue.length > 0) {
-            param->value = sstrdub_mp(mp, pvalue);
-        } else {
-            param->value.ptr = NULL;
-            param->value.length = 0;
-        }
-
-        // add param to list
-        tag->param = ucx_list_append(tag->param, param);
-    }
-
-    return tag;
-}
-
-/*
- * returns the name of the ending tag
- * on error, this functions returns a zero length string
- */
-sstr_t objconf_get_end_tag_name(sstr_t line) {
-    sstr_t ns;
-    ns.ptr = NULL;
-    ns.length = 0;
-
-    if(line.length < 4) {
-        // minimum of 4 chars: </a>
-        return ns;
-    }
-
-    sstr_t name;
-    name.ptr = line.ptr + 2;
-    name.length = line.length - 3;
-
-    // check for </ > frame
-    if(line.ptr[0] != '<'
-            || line.ptr[1] != '/'
-            || line.ptr[line.length - 1] != '>')
-    {
-        return ns;
-    }
-
-    return sstrtrim(name);
-}
-
-/*
- * parses a line containing a directive and returns a ConfigDirective object
- * or NULL if an error occurs
- */
-ConfigDirective* objconf_parse_directive(sstr_t line, UcxMempool *mp) {
-    if(line.length < 6) {
-        return NULL; // line too short
-    }
-
-    sstr_t name;
-
-    int i;
-    for(i=0;i<line.length;i++) {
-        if(line.ptr[i] < 33) {
-            break;
-        }
-    }
-    name.ptr = line.ptr;
-    name.length = i;
-
-    // create directive object
-    ConfigDirective *directive = OBJ_NEW(mp, ConfigDirective);
-    directive->directive_type = sstrdub_mp(mp, name);
-    directive->type_num = cfg_get_directive_type_num(name);
-    directive->condition = NULL; // set later by main parsing function
-    directive->param = NULL;
-
-    sstr_t param_str;
-    param_str.ptr = name.ptr + i;
-    param_str.length = line.length - i;
-    param_str = sstrtrim(param_str);
-    sstr_t pname;
-    sstr_t pvalue;
-    for(;;) {
-        param_str = cfg_param(param_str, &pname, &pvalue);
-        if(pname.length <= 0) {
-            break;
-        }
-
-        // create param object
-        ConfigParam *param = OBJ_NEW(mp, ConfigParam);
-        param->name = sstrdub_mp(mp, pname);
-        if(pvalue.length > 0) {
-            param->value = sstrdub_mp(mp, pvalue);
-        } else {
-            param->value.ptr = NULL;
-            param->value.length = 0;
-        }
-
-        // add param to list
-        directive->param = ucx_list_append(directive->param, param);
-    }
-
-    return directive;
-}
-
-int objconf_get_tag_type(sstr_t tag) {
-    if(!sstrcmp(tag, sstr("Object"))) {
-        return TAG_OBJECT;
-    } else if(!sstrcmp(tag, sstr("If"))) {
-        return TAG_IF;
-    } else if(!sstrcmp(tag, sstr("ElseIf"))) {
-        return TAG_ELSEIF;
-    } else if(!sstrcmp(tag, sstr("Else"))) {
-        return TAG_ELSE;
-    } else if(!sstrcmp(tag, sstr("Client"))) {
-        return TAG_CLIENT;
-    }
-    return -1;
-}

mercurial