pkg: fix wrong package name, closes FS#148, reported from Andrew Pogrebennyk
[sip-router] / cfg_parser.h
1 /*
2  * $Id$
3  * Standalone Configuration File Parser
4  *
5  * Copyright (C) 2008 iptelorg GmbH
6  * Written by Jan Janak <jan@iptel.org>
7  *
8  * This file is part of SER, a free SIP server.
9  *
10  * SER is free software; you can redistribute it and/or modify it under the
11  * terms of the GNU General Public License as published by the Free Software
12  * Foundation; either version 2 of the License, or (at your option) any later
13  * version.
14  *
15  * SER is distributed in the hope that it will be useful, but WITHOUT ANY
16  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
18  * details.
19  *
20  * You should have received a copy of the GNU General Public License along
21  * with this program; if not, write to the Free Software Foundation, Inc., 
22  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23  */
24
25 /*!
26  * \file
27  * \brief SIP-router core :: Standalone Configuration File Parser
28  *
29  * \ingroup core
30  * Module: \ref core
31  *
32  * See \ref ConfigEngine
33  */
34
35 #ifndef _CFG_PARSER_H
36 #define _CFG_PARSER_H
37
38 #include "str.h"
39 #include <stdio.h>
40
41 #define MAX_TOKEN_LEN 512 /*!< Token names cannot be longer than this value */
42
43
44 /*! \brief Configuration flags */
45 typedef enum cfg_flags {
46         /*! \brief Extended tokens can contain also delimiters, in addition to
47          * alpha-numeric characters, this is used on the righ side of assignments
48          * where no quotes are used.
49          */
50         CFG_EXTENDED_ALPHA = (1 << 0),
51
52         /*! \brief The parser performs case-insensitive comparisons of token strings by
53          * default. The parser will use case-sensitive comparison instead if this
54          * flag is set.
55          */
56         CFG_CASE_SENSITIVE = (1 << 1), 
57
58         /*! \brief This is a flag that can be set in the last element of cfg_option
59          * arrays (this is the one with 0 as token name). When this flag is set
60          * then the value or parsing function of the element will be used for
61          * options that do not match any other element in the array.
62          */
63         CFG_DEFAULT = (1 << 2),
64
65
66         /*! \brief When this flag is set then the name of the options is a prefix and all
67          * options that have the same prefix will be matched by this entry.
68          */
69         CFG_PREFIX = (1 << 3),
70
71         /*! \brief The result of cfg_parse_str_val will be in a buffer allocated by
72          * pkg_malloc, if the destination varaiable contains a pointer to a buffer
73          * already then it will be freed with pkg_free first.
74          */
75         CFG_STR_PKGMEM = (1 << 4),
76
77         /*! \brief The result of cfg_parse_str_val will be in a buffer allocated by
78          * shm_malloc, if the destination variable contains a pointer to a buffer
79          * already then it will be freed with shm_free first.
80          */
81         CFG_STR_SHMMEM = (1 << 5),
82
83         /*! \brief The result of cfg_parse_str_val will be in a buffer allocated by
84          * malloc, if the destination variable contains a pointer to a buffer
85          * already then it will be freed with free first.
86          */
87         CFG_STR_MALLOC = (1 << 6),
88
89         /*! \brief The result of cfg_parse_str_val will be copied into a pre-allocated
90          * buffer with a fixed size, a pointer to str variable which contains the
91          * buffer and its size is passed to the function in parameter 'param'.
92          */
93         CFG_STR_STATIC = (1 << 7),
94
95 } cfg_flags_t;
96
97
98 enum cfg_token_type {
99         CFG_TOKEN_EOF    = -1,
100         CFG_TOKEN_ALPHA  = -2,
101         CFG_TOKEN_STRING = -3
102 };
103
104
105 /*! \brief Structure representing a lexical token */
106 typedef struct cfg_token {
107         char buf [MAX_TOKEN_LEN];
108         int type;  /*!< Token type */
109         str val;   /*!< Token value */
110         struct {   /*!< Position of first and last character of token in file */
111                 int line; /*!< The starting/ending line of the token */
112                 int col;  /*!< The starting/ending column of the token */
113         } start, end;
114 } cfg_token_t;
115
116
117 struct cfg_parser;
118
119 typedef int (*cfg_func_f)(void* param, struct cfg_parser* st,
120                                                   unsigned int flags);
121
122
123 /*! \brief Token mapping structure.
124  *
125  * This structure is used to map tokens to values or function calls. Arrays of
126  * such structures are typically provided by the caller of the parser.
127  */
128 typedef struct cfg_option {
129         char* name;    /*!< Token name */
130         unsigned int flags;
131         void* param;   /*!< Pointer to the destination variable */
132         int val;       /*!< Value */
133         cfg_func_f f;  /*!< Parser function to be called */
134 } cfg_option_t;
135
136
137 /*! \brief Parser state */
138 typedef struct cfg_parser {
139         FILE* f;                 /*!< Handle of the currently open file */
140         char* file;              /*!< Current file name */
141         int line;                /*!< Current line */
142         int col;                 /*!< Column index */
143         struct cfg_option* options; /*!< Array of supported options */
144         struct {
145                 cfg_func_f parser;   /*!< Section parser function */
146                 void* param;         /*!< Parameter value for the parser function */
147         } section;
148         struct cfg_token* cur_opt; /*!< Current option */
149 } cfg_parser_t;
150
151
152 extern struct cfg_option cfg_bool_values[];
153
154 struct cfg_parser* cfg_parser_init(str* basedir, str* filename);
155
156 void cfg_section_parser(struct cfg_parser* st, cfg_func_f parser, void* param);
157
158 void cfg_set_options(struct cfg_parser* st, struct cfg_option* options);
159
160 int sr_cfg_parse(struct cfg_parser* st);
161
162 void cfg_parser_close(struct cfg_parser* st);
163
164 struct cfg_option* cfg_lookup_token(struct cfg_option* options, str* token);
165
166 /*! ! \brief Interface to the lexical scanner */
167 int cfg_get_token(struct cfg_token* token, struct cfg_parser* st, unsigned int flags);
168
169 /* Commonly needed parser functions */
170
171 int cfg_eat_equal(struct cfg_parser* st, unsigned int flags);
172
173 int cfg_eat_eol(struct cfg_parser* st, unsigned int flags);
174
175 /*! \brief Parse section identifier of form [section]. The function expects parameter
176  * param to be of type (str*). The result string is allocated using pkg_malloc
177  * and is zero terminated. To free the memory use pkg_free(((str*)param)->s)
178  */
179 int cfg_parse_section(void* param, struct cfg_parser* st, unsigned int flags);
180
181 /*! \brief Parse string parameter value, either quoted or unquoted */
182 int cfg_parse_str_opt(void* param, struct cfg_parser* st, unsigned int flags);
183
184 int cfg_parse_str(void* param, struct cfg_parser* st, unsigned int flags);
185
186 int cfg_parse_enum_opt(void* param, struct cfg_parser* st, unsigned int flags);
187
188 int cfg_parse_enum(void* param, struct cfg_parser* st, unsigned int flags);
189
190 /*! \brief Parser integer parameter value */
191 int cfg_parse_int_opt(void* param, struct cfg_parser* st, unsigned int flags);
192
193 int cfg_parse_int(void* param, struct cfg_parser* st, unsigned int flags);
194
195 /*! \brief Parse boolean parameter value */
196 int cfg_parse_bool_opt(void* param, struct cfg_parser* st, unsigned int flags);
197
198 int cfg_parse_bool(void* param, struct cfg_parser* st, unsigned int flags);
199
200 #endif /* _CFG_PARSER_H */