diff -r a9bbd82d2dce -r d2a97bbeb57d src/server/config/objconf.c --- 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;iname = 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: - 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;idirective_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; -}