--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/server/config/objconf.h Sun Jan 15 17:00:16 2012 +0100 @@ -0,0 +1,126 @@ +/* + * 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. + */ + +#ifndef OBJCONF_H +#define OBJCONF_H + +#include "conf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define TAG_OBJECT 0 +#define TAG_IF 1 +#define TAG_ELSEIF 2 +#define TAG_ELSE 3 +#define TAG_CLIENT 4 + + +typedef struct _conf_tag ConfigTag; +struct _conf_tag { + ConfigLine *begin; + ConfigLine *end; + + sstr_t name; + UcxList *param; + ConfigTag *parent; + ConfigTag *iftag; // only used by <ElseIf> and <Else> + int type_num; +}; + +typedef struct _conf_directive { + ConfigLine *begin; + ConfigLine *end; + + sstr_t directive_type; + UcxList *param; + ConfigTag *condition; + int type_num; +} ConfigDirective; + +typedef struct _conf_object { + ConfigLine *begin; + ConfigLine *end; + + sstr_t name; + sstr_t ppath; + ConfigTag *conditions; + // directives + UcxDlist *directives[6]; +} ConfigObject; + +/* + * representing a xml like level in the obj.conf tree + */ +typedef struct _conf_parser_level { + ConfigTag *iftag; // last if tag + ConfigTag *tag; // root of this level + int levelnum; +} ConfigParserLevel; + +typedef struct _obj_conf { + ConfigParser parser; + char *file; + UcxDlist *lines; + UcxDlist *conditions; + UcxDlist *objects; + + // private parser temp vars + ConfigObject *obj; // add directives to this object + UcxList *levels; // tree levels (stack) + +} ObjectConfig; + +ObjectConfig *load_object_config(char *file); + +int objconf_parse(void *p, ConfigLine *begin, ConfigLine *end, sstr_t line); + +int objconf_on_begin_tag(ObjectConfig *conf, ConfigTag *tag); + +int objconf_on_end_tag(ObjectConfig *conf, sstr_t tagname); + +int objconf_on_directive(ObjectConfig *conf, ConfigDirective *dir); + +int objconf_get_line_type(sstr_t line); + +ConfigTag* objconf_parse_begin_tag(sstr_t line, UcxMempool *mp); + +sstr_t objconf_get_end_tag_name(sstr_t line); + +ConfigDirective* objconf_parse_directive(sstr_t line, UcxMempool *mp); + +int objconf_get_tag_type(sstr_t tag); + + +#ifdef __cplusplus +} +#endif + +#endif /* OBJCONF_H */ +