7
7
* data structure representation the conf file representing
8
8
* the loadbalanced server pool.
10
* Version: $Id: parser.c,v 1.1.7 2004/04/04 23:28:05 acassen Exp $
10
* Version: $Id: parser.c,v 1.1.11 2005/03/01 01:22:13 acassen Exp $
12
12
* Author: Alexandre Cassen, <acassen@linux-vs.org>
21
21
* as published by the Free Software Foundation; either version
22
22
* 2 of the License, or (at your option) any later version.
24
* Copyright (C) 2001-2004 Alexandre Cassen, <acassen@linux-vs.org>
24
* Copyright (C) 2001-2005 Alexandre Cassen, <acassen@linux-vs.org>
27
27
#include "parser.h"
28
28
#include "memory.h"
31
36
static int sublevel = 0;
34
keyword_alloc(vector keywords, char *string, void (*handler) (vector))
39
keyword_alloc(vector keywords_vec, char *string, void (*handler) (vector))
36
41
struct keyword *keyword;
38
vector_alloc_slot(keywords);
43
vector_alloc_slot(keywords_vec);
40
45
keyword = (struct keyword *) MALLOC(sizeof (struct keyword));
41
46
keyword->string = string;
42
47
keyword->handler = handler;
44
vector_set_slot(keywords, keyword);
48
install_keyword_root(char *string, void (*handler) (vector))
50
keyword_alloc(keywords, string, handler);
54
install_sublevel(void)
60
install_sublevel_end(void)
66
install_keyword(char *string, void (*handler) (vector))
49
vector_set_slot(keywords_vec, keyword);
53
keyword_alloc_sub(vector keywords_vec, char *string, void (*handler) (vector))
69
56
struct keyword *keyword;
71
58
/* fetch last keyword */
72
keyword = VECTOR_SLOT(keywords, VECTOR_SIZE(keywords) - 1);
59
keyword = VECTOR_SLOT(keywords_vec, VECTOR_SIZE(keywords_vec) - 1);
74
61
/* position to last sub level */
75
62
for (i = 0; i < sublevel; i++)
84
71
keyword_alloc(keyword->sub, string, handler);
74
/* Exported helpers */
76
install_sublevel(void)
82
install_sublevel_end(void)
88
install_keyword_root(char *string, void (*handler) (vector))
90
keyword_alloc(keywords, string, handler);
94
install_keyword(char *string, void (*handler) (vector))
96
keyword_alloc_sub(keywords, string, handler);
88
100
dump_keywords(vector keydump, int level)
91
struct keyword *keyword;
103
struct keyword *keyword_vec;
93
105
for (i = 0; i < VECTOR_SIZE(keydump); i++) {
94
keyword = VECTOR_SLOT(keydump, i);
106
keyword_vec = VECTOR_SLOT(keydump, i);
95
107
for (j = 0; j < level; j++)
97
printf("Keyword : %s\n", keyword->string);
99
dump_keywords(keyword->sub, level + 1);
109
printf("Keyword : %s\n", keyword_vec->string);
110
if (keyword_vec->sub)
111
dump_keywords(keyword_vec->sub, level + 1);
104
free_keywords(vector keywords)
116
free_keywords(vector keywords_vec)
106
struct keyword *keyword;
118
struct keyword *keyword_vec;
109
for (i = 0; i < VECTOR_SIZE(keywords); i++) {
110
keyword = VECTOR_SLOT(keywords, i);
112
free_keywords(keyword->sub);
121
for (i = 0; i < VECTOR_SIZE(keywords_vec); i++) {
122
keyword_vec = VECTOR_SLOT(keywords_vec, i);
123
if (keyword_vec->sub)
124
free_keywords(keyword_vec->sub);
115
vector_free(keywords);
127
vector_free(keywords_vec);
119
131
alloc_strvec(char *string)
121
133
char *cp, *start, *token;
153
165
while (!isspace((int) *cp) && *cp != '\0' && *cp != '"')
156
token = MALLOC(strlen + 1);
157
memcpy(token, start, strlen);
158
*(token + strlen) = '\0';
167
str_len = cp - start;
168
token = MALLOC(str_len + 1);
169
memcpy(token, start, str_len);
170
*(token + str_len) = '\0';
161
173
/* Alloc & set the slot */
290
302
/* recursive configuration stream handler */
291
303
static int kw_level = 0;
293
process_stream(vector keywords)
305
process_stream(vector keywords_vec)
296
struct keyword *keyword;
308
struct keyword *keyword_vec;
301
buf = MALLOC(MAXBUF);
302
if (!read_line(buf, MAXBUF)) {
307
strvec = alloc_strvec(buf);
311
process_stream(keywords);
315
str = VECTOR_SLOT(strvec, 0);
317
if (!strcmp(str, EOB) && kw_level > 0) {
313
buf = zalloc(MAXBUF);
314
while (read_line(buf, MAXBUF)) {
315
strvec = alloc_strvec(buf);
316
memset(buf,0, MAXBUF);
321
str = VECTOR_SLOT(strvec, 0);
323
if (!strcmp(str, EOB) && kw_level > 0) {
328
for (i = 0; i < VECTOR_SIZE(keywords_vec); i++) {
329
keyword_vec = VECTOR_SLOT(keywords_vec, i);
331
if (!strcmp(keyword_vec->string, str)) {
332
if (keyword_vec->handler)
333
(*keyword_vec->handler) (strvec);
335
if (keyword_vec->sub) {
337
process_stream(keyword_vec->sub);
318
344
free_strvec(strvec);
322
for (i = 0; i < VECTOR_SIZE(keywords); i++) {
323
keyword = VECTOR_SLOT(keywords, i);
325
if (!strcmp(keyword->string, str)) {
326
if (keyword->handler)
327
(*keyword->handler) (strvec);
331
process_stream(keyword->sub);
339
process_stream(keywords);
342
351
/* Data initialization */
352
361
/* Init Keywords structure */
362
keywords = vector_alloc();
353
363
(*init_keywords) ();
355
365
/* Dump configuration *
356
vector_dump(keywords);
357
dump_keywords(keywords, 0);
366
vector_dump(keywords);
367
dump_keywords(keywords, 0);
360
370
/* Stream handling */