3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18 * $Id: ircd_lexer.l 3540 2007-07-30 17:26:00Z jilles $
21 %option case-insensitive
26 #include <sys/types.h>
29 #include <netinet/in.h>
35 #define WE_ARE_MEMORY_C
38 #include "ircd_defs.h"
49 #define MAX_INCLUDE_DEPTH 10
51 YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
52 int include_stack_ptr=0;
56 void hashcomment(void);
58 int lineno_stack[MAX_INCLUDE_DEPTH];
59 char conffile_stack[MAX_INCLUDE_DEPTH][IRCD_BUFSIZE];
60 char conffilebuf[IRCD_BUFSIZE+1];
61 char *current_file = conffilebuf;
63 FILE *inc_fbfile_in[MAX_INCLUDE_DEPTH];
69 #define YY_FATAL_ERROR(msg) conf_yy_fatal_error(msg)
71 #define YY_INPUT(buf,result,max_size) \
72 if (!(result = conf_fgets(buf, max_size, conf_fbfile_in))) \
73 YY_FATAL_ERROR("input in flex scanner failed");
79 qstring \"[^\"\n]*[\"\n]
80 string [a-zA-Z_\~\:][a-zA-Z0-9_\:]*
81 include \.include{ws}(\<.*\>|\".*\")
84 {include} { cinclude(); }
86 \n.* { strcpy(linebuf, yytext+1); lineno++; yyless(1); }
89 {comment} { hashcomment(); }
91 {digit}+ { yylval.number = atoi(yytext); return NUMBER; }
94 if(yytext[yyleng-2] == '\\')
96 yyless(yyleng-1); /* return last quote */
97 yymore(); /* append next string */
101 strcpy(yylval.string, yytext + 1);
102 if(yylval.string[yyleng-2] != '"')
103 ilog(L_MAIN, "Unterminated character string");
107 yylval.string[yyleng-2] = '\0'; /* remove close
111 for (j=i=0 ;yylval.string[i] != '\0'; i++,j++)
113 if (yylval.string[i] != '\\')
115 yylval.string[j] = yylval.string[i];
120 if (yylval.string[i] == '\0') /* XXX
126 "Unterminated character string");
129 yylval.string[j] = yylval.string[i];
132 yylval.string[j] = '\0';
139 loadmodule { return LOADMODULE; }
141 strcpy(yylval.string, yytext);
142 yylval.string[yyleng] = '\0';
146 \.\. { return TWODOTS; }
147 . { return yytext[0]; }
148 <<EOF>> { if (ieof()) yyterminate(); }
151 /* C-comment ignoring routine -kre*/
156 /* log(L_NOTICE, "got comment"); */
159 while ((c = input()) != '*' && c != EOF)
160 if (c == '\n') ++lineno;
163 while ((c = input()) == '*');
166 if (c == '\n') ++lineno;
170 YY_FATAL_ERROR("EOF in comment");
171 /* XXX hack alert this disables
172 * the stupid unused function warning
175 yy_fatal_error("EOF in comment");
184 if ((c = strchr(yytext, '<')) == NULL)
185 *strchr(c = strchr(yytext, '"') + 1, '"') = 0;
187 *strchr(++c, '>') = 0;
189 /* do stacking and co. */
190 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
191 conf_report_error("Includes nested too deep (max is %d)", MAX_INCLUDE_DEPTH);
196 tmp_fbfile_in = fopen(c, "r");
198 if (tmp_fbfile_in == NULL)
200 /* if its not found in PREFIX, look in ETCPATH */
201 char fnamebuf[IRCD_BUFSIZE];
203 snprintf(fnamebuf, sizeof(fnamebuf), "%s/%s", ETCPATH, c);
204 tmp_fbfile_in = fopen(fnamebuf, "r");
206 /* wasnt found there either.. error. */
207 if(tmp_fbfile_in == NULL)
209 conf_report_error("Include %s: %s.", c, strerror(errno));
213 lineno_stack[include_stack_ptr] = lineno;
215 inc_fbfile_in[include_stack_ptr] = conf_fbfile_in;
216 strcpy(conffile_stack[include_stack_ptr], c);
217 current_file = conffile_stack[include_stack_ptr];
218 include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER;
219 conf_fbfile_in = tmp_fbfile_in;
220 yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
226 if (include_stack_ptr)
227 fclose(conf_fbfile_in);
228 if (--include_stack_ptr < 0)
230 /* We will now exit the lexer - restore init values if we get /rehash
231 * later and reenter lexer -kre */
232 include_stack_ptr = 0;
237 yy_delete_buffer(YY_CURRENT_BUFFER);
238 lineno = lineno_stack[include_stack_ptr];
239 conf_fbfile_in = inc_fbfile_in[include_stack_ptr];
241 if(include_stack_ptr)
242 current_file = conffile_stack[include_stack_ptr];
244 current_file = conffilebuf;
246 yy_switch_to_buffer(include_stack[include_stack_ptr]);
250 /* #-comment style, look for #include */
251 #define INCLUDE "#include"
253 void hashcomment(void)
255 if (strlen(yytext) < sizeof(INCLUDE) - 1)
258 if (!strncasecmp(yytext, INCLUDE, sizeof(INCLUDE) - 1))
259 yyerror("You probably meant '.include', skipping");