ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/hopm/trunk/src/config-lexer.l
Revision: 7748
Committed: Sat Oct 1 18:51:54 2016 UTC (9 years, 9 months ago) by michael
File size: 11606 byte(s)
Log Message:
- config-lexer.l: redo C comment processing

File Contents

# User Rev Content
1 michael 5052 /*
2 michael 5351 * Copyright (c) 2002 Erik Fears
3 michael 7005 * Copyright (c) 2014-2016 ircd-hybrid development team
4 michael 5052 *
5 michael 5351 * This program is free software; you can redistribute it and/or modify
6     * it under the terms of the GNU General Public License as published by
7     * the Free Software Foundation; either version 2 of the License, or
8     * (at your option) any later version.
9 michael 5052 *
10 michael 5351 * This program is distributed in the hope that it will be useful,
11     * but WITHOUT ANY WARRANTY; without even the implied warranty of
12     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13     * GNU General Public License for more details.
14 michael 5052 *
15 michael 5351 * You should have received a copy of the GNU General Public License
16     * along with this program; if not, write to the Free Software
17     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
18     * USA
19 michael 5052 */
20    
21     %option case-insensitive
22     %option noyywrap
23     %option nounput
24 michael 5687 %option never-interactive
25 michael 5052
26 michael 7748 %x IN_COMMENT
27    
28 michael 5052 %{
29     #include <stdio.h>
30     #include <string.h>
31 michael 5078
32     #include "compat.h"
33 michael 5052 #include "config.h"
34 michael 7711 #include "config-parser.h" /* autogenerated header file */
35     #include "log.h"
36 michael 5052
37 michael 7719 #undef YY_FATAL_ERROR
38     #define YY_FATAL_ERROR(msg) conf_yy_fatal_error(msg)
39 michael 5052
40 michael 7711 #undef YY_INPUT
41     #define YY_INPUT(buf,result,max_size) \
42     if (!(result = conf_yy_input(buf, max_size))) \
43     YY_FATAL_ERROR("input in flex scanner failed");
44     #define MAX_INCLUDE_DEPTH 10
45 michael 5052
46 michael 7711
47     unsigned int lineno = 1;
48 michael 5052 char linebuf[512];
49 michael 7711 char conffilebuf[512];
50 michael 5052
51 michael 7711 static struct included_file
52     {
53     YY_BUFFER_STATE state;
54     unsigned int lineno;
55     FILE *file;
56     char conffile[512];
57     } include_stack[MAX_INCLUDE_DEPTH];
58    
59     static unsigned int include_stack_ptr;
60    
61    
62     static void conf_include(void);
63     static int conf_eof(void);
64    
65     static int
66     conf_yy_input(char *lbuf, unsigned int max_size)
67     {
68 michael 7719 return fgets(lbuf, max_size, conf_file) == NULL ? 0 : strlen(lbuf);
69 michael 7711 }
70    
71 michael 7719 static int
72     conf_yy_fatal_error(const char *msg)
73     {
74     return 0;
75     }
76 michael 5052 %}
77    
78 michael 7716 WS [[:blank:]]*
79     DIGIT [[:digit:]]+
80     COMMENT ("//"|"#").*
81     qstring \"[^\"\n]*[\"\n]
82     include \.include{WS}(\<.*\>|\".*\")
83 michael 5052
84     %%
85 michael 7748
86     "/*" { BEGIN IN_COMMENT; }
87     <IN_COMMENT>"*/" { BEGIN INITIAL; }
88     <IN_COMMENT>. ; /* Eat everything but a newline */
89     <IN_COMMENT>\n { ++lineno; }
90     <IN_COMMENT><<EOF>> { BEGIN INITIAL; if (conf_eof()) yyterminate(); }
91    
92 michael 7716 {include} { conf_include(); }
93     \n.* { strlcpy(linebuf, yytext + 1, sizeof(linebuf)); ++lineno; yyless(1); }
94     {WS} ;
95     {COMMENT} ;
96     {DIGIT} { yylval.number = atoi(yytext); return NUMBER; }
97     {qstring} { if (yytext[yyleng - 2] == '\\')
98     {
99     yyless(yyleng - 1); /* Return last quote */
100     yymore(); /* Append next string */
101     }
102     else
103     {
104     yylval.string = yytext + 1;
105 michael 5052
106 michael 7716 if (yylval.string[yyleng - 2] != '"')
107     log_printf("CONFIG ->Unterminated character string");
108     else
109     {
110     unsigned int i = 0, j = 0;
111 michael 5052
112 michael 7716 yylval.string[yyleng - 2] = '\0'; /* Remove close quote */
113 michael 5052
114 michael 7716 for (; yylval.string[i] != '\0'; ++i, ++j)
115     {
116     if (yylval.string[i] != '\\')
117     yylval.string[j] = yylval.string[i];
118     else
119     {
120     ++i;
121 michael 5052
122 michael 7716 if (yylval.string[i] == '\0') /* XXX: should not happen */
123     {
124     log_printf("CONFIG -> Unterminated character string");
125     break;
126     }
127 michael 5052
128 michael 7716 yylval.string[j] = yylval.string[i];
129 michael 5052 }
130 michael 7716 }
131 michael 5052
132 michael 7716 yylval.string[j] = '\0';
133     return STRING;
134     }
135     }
136     }
137    
138 michael 5052 AWAY { return AWAY; }
139     BAN_UNKNOWN { return BAN_UNKNOWN; }
140     BLACKLIST { return BLACKLIST; }
141     CHANNEL { return CHANNEL; }
142 michael 7014 COMMAND_INTERVAL { return COMMAND_INTERVAL; }
143     COMMAND_QUEUE_SIZE { return COMMAND_QUEUE_SIZE; }
144     COMMAND_TIMEOUT { return COMMAND_TIMEOUT; }
145 michael 5052 CONNREGEX { return CONNREGEX; }
146     DNS_FDLIMIT { return DNS_FDLIMIT; }
147 michael 6200 DNS_TIMEOUT { return DNS_TIMEOUT; }
148 michael 5052 DNSBL_FROM { return DNSBL_FROM; }
149     DNSBL_TO { return DNSBL_TO; }
150     EXEMPT { return EXEMPT; }
151     FD { return FD; }
152     INVITE { return INVITE; }
153     IRC { return IRC; }
154     KLINE { return KLINE; }
155     KEY { return KEY; }
156     MASK { return MASK; }
157     MAX_READ { return MAX_READ; }
158     MODE { return MODE; }
159     NAME { return NAME; }
160     NEGCACHE { return NEGCACHE; }
161 michael 5332 NEGCACHE_REBUILD { return NEGCACHE_REBUILD; }
162 michael 5052 NICK { return NICK; }
163     NICKSERV { return NICKSERV; }
164 michael 5405 NOTICE { return NOTICE; }
165 michael 5052 OPER { return OPER; }
166     OPM { return OPM; }
167     OPTIONS { return OPTIONS; }
168     PASSWORD { return PASSWORD; }
169     PERFORM { return PERFORM; }
170     PIDFILE { return PIDFILE; }
171     PORT { return PORT; }
172     PROTOCOL { return PROTOCOL; }
173 michael 5198 READTIMEOUT { return READTIMEOUT; }
174 michael 5052 REALNAME { return REALNAME; }
175 michael 6078 RECONNECTINTERVAL { return RECONNECTINTERVAL; }
176 michael 5052 REPLY { return REPLY; }
177     SCANLOG { return SCANLOG; }
178     SCANNER { return SCANNER; }
179     SENDMAIL { return SENDMAIL; }
180     SERVER { return SERVER; }
181     TARGET_IP { return TARGET_IP; }
182     TARGET_PORT { return TARGET_PORT; }
183     TARGET_STRING { return TARGET_STRING;}
184     TIMEOUT { return TIMEOUT; }
185     TYPE { return TYPE; }
186     USER { return USER; }
187     USERNAME { return USERNAME; }
188     VHOST { return VHOST; }
189    
190 michael 5080 years { return YEARS; }
191     year { return YEARS; }
192     months { return MONTHS; }
193     month { return MONTHS; }
194     weeks { return WEEKS; }
195     week { return WEEKS; }
196     days { return DAYS; }
197     day { return DAYS; }
198     hours { return HOURS; }
199     hour { return HOURS; }
200     minutes { return MINUTES; }
201     minute { return MINUTES; }
202     seconds { return SECONDS; }
203     second { return SECONDS; }
204 michael 5052
205 michael 5080 bytes { return BYTES; }
206     byte { return BYTES; }
207     kilobytes { return KBYTES; }
208     kilobyte { return KBYTES; }
209     kbytes { return KBYTES; }
210     kbyte { return KBYTES; }
211     kb { return KBYTES; }
212     megabytes { return MBYTES; }
213     megabyte { return MBYTES; }
214     mbytes { return MBYTES; }
215     mbyte { return MBYTES; }
216     mb { return MBYTES; }
217    
218 michael 5052 HTTP {
219     yylval.number = OPM_TYPE_HTTP;
220     return PROTOCOLTYPE;
221     }
222    
223     HTTPPOST {
224     yylval.number = OPM_TYPE_HTTPPOST;
225     return PROTOCOLTYPE;
226     }
227    
228 michael 6222 HTTPS {
229     yylval.number = OPM_TYPE_HTTPS;
230     return PROTOCOLTYPE;
231     }
232    
233     HTTPSPOST {
234     yylval.number = OPM_TYPE_HTTPSPOST;
235     return PROTOCOLTYPE;
236     }
237    
238 michael 5052 SOCKS4 {
239     yylval.number = OPM_TYPE_SOCKS4;
240     return PROTOCOLTYPE;
241     }
242    
243     SOCKS5 {
244     yylval.number = OPM_TYPE_SOCKS5;
245     return PROTOCOLTYPE;
246     }
247    
248     WINGATE {
249     yylval.number = OPM_TYPE_WINGATE;
250     return PROTOCOLTYPE;
251     }
252    
253     ROUTER {
254     yylval.number = OPM_TYPE_ROUTER;
255     return PROTOCOLTYPE;
256     }
257    
258 michael 5998 DREAMBOX {
259     yylval.number = OPM_TYPE_DREAMBOX;
260     return PROTOCOLTYPE;
261     }
262 michael 5052
263 michael 5998
264 michael 5052 TRUE {
265     yylval.number=1;
266     return NUMBER;
267     }
268     YES {
269     yylval.number=1;
270     return NUMBER;
271     }
272     ON {
273     yylval.number=1;
274     return NUMBER;
275     }
276    
277    
278    
279     FALSE {
280     yylval.number=0;
281     return NUMBER;
282     }
283    
284     NO {
285     yylval.number=0;
286     return NUMBER;
287     }
288    
289     OFF {
290     yylval.number=0;
291     return NUMBER;
292     }
293    
294 michael 7716 . { return yytext[0]; }
295 michael 7711 <<EOF>> { if (conf_eof()) yyterminate(); }
296 michael 5052
297     %%
298    
299 michael 6046 static void
300 michael 7711 conf_include(void)
301     {
302     char *p = NULL;
303     char filenamebuf[512];
304    
305     if ((p = strchr(yytext, '<')) == NULL)
306     *strchr(p = strchr(yytext, '"') + 1, '"') = '\0';
307     else
308     *strchr(++p, '>') = '\0';
309    
310     /* do stacking and co. */
311     if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
312     {
313     log_printf("CONFIG -> Includes nested too deep in %s", p);
314     return;
315     }
316    
317     if (*p == '/') /* if it is an absolute path */
318     snprintf(filenamebuf, sizeof(filenamebuf), "%s", p);
319     else
320     snprintf(filenamebuf, sizeof(filenamebuf), "%s/%s", HOPM_ETCDIR, p);
321    
322     FILE *tmp_fbfile_in = fopen(filenamebuf, "r");
323     if (!tmp_fbfile_in)
324     {
325     log_printf("CONFIG -> Unable to read configuration file '%s': %s",
326     filenamebuf, strerror(errno));
327     return;
328     }
329    
330     struct included_file *file = &include_stack[include_stack_ptr++];
331     file->lineno = lineno;
332     file->file = conf_file;
333     file->state = YY_CURRENT_BUFFER;
334     strlcpy(file->conffile, conffilebuf, sizeof(file->conffile));
335    
336     lineno = 1;
337     conf_file = tmp_fbfile_in;
338 michael 7742 strlcpy(conffilebuf, filenamebuf, sizeof(conffilebuf));
339 michael 7711
340 michael 7729 yy_switch_to_buffer(yy_create_buffer(NULL, YY_BUF_SIZE));
341 michael 7711 }
342    
343     static int
344     conf_eof(void)
345     {
346     if (include_stack_ptr == 0)
347     {
348     lineno = 1;
349     return 1;
350     }
351    
352     /* switch buffer */
353     struct included_file *file = &include_stack[--include_stack_ptr];
354    
355     /* close current file */
356     fclose(conf_file);
357    
358     /* switch buffers */
359     yy_delete_buffer(YY_CURRENT_BUFFER);
360     yy_switch_to_buffer(file->state);
361    
362     /* switch lineno */
363     lineno = file->lineno;
364    
365     /* switch file */
366     conf_file = file->file;
367    
368     strlcpy(conffilebuf, file->conffile, sizeof(conffilebuf));
369     return 0;
370     }

Properties

Name Value
svn:eol-style native
svn:keywords Id