2 /* FreeS/WAN config file parser (parser.l)
3 * Copyright (C) 2001 Mathieu Lafon - Arkoon Network Security
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 * RCSID $Id: parser.l,v 1.5 2006/03/28 22:32:33 as Exp $
24 #define MAX_INCLUDE_DEPTH 20
27 extern void yyerror(const char *);
28 extern int yylex (void);
32 YY_BUFFER_STATE stack[MAX_INCLUDE_DEPTH];
33 FILE *file[MAX_INCLUDE_DEPTH];
34 unsigned int line[MAX_INCLUDE_DEPTH];
35 char *filename[MAX_INCLUDE_DEPTH];
38 void _parser_y_error(char *b, int size, const char *s);
39 void _parser_y_init (const char *f);
40 void _parser_y_fini (void);
41 int _parser_y_include (const char *filename);
43 void _parser_y_error(char *b, int size, const char *s)
45 extern char *yytext; // was: char yytext[];
47 snprintf(b, size, "%s:%d: %s [%s]",
48 __parser_y_private.filename[__parser_y_private.stack_ptr],
49 __parser_y_private.line[__parser_y_private.stack_ptr],
53 void _parser_y_init (const char *f)
55 memset(&__parser_y_private, 0, sizeof(__parser_y_private));
56 __parser_y_private.line[0] = 1;
57 __parser_y_private.filename[0] = strdup(f);
60 void _parser_y_fini (void)
64 for (i = 0; i < MAX_INCLUDE_DEPTH; i++)
66 if (__parser_y_private.filename[i])
67 free(__parser_y_private.filename[i]);
68 if (__parser_y_private.file[i])
69 fclose(__parser_y_private.file[i]);
71 memset(&__parser_y_private, 0, sizeof(__parser_y_private));
74 int _parser_y_include (const char *filename)
79 ret = glob(filename, GLOB_ERR, NULL, &files);
87 err = "include files ran out of memory";
90 err = "include files aborted due to read error";
93 err = "include files found no matches";
96 err = "unknown include files error";
102 for (i = 0; i < files.gl_pathc; i++)
105 unsigned int p = __parser_y_private.stack_ptr + 1;
107 if (p >= MAX_INCLUDE_DEPTH)
109 yyerror("max inclusion depth reached");
113 f = fopen(files.gl_pathv[i], "r");
116 yyerror("can't open include filename");
120 __parser_y_private.stack_ptr++;
121 __parser_y_private.file[p] = f;
122 __parser_y_private.stack[p] = YY_CURRENT_BUFFER;
123 __parser_y_private.line[p] = 1;
124 __parser_y_private.filename[p] = strdup(files.gl_pathv[i]);
126 yy_switch_to_buffer(yy_create_buffer(f, YY_BUF_SIZE));
137 if (__parser_y_private.filename[__parser_y_private.stack_ptr]) {
138 free(__parser_y_private.filename[__parser_y_private.stack_ptr]);
139 __parser_y_private.filename[__parser_y_private.stack_ptr] = NULL;
141 if (__parser_y_private.file[__parser_y_private.stack_ptr]) {
142 fclose(__parser_y_private.file[__parser_y_private.stack_ptr]);
143 __parser_y_private.file[__parser_y_private.stack_ptr] = NULL;
144 yy_delete_buffer (YY_CURRENT_BUFFER);
146 (__parser_y_private.stack[__parser_y_private.stack_ptr]);
148 if (--__parser_y_private.stack_ptr < 0) {
153 ^[\t ]+ return FIRST_SPACES;
155 [\t ]+ /* ignore spaces in line */ ;
160 __parser_y_private.line[__parser_y_private.stack_ptr]++;
164 config return CONFIG;
168 include return INCLUDE;
169 version return FILE_VERSION;
172 yylval.s = strdup(yytext);
177 yylval.s = strdup(yytext+1);
178 if (yylval.s) yylval.s[strlen(yylval.s)-1]='\0';