* also ignore .dll files
[olsrd.git] / src / cfgparser / oscan.lex
1 %{
2
3 /*
4  * The olsr.org Optimized Link-State Routing daemon(olsrd)
5  * Copyright (c) 2004, Andreas T√łnnesen(andreto@olsr.org)
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without 
9  * modification, are permitted provided that the following conditions 
10  * are met:
11  *
12  * * Redistributions of source code must retain the above copyright 
13  *   notice, this list of conditions and the following disclaimer.
14  * * Redistributions in binary form must reproduce the above copyright 
15  *   notice, this list of conditions and the following disclaimer in 
16  *   the documentation and/or other materials provided with the 
17  *   distribution.
18  * * Neither the name of olsr.org, olsrd nor the names of its 
19  *   contributors may be used to endorse or promote products derived 
20  *   from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
26  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
27  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
30  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
32  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
33  * POSSIBILITY OF SUCH DAMAGE.
34  *
35  * Visit http://www.olsr.org for more information.
36  *
37  * If you find this software useful feel free to make a donation
38  * to the project. For more information see the website or contact
39  * the copyright holders.
40  *
41  * $Id: oscan.lex,v 1.21 2006/04/17 18:31:09 kattemat Exp $
42  */
43
44
45 #define YYSTYPE struct conf_token *
46
47 #include <stdio.h>
48 #include <stdlib.h>
49 #include <string.h>
50 #include <sys/types.h>
51 #include <sys/socket.h>
52 #include <netinet/in.h>
53 #include <arpa/inet.h>
54
55 #include "olsrd_conf.h"
56
57 #include "oparse.h"
58
59 /* Prototypes */
60 int yyget_lineno(void);
61 FILE * yyget_in(void);
62 FILE* yyget_out(void);
63 int yyget_leng(void);
64 char *yyget_text(void);
65 void yyset_lineno(int);
66 void yyset_in(FILE *);
67 void yyset_out(FILE *);
68 int yyget_debug(void);
69 void yyset_debug(int);
70 int yylex_destroy(void);
71 int yylex(void);
72
73 struct conf_token *
74 get_conf_token(void);
75
76 struct conf_token *
77 get_conf_token()
78 {
79   struct conf_token *t = malloc(sizeof(struct conf_token));
80
81   if (t == NULL)
82     {
83       fprintf(stderr, "Cannot allocate %d bytes for an configuration token.\n",
84               (int) sizeof (struct conf_token));
85       exit(EXIT_FAILURE);
86     }
87
88   memset(t, 0, sizeof(struct conf_token));
89
90   return t;
91 }
92
93
94
95 %}
96
97 %option noyywrap
98
99 DECDIGIT [0-9]
100 FLOAT {DECDIGIT}+\.{DECDIGIT}+
101 HEXDIGIT [a-f][A-F][0-9]
102
103 IPV4ADDR ({DECDIGIT}){1,3}\.({DECDIGIT}){1,3}\.({DECDIGIT}){1,3}\.({DECDIGIT}){1,3}
104
105 HEXBYTE ([a-f]|[A-F]|[0-9]){1,4}
106
107 IP6PAT1 ({HEXBYTE}:){7}{HEXBYTE}
108 IP6PAT2 {HEXBYTE}::({HEXBYTE}:){0,5}{HEXBYTE}
109 IP6PAT3 ({HEXBYTE}:){2}:({HEXBYTE}:){0,4}{HEXBYTE}
110 IP6PAT4 ({HEXBYTE}:){3}:({HEXBYTE}:){0,3}{HEXBYTE}
111 IP6PAT5 ({HEXBYTE}:){4}:({HEXBYTE}:){0,2}{HEXBYTE}
112 IP6PAT6 ({HEXBYTE}:){5}:({HEXBYTE}:){0,1}{HEXBYTE}
113 IP6PAT7 ({HEXBYTE}:){6}:{HEXBYTE}
114 IP6PAT8 ({HEXBYTE}:){1,7}:
115 IP6PAT9 ::
116
117 IPV6ADDR {IP6PAT1}|{IP6PAT2}|{IP6PAT3}|{IP6PAT4}|{IP6PAT5}|{IP6PAT6}|{IP6PAT7}|{IP6PAT8}|{IP6PAT9}
118
119 %%
120
121 \s*"#".*\n {
122
123   current_line++;
124   return TOK_COMMENT;
125 }
126
127 \{ {
128   yylval = NULL;
129   return TOK_OPEN;
130 }
131
132 \} {
133   yylval = NULL;
134   return TOK_CLOSE;
135 }
136
137 \; {
138   yylval = NULL;
139   return TOK_SEMI;
140 }
141
142 \"[^\"]*\" {
143   yylval = get_conf_token();
144
145   yylval->string = malloc(yyleng - 1);
146
147   if (yylval->string == NULL)
148   {
149     fprintf(stderr,
150             "Cannot allocate %d bytes for string token data.\n", yyleng - 1);
151     yyterminate();
152   }
153
154   strncpy(yylval->string, yytext + 1, yyleng - 2);
155   yylval->string[yyleng - 2] = 0;
156
157   return TOK_STRING;
158 }
159
160 0x{HEXDIGIT}+ {
161   yylval = get_conf_token();
162
163   yylval->integer = strtol(yytext, NULL, 0);
164
165   return TOK_INTEGER;
166 }
167
168 {FLOAT} {
169   yylval = get_conf_token();
170
171   sscanf(yytext, "%f", &yylval->floating);
172   return TOK_FLOAT;
173 }
174
175 {IPV4ADDR} {
176   yylval = get_conf_token();
177   
178   yylval->string = malloc(yyleng + 1);
179   
180   if (yylval->string == NULL)
181     {
182       fprintf(stderr,
183               "Cannot allocate %d bytes for string token data.\n", yyleng + 1);
184       yyterminate();
185     }
186   
187   strncpy(yylval->string, yytext, yyleng+1);
188
189   return TOK_IP4_ADDR;
190 }
191
192
193
194 {IPV6ADDR} {
195
196   yylval = get_conf_token();
197   
198   yylval->string = malloc(yyleng+1);
199   
200   if (yylval->string == NULL)
201     {
202       fprintf(stderr,
203               "Cannot allocate %d bytes for string token data.\n", yyleng + 1);
204       yyterminate();
205     }
206   
207   strncpy(yylval->string, yytext, yyleng+1);
208   
209   return TOK_IP6_ADDR;
210 }
211
212 "default" {
213   yylval = NULL;
214   return TOK_DEFAULT;
215 }
216
217 {DECDIGIT}+ {
218
219   yylval = get_conf_token();
220
221   yylval->integer = atoi(yytext);
222
223   return TOK_INTEGER;
224
225 }
226
227
228 "yes"|"no" {
229   yylval = get_conf_token();
230
231   if (strncmp(yytext, "yes", 3) == 0)
232     yylval->boolean = OLSR_TRUE;
233
234   else
235     yylval->boolean = OLSR_FALSE;
236
237   return TOK_BOOLEAN;
238 }
239
240
241
242 "site-local"|"global" {
243   yylval = get_conf_token();
244
245   if (strncmp(yytext, "site-local", 10) == 0)
246     yylval->boolean = OLSR_TRUE;
247
248   else
249     yylval->boolean = OLSR_FALSE;
250
251   return TOK_IP6TYPE;
252 }
253
254 "Host" {
255   yylval = NULL;
256   return TOK_HOSTLABEL;
257 }
258
259 "Net" {
260   yylval = NULL;
261   return TOK_NETLABEL;
262 }
263
264 "MaxConnections" {
265   yylval = NULL;
266   return TOK_MAXIPC;
267 }
268
269 "DebugLevel" {
270   yylval = NULL;
271   return TOK_DEBUGLEVEL;
272 }
273
274 "IpVersion" {
275   yylval = NULL;
276   return TOK_IPVERSION;
277 }
278
279 "NicChgsPollInt" {
280   yylval = NULL;
281   return TOK_NICCHGSPOLLRT;
282 }
283
284 "Hna4" {
285   yylval = NULL;
286   return TOK_HNA4;
287 }
288
289 "Hna6" {
290   yylval = NULL;
291   return TOK_HNA6;
292 }
293
294 "LoadPlugin" {
295   yylval = NULL;
296   return TOK_PLUGIN;
297 }
298
299 "PlName" {
300   yylval = NULL;
301   return TOK_PLNAME;
302 }
303
304 "PlParam" {
305   yylval = NULL;
306   return TOK_PLPARAM;
307 }
308
309 "Interface" {
310   yylval = NULL;
311   return TOK_INTERFACE;
312 }
313
314 "AllowNoInt" {
315   yylval = NULL;
316   return TOK_NOINT;
317 }
318
319 "TosValue" {
320   yylval = NULL;
321   return TOK_TOS;
322 }
323
324 "Willingness" {
325   yylval = NULL;
326   return TOK_WILLINGNESS;
327 }
328
329 "IpcConnect" {
330   yylval = NULL;
331   return TOK_IPCCON;
332 }
333
334 "UseHysteresis" {
335   yylval = NULL;
336   return TOK_USEHYST;
337 }
338
339 "HystScaling" {
340   yylval = NULL;
341   return TOK_HYSTSCALE;
342 }
343
344 "HystThrHigh" {
345   yylval = NULL;
346   return TOK_HYSTUPPER;
347 }
348
349 "HystThrLow" {
350   yylval = NULL;
351   return TOK_HYSTLOWER;
352 }
353
354 "Pollrate" {
355   yylval = NULL;
356   return TOK_POLLRATE;
357 }
358
359
360 "TcRedundancy" {
361   yylval = NULL;
362   return TOK_TCREDUNDANCY;
363 }
364
365 "MprCoverage" {
366   yylval = NULL;
367   return TOK_MPRCOVERAGE;
368 }
369
370 "LinkQualityLevel" {
371   yylval = NULL;
372   return TOK_LQ_LEVEL;
373 }
374
375 "LinkQualityFishEye" {
376   yylval = NULL;
377   return TOK_LQ_FISH;
378 }
379
380 "LinkQualityDijkstraLimit" {
381   yylval = NULL;
382   return TOK_LQ_DLIMIT;
383 }
384
385 "LinkQualityWinSize" {
386   yylval = NULL;
387   return TOK_LQ_WSIZE;
388 }
389
390 "LinkQualityMult" {
391   yylval = NULL;
392   return TOK_LQ_MULT;
393 }
394
395 "ClearScreen" {
396   yylval = NULL;
397   return TOK_CLEAR_SCREEN;
398 }
399
400 "Weight" {
401   yylval = NULL;
402   return TOK_IFWEIGHT;
403 }
404
405 "Ip4Broadcast" {
406   yylval = NULL;
407   return TOK_IP4BROADCAST;
408 }
409 "Ip6AddrType" {
410   yylval = NULL;
411   return TOK_IP6ADDRTYPE;
412 }
413 "Ip6MulticastSite" {
414   yylval = NULL;
415   return TOK_IP6MULTISITE;
416 }
417 "Ip6MulticastGlobal" {
418   yylval = NULL;
419   return TOK_IP6MULTIGLOBAL;
420 }
421 "HelloInterval" {
422   yylval = NULL;
423   return TOK_HELLOINT;
424 }
425 "HelloValidityTime" {
426   yylval = NULL;
427   return TOK_HELLOVAL;
428 }
429 "TcInterval" {
430   yylval = NULL;
431   return TOK_TCINT;
432 }
433 "TcValidityTime" {
434   yylval = NULL;
435   return TOK_TCVAL;
436 }
437 "MidInterval" {
438   yylval = NULL;
439   return TOK_MIDINT;
440 }
441 "MidValidityTime" {
442   yylval = NULL;
443   return TOK_MIDVAL;
444 }
445 "HnaInterval" {
446   yylval = NULL;
447   return TOK_HNAINT;
448 }
449 "HnaValidityTime" {
450   yylval = NULL;
451   return TOK_HNAVAL;
452 }
453 "AutoDetectChanges" {
454   yylval = NULL;
455   return TOK_AUTODETCHG;
456 }
457
458
459 \n|\r\n {
460   current_line++;
461 }
462
463 \ |\t
464
465 . {
466   /* Do nothing */
467   //fprintf(stderr, "Failed to parse line %d of configuration file.\n",
468   //      current_line);
469   //yyterminate();
470   //yy_fatal_error("Parsing failed.\n");
471
472   /* To avoid compiler warning (stupid...) */
473   if(0)
474     yyunput(0, NULL);
475 }
476
477 %%