cd32baf25f9a888ee31938c0c2fdff7503576ec6
[olsrd.git] / src / cfgparser / oscan.lex
1 %{
2
3 /*
4  * The olsr.org Optimized Link-State Routing daemon(olsrd)
5  * Copyright (c) 2004, Andreas Tonnesen(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  */
42
43
44 #define YYSTYPE struct conf_token *
45
46 #include <stdio.h>
47 #include <stdlib.h>
48 #include <string.h>
49 #include <sys/types.h>
50 #include <sys/socket.h>
51 #include <netinet/in.h>
52 #include <arpa/inet.h>
53
54 #include "olsrd_conf.h"
55
56 #include "oparse.h"
57  
58 #define ECHO if(fwrite( yytext, yyleng, 1, yyout )) {}
59
60 /* Prototypes */
61 int yyget_lineno(void);
62 FILE * yyget_in(void);
63 FILE* yyget_out(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 static struct conf_token *get_conf_token(void);
74 static struct conf_token *get_string_token(const char * const s, const size_t n);
75 static struct conf_token *get_integer_token(const char * const s);
76 static struct conf_token *get_floating_token(const char * const s);
77 static struct conf_token *get_boolean_token(const bool b);
78
79 static struct conf_token *get_conf_token(void)
80 {
81     struct conf_token *t = calloc(1, sizeof(struct conf_token));
82     if (t == NULL) {
83         fprintf(stderr, "Cannot allocate %d bytes for an configuration token.\n", (int)sizeof(struct conf_token));
84     }
85     return t;
86 }
87
88 static struct conf_token *get_string_token(const char * const s, const size_t n)
89 {
90     struct conf_token *rv = get_conf_token();
91     if (rv != NULL) {
92         rv->string = malloc(n + 1);
93         if (rv->string == NULL) {
94           fprintf(stderr, "Cannot allocate %lu bytes for string token data.\n", (unsigned long)(n+1)); /* size_t on 64bit */
95             free(rv);
96             return NULL;
97         }
98         memcpy(rv->string, s, n);
99         rv->string[n] = '\0';
100     }
101     return rv;
102 }
103
104 static struct conf_token *get_integer_token(const char * const s)
105 {
106     struct conf_token *rv = get_conf_token();
107     if (rv != NULL) {
108         rv->integer = strtol(s, NULL, 0);
109     }
110     return rv;
111 }
112
113 static struct conf_token *get_floating_token(const char * const s)
114 {
115     struct conf_token *rv = get_conf_token();
116     if (rv != NULL) {
117         rv->floating = 0.0;
118         sscanf(s, "%f", &rv->floating);
119     }
120     return rv;
121 }
122
123 static struct conf_token *get_boolean_token(const bool b)
124 {
125     struct conf_token *rv = get_conf_token();
126     if (rv != NULL) {
127         rv->boolean = b;
128     }
129     return rv;
130 }
131
132 %}
133
134 %option never-interactive
135 %option noalways-interactive
136 %option nomain
137 %option nostack
138 %option noyywrap
139
140 DECDIGIT [0-9]
141 FLOAT {DECDIGIT}+\.{DECDIGIT}+
142 HEX8 [a-fA-F0-9]
143 QUAD {DECDIGIT}{1,3}
144
145 IPV4ADDR {QUAD}\.{QUAD}\.{QUAD}\.{QUAD}
146
147 HEX16 {HEX8}{1,4}
148
149 IPV6PAT2 ({HEX16}:){1}:({HEX16}:){0,5}{HEX16}
150 IPV6PAT3 ({HEX16}:){2}:({HEX16}:){0,4}{HEX16}
151 IPV6PAT4 ({HEX16}:){3}:({HEX16}:){0,3}{HEX16}
152 IPV6PAT5 ({HEX16}:){4}:({HEX16}:){0,2}{HEX16}
153 IPV6PAT6 ({HEX16}:){5}:({HEX16}:){0,1}{HEX16}
154 IPV6PAT7 ({HEX16}:){6}:({HEX16})
155 IPV6PAT1 ({HEX16}:){7}{HEX16}
156 IPV6PAT8 ({HEX16}:){1,7}:
157 IPV6PAT9 ::
158
159 IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6PAT7}|{IPV6PAT8}|{IPV6PAT9}
160
161 %%
162
163 \s*"#".*\n {
164     current_line++;
165     return TOK_COMMENT;
166 }
167
168 \/ {
169     yylval = NULL;
170     return TOK_SLASH;
171 }
172
173 \{ {
174     yylval = NULL;
175     return TOK_OPEN;
176 }
177
178 \} {
179     yylval = NULL;
180     return TOK_CLOSE;
181 }
182
183 \"[^\"]*\" {
184     yylval = get_string_token(yytext + 1, yyleng - 2);
185     if (yylval == NULL) {
186         yyterminate();
187     }
188     return TOK_STRING;
189 }
190
191 0x{HEX8}+ {
192     yylval = get_integer_token(yytext);
193     return TOK_INTEGER;
194 }
195
196 {FLOAT} {
197     yylval = get_floating_token(yytext);
198     return TOK_FLOAT;
199 }
200
201 {IPV4ADDR} {
202     yylval = get_string_token(yytext, yyleng + 1);
203     if (yylval == NULL) {
204         yyterminate();
205     }
206     return TOK_IPV4_ADDR;
207 }
208 {IPV6ADDR} {
209     yylval = get_string_token(yytext, yyleng + 1);
210     if (yylval == NULL) {
211         yyterminate();
212     }
213     return TOK_IPV6_ADDR;
214 }
215
216 "default" {
217     yylval = NULL;
218     return TOK_DEFAULT;
219 }
220
221 "auto" {
222     yylval = NULL;
223     return TOK_AUTO;
224 }
225
226 "none" {
227     yylval = NULL;
228     return TOK_NONE;
229 }
230
231 {DECDIGIT}+ {
232     yylval = get_integer_token(yytext);
233     return TOK_INTEGER;
234 }
235
236
237 "yes" {
238     yylval = get_boolean_token(true);
239     return TOK_BOOLEAN;
240 }
241
242 "no" {
243     yylval = get_boolean_token(false);
244     return TOK_BOOLEAN;
245 }
246
247 "Host" {
248     yylval = NULL;
249     return TOK_HOSTLABEL;
250 }
251
252 "Net" {
253     yylval = NULL;
254     return TOK_NETLABEL;
255 }
256
257 "MaxConnections" {
258     yylval = NULL;
259     return TOK_MAXIPC;
260 }
261
262 "DebugLevel" {
263     yylval = NULL;
264     return TOK_DEBUGLEVEL;
265 }
266
267 "IpVersion" {
268     yylval = NULL;
269     return TOK_IPVERSION;
270 }
271
272 "NicChgsPollInt" {
273     yylval = NULL;
274     return TOK_NICCHGSPOLLRT;
275 }
276
277 "Hna4" {
278     yylval = NULL;
279     return TOK_HNA4;
280 }
281
282 "Hna6" {
283     yylval = NULL;
284     return TOK_HNA6;
285 }
286
287 "LoadPlugin" {
288     yylval = NULL;
289     return TOK_PLUGIN;
290 }
291
292 "PlParam" {
293     yylval = NULL;
294     return TOK_PLPARAM;
295 }
296
297 "Interface" {
298     yylval = NULL;
299     return TOK_INTERFACE;
300 }
301 "InterfaceDefaults" {
302     yylval = NULL;
303     return TOK_INTERFACE_DEFAULTS;
304 }
305
306 "AllowNoInt" {
307     yylval = NULL;
308     return TOK_NOINT;
309 }
310
311 "TosValue" {
312     yylval = NULL;
313     return TOK_TOS;
314 }
315
316
317 "OlsrPort" {
318   yylval = NULL;
319   return TOK_OLSRPORT;
320 }
321
322 "RtProto" {
323   yylval = NULL;
324   return TOK_RTPROTO;
325 }
326
327 "RtTable" {
328   yylval = NULL;
329   return TOK_RTTABLE;
330 }
331
332 "RtTableDefault" {
333   yylval = NULL;
334   return TOK_RTTABLE_DEFAULT;
335 }
336
337 "RtTableTunnel" {
338   yylval = NULL;
339   return TOK_RTTABLE_TUNNEL;
340 }
341
342 "RtTablePriority" {
343   yylval = NULL;
344   return TOK_RTTABLE_PRIORITY;
345 }
346
347 "RtTableDefaultOlsrPriority" {
348   yylval = NULL;
349   return TOK_RTTABLE_DEFAULTOLSR_PRIORITY;
350 }
351
352 "RtTableTunnelPriority" {
353   yylval = NULL;
354   return TOK_RTTABLE_TUNNEL_PRIORITY;
355 }
356
357 "RtTableDefaultPriority" {
358   yylval = NULL;
359   return TOK_RTTABLE_DEFAULT_PRIORITY;
360 }
361
362 "Willingness" {
363     yylval = NULL;
364     return TOK_WILLINGNESS;
365 }
366
367 "IpcConnect" {
368     yylval = NULL;
369     return TOK_IPCCON;
370 }
371
372 "FIBMetric" {
373     yylval = NULL;
374     return TOK_FIBMETRIC;
375 }
376
377 "UseHysteresis" {
378     yylval = NULL;
379     return TOK_USEHYST;
380 }
381
382 "HystScaling" {
383     yylval = NULL;
384     return TOK_HYSTSCALE;
385 }
386
387 "HystThrHigh" {
388     yylval = NULL;
389     return TOK_HYSTUPPER;
390 }
391
392 "HystThrLow" {
393     yylval = NULL;
394     return TOK_HYSTLOWER;
395 }
396
397 "Pollrate" {
398     yylval = NULL;
399     return TOK_POLLRATE;
400 }
401
402
403 "TcRedundancy" {
404     yylval = NULL;
405     return TOK_TCREDUNDANCY;
406 }
407
408 "MprCoverage" {
409     yylval = NULL;
410     return TOK_MPRCOVERAGE;
411 }
412
413 "LinkQualityLevel" {
414     yylval = NULL;
415     return TOK_LQ_LEVEL;
416 }
417
418 "LinkQualityFishEye" {
419     yylval = NULL;
420     return TOK_LQ_FISH;
421 }
422
423 "LinkQualityAging" {
424     yylval = NULL;
425     return TOK_LQ_AGING;
426 }
427
428 "LinkQualityAlgorithm" {
429     yylval = NULL;
430     return TOK_LQ_PLUGIN;
431 }
432
433 "NatThreshold" {
434     yylval = NULL;
435     return TOK_LQ_NAT_THRESH;
436 }
437
438 "LinkQualityMult" {
439     yylval = NULL;
440     return TOK_LQ_MULT;
441 }
442
443 "MinTCVTime" {
444     yylval = NULL;
445     return TOK_MIN_TC_VTIME;
446 }
447
448 "LockFile" {
449     yylval = NULL;
450     return TOK_LOCK_FILE;
451 }
452
453 "ClearScreen" {
454     yylval = NULL;
455     return TOK_CLEAR_SCREEN;
456 }
457
458 "UseNiit" {
459     yylval = NULL;
460     return TOK_USE_NIIT;
461 }
462
463 "SmartGateway" {
464     yylval = NULL;
465     return TOK_SMART_GW;
466 }
467
468 "SmartGatewayAllowNAT" {
469     yylval = NULL;
470     return TOK_SMART_GW_ALLOW_NAT;
471 }
472
473 "SmartGatewayUplink" {
474     yylval = NULL;
475     return TOK_SMART_GW_UPLINK;
476 }
477  
478 "SmartGatewayUplinkNAT" {
479     yylval = NULL;
480     return TOK_SMART_GW_UPLINK_NAT;
481 }
482  
483 "SmartGatewaySpeed" {
484     yylval = NULL;
485     return TOK_SMART_GW_SPEED;
486 }
487
488 "SmartGatewayPrefix" {
489     yylval = NULL;
490     return TOK_SMART_GW_PREFIX;
491 }
492
493 "SrcIpRoutes" {
494     yylval = NULL;
495     return TOK_SRC_IP_ROUTES;
496 }
497 "Weight" {
498     yylval = NULL;
499     return TOK_IFWEIGHT;
500 }
501 "MainIp" {
502     yylval = NULL;
503     return TOK_MAIN_IP;
504 }
505 "Ip4Broadcast" {
506     yylval = NULL;
507     return TOK_IPV4BROADCAST;
508 }
509 "IPv4Multicast" {
510     yylval = NULL;
511     return TOK_IPV4MULTICAST;
512 }
513 "Mode" {
514     yylval = NULL;
515     return TOK_IFMODE;
516 }
517 "IPv6Multicast" {
518     yylval = NULL;
519     return TOK_IPV6MULTICAST;
520 }
521 "IPv4Src" {
522                 yylval = NULL;
523                 return TOK_IPV4SRC;
524 }
525 "IPv6Src" {
526                 yylval = NULL;
527                 return TOK_IPV6SRC;
528 }
529 "HelloInterval" {
530     yylval = NULL;
531     return TOK_HELLOINT;
532 }
533 "HelloValidityTime" {
534     yylval = NULL;
535     return TOK_HELLOVAL;
536 }
537 "TcInterval" {
538     yylval = NULL;
539     return TOK_TCINT;
540 }
541 "TcValidityTime" {
542     yylval = NULL;
543     return TOK_TCVAL;
544 }
545 "MidInterval" {
546     yylval = NULL;
547     return TOK_MIDINT;
548 }
549 "MidValidityTime" {
550     yylval = NULL;
551     return TOK_MIDVAL;
552 }
553 "HnaInterval" {
554     yylval = NULL;
555     return TOK_HNAINT;
556 }
557 "HnaValidityTime" {
558     yylval = NULL;
559     return TOK_HNAVAL;
560 }
561 "AutoDetectChanges" {
562     yylval = NULL;
563     return TOK_AUTODETCHG;
564 }
565
566
567 \n|\r\n {
568     current_line++;
569 }
570
571 \ |\t
572
573 . {
574   /* Do nothing */
575   //fprintf(stderr, "Failed to parse line %d of configuration file.\n",
576   //      current_line);
577   //yyterminate();
578   //yy_fatal_error("Parsing failed.\n");
579
580   /* To avoid compiler warning (stupid...) */
581   if(0)
582     yyunput(0, NULL);
583 }
584
585 %%