--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/server/config/serverconf.c Mon Jan 16 14:06:52 2012 +0100 @@ -0,0 +1,111 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2011 Olaf Wintermann. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "serverconf.h" + +ServerConfig *load_server_config(char *file) { + FILE *in = fopen(file, "r"); + if(in == NULL) { + return NULL; + } + + ServerConfig *conf = malloc(sizeof(ServerConfig)); + conf->parser.parse = serverconf_parse; + conf->file = file; + conf->objects = ucx_map_new(8); + + conf->obj = NULL; + + int r = cfg_parse_basic_file((ConfigParser*)conf, in); + if(r != 0) { + // TODO: free + return NULL; + } + + return conf; +} + +void free_server_config(ServerConfig *conf) { + // TODO +} + +int serverconf_parse(void *p, ConfigLine *begin, ConfigLine *end, sstr_t line){ + ServerConfig *conf = p; + + begin->type = cfg_get_line_type(line); + switch(begin->type) { + case LINE_BEGIN_TAG: { + ConfigTag *tag = cfg_parse_begin_tag(line, conf->parser.mp); + + // create server config object + ServerConfigObject *obj = OBJ_NEW( + conf->parser.mp, + ServerConfigObject); + obj->type = tag->name; + obj->begin = begin; + obj->end = end; + obj->directives = NULL; + + // add object to server config + UcxList *list = ucx_map_sstr_get(conf->objects, obj->type); + list = ucx_list_append(list, obj); + ucx_map_sstr_put(conf->objects, obj->type, list); + conf->obj = obj; + + break; + } + case LINE_END_TAG: { + sstr_t tag = cfg_get_end_tag_name(line); + if(sstrcmp(tag, conf->obj->type) != 0) { + fprintf(stderr, "syntax error: wrong close tag\n"); + exit(-1); + } + conf->obj = NULL; + + break; + } + case LINE_DIRECTIVE: { + if(conf->obj == NULL) { + fprintf(stderr, "syntax error: directive outside of object\n"); + exit(-1); + } + + ConfigDirective *d = cfg_parse_directive(line, conf->parser.mp); + d->begin = begin; + d->end = end; + + //printf("%s.%s\n", conf->obj->type.ptr, d->directive_type.ptr); + conf->obj->directives = ucx_dlist_append(conf->obj->directives, d); + } + } + return 0; +}