f909f27514fba28ef9fba56d2c2b7b7fb78fb449
[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 IPV6PAT10 :(:{HEX16}){1,7}
159
160 IPV6ADDR {IPV6PAT1}|{IPV6PAT2}|{IPV6PAT3}|{IPV6PAT4}|{IPV6PAT5}|{IPV6PAT6}|{IPV6PAT7}|{IPV6PAT8}|{IPV6PAT9}|{IPV6PAT10}
161
162 %%
163
164 \s*"#".*\n {
165     current_line++;
166     return TOK_COMMENT;
167 }
168
169 \/ {
170     yylval = NULL;
171     return TOK_SLASH;
172 }
173
174 \{ {
175     yylval = NULL;
176     return TOK_OPEN;
177 }
178
179 \} {
180     yylval = NULL;
181     return TOK_CLOSE;
182 }
183
184 \"[^\"]*\" {
185     yylval = get_string_token(yytext + 1, yyleng - 2);
186     if (yylval == NULL) {
187         yyterminate();
188     }
189     return TOK_STRING;
190 }
191
192 0x{HEX8}+ {
193     yylval = get_integer_token(yytext);
194     return TOK_INTEGER;
195 }
196
197 {FLOAT} {
198     yylval = get_floating_token(yytext);
199     return TOK_FLOAT;
200 }
201
202 {IPV4ADDR} {
203     yylval = get_string_token(yytext, yyleng + 1);
204     if (yylval == NULL) {
205         yyterminate();
206     }
207     return TOK_IPV4_ADDR;
208 }
209 {IPV6ADDR} {
210     yylval = get_string_token(yytext, yyleng + 1);
211     if (yylval == NULL) {
212         yyterminate();
213     }
214     return TOK_IPV6_ADDR;
215 }
216
217 "default" {
218     yylval = NULL;
219     return TOK_DEFAULT;
220 }
221
222 "auto" {
223     yylval = NULL;
224     return TOK_AUTO;
225 }
226
227 "none" {
228     yylval = NULL;
229     return TOK_NONE;
230 }
231
232 {DECDIGIT}+ {
233     yylval = get_integer_token(yytext);
234     return TOK_INTEGER;
235 }
236
237
238 "yes" {
239     yylval = get_boolean_token(true);
240     return TOK_BOOLEAN;
241 }
242
243 "no" {
244     yylval = get_boolean_token(false);
245     return TOK_BOOLEAN;
246 }
247
248 "Host" {
249     yylval = NULL;
250     return TOK_HOSTLABEL;
251 }
252
253 "Net" {
254     yylval = NULL;
255     return TOK_NETLABEL;
256 }
257
258 "MaxConnections" {
259     yylval = NULL;
260     return TOK_MAXIPC;
261 }
262
263 "DebugLevel" {
264     yylval = NULL;
265     return TOK_DEBUGLEVEL;
266 }
267
268 "IpVersion" {
269     yylval = NULL;
270     return TOK_IPVERSION;
271 }
272
273 "NicChgsPollInt" {
274     yylval = NULL;
275     return TOK_NICCHGSPOLLRT;
276 }
277
278 "Hna4" {
279     yylval = NULL;
280     return TOK_HNA4;
281 }
282
283 "Hna6" {
284     yylval = NULL;
285     return TOK_HNA6;
286 }
287
288 "LoadPlugin" {
289     yylval = NULL;
290     return TOK_PLUGIN;
291 }
292
293 "PlParam" {
294     yylval = NULL;
295     return TOK_PLPARAM;
296 }
297
298 "Interface" {
299     yylval = NULL;
300     return TOK_INTERFACE;
301 }
302 "InterfaceDefaults" {
303     yylval = NULL;
304     return TOK_INTERFACE_DEFAULTS;
305 }
306
307 "AllowNoInt" {
308     yylval = NULL;
309     return TOK_NOINT;
310 }
311
312 "TosValue" {
313     yylval = NULL;
314     return TOK_TOS;
315 }
316
317
318 "OlsrPort" {
319   yylval = NULL;
320   return TOK_OLSRPORT;
321 }
322
323 "RtProto" {
324   yylval = NULL;
325   return TOK_RTPROTO;
326 }
327
328 "RtTable" {
329   yylval = NULL;
330   return TOK_RTTABLE;
331 }
332
333 "RtTableDefault" {
334   yylval = NULL;
335   return TOK_RTTABLE_DEFAULT;
336 }
337
338 "RtTableTunnel" {
339   yylval = NULL;
340   return TOK_RTTABLE_TUNNEL;
341 }
342
343 "RtTablePriority" {
344   yylval = NULL;
345   return TOK_RTTABLE_PRIORITY;
346 }
347
348 "RtTableDefaultOlsrPriority" {
349   yylval = NULL;
350   return TOK_RTTABLE_DEFAULTOLSR_PRIORITY;
351 }
352
353 "RtTableTunnelPriority" {
354   yylval = NULL;
355   return TOK_RTTABLE_TUNNEL_PRIORITY;
356 }
357
358 "RtTableDefaultPriority" {
359   yylval = NULL;
360   return TOK_RTTABLE_DEFAULT_PRIORITY;
361 }
362
363 "Willingness" {
364     yylval = NULL;
365     return TOK_WILLINGNESS;
366 }
367
368 "IpcConnect" {
369     yylval = NULL;
370     return TOK_IPCCON;
371 }
372
373 "FIBMetric" {
374     yylval = NULL;
375     return TOK_FIBMETRIC;
376 }
377
378 "UseHysteresis" {
379     yylval = NULL;
380     return TOK_USEHYST;
381 }
382
383 "HystScaling" {
384     yylval = NULL;
385     return TOK_HYSTSCALE;
386 }
387
388 "HystThrHigh" {
389     yylval = NULL;
390     return TOK_HYSTUPPER;
391 }
392
393 "HystThrLow" {
394     yylval = NULL;
395     return TOK_HYSTLOWER;
396 }
397
398 "Pollrate" {
399     yylval = NULL;
400     return TOK_POLLRATE;
401 }
402
403
404 "TcRedundancy" {
405     yylval = NULL;
406     return TOK_TCREDUNDANCY;
407 }
408
409 "MprCoverage" {
410     yylval = NULL;
411     return TOK_MPRCOVERAGE;
412 }
413
414 "LinkQualityLevel" {
415     yylval = NULL;
416     return TOK_LQ_LEVEL;
417 }
418
419 "LinkQualityFishEye" {
420     yylval = NULL;
421     return TOK_LQ_FISH;
422 }
423
424 "LinkQualityAging" {
425     yylval = NULL;
426     return TOK_LQ_AGING;
427 }
428
429 "LinkQualityAlgorithm" {
430     yylval = NULL;
431     return TOK_LQ_PLUGIN;
432 }
433
434 "NatThreshold" {
435     yylval = NULL;
436     return TOK_LQ_NAT_THRESH;
437 }
438
439 "LinkQualityMult" {
440     yylval = NULL;
441     return TOK_LQ_MULT;
442 }
443
444 "MinTCVTime" {
445     yylval = NULL;
446     return TOK_MIN_TC_VTIME;
447 }
448
449 "LockFile" {
450     yylval = NULL;
451     return TOK_LOCK_FILE;
452 }
453
454 "ClearScreen" {
455     yylval = NULL;
456     return TOK_CLEAR_SCREEN;
457 }
458
459 "UseNiit" {
460     yylval = NULL;
461     return TOK_USE_NIIT;
462 }
463
464 "SmartGateway" {
465     yylval = NULL;
466     return TOK_SMART_GW;
467 }
468
469 "SmartGatewayAlwaysRemoveServerTunnel" {
470     yylval = NULL;
471     return TOK_SMART_GW_ALWAYS_REMOVE_SERVER_TUNNEL;
472 }
473
474 "SmartGatewayUseCount" {
475     yylval = NULL;
476     return TOK_SMART_GW_USE_COUNT;
477 }
478
479 "SmartGatewayTakeDownPercentage" {
480     yylval = NULL;
481     return TOK_SMART_GW_TAKEDOWN_PERCENTAGE;
482 }
483
484 "SmartGatewayPolicyRoutingScript" {
485     yylval = NULL;
486     return TOK_SMART_GW_POLICYROUTING_SCRIPT;
487 }
488
489 "SmartGatewayEgressInterfaces" {
490     yylval = NULL;
491     return TOK_SMART_GW_EGRESS_IFS;
492 }
493
494 "SmartGatewayTablesOffset" {
495     yylval = NULL;
496     return TOK_SMART_GW_OFFSET_TABLES;
497 }
498
499 "SmartGatewayRulesOffset" {
500     yylval = NULL;
501     return TOK_SMART_GW_OFFSET_RULES;
502 }
503
504 "SmartGatewayAllowNAT" {
505     yylval = NULL;
506     return TOK_SMART_GW_ALLOW_NAT;
507 }
508
509 "SmartGatewayPeriod" {
510     yylval = NULL;
511     return TOK_SMART_GW_PERIOD;
512 }
513
514 "SmartGatewayStableCount" {
515     yylval = NULL;
516     return TOK_SMART_GW_STABLECOUNT;
517 }
518
519 "SmartGatewayThreshold" {
520     yylval = NULL;
521     return TOK_SMART_GW_THRESH;
522 }
523
524 "SmartGatewayWeightExitLinkUp" {
525     yylval = NULL;
526     return TOK_SMART_GW_WEIGHT_EXITLINK_UP;
527 }
528
529 "SmartGatewayWeightExitLinkDown" {
530     yylval = NULL;
531     return TOK_SMART_GW_WEIGHT_EXITLINK_DOWN;
532 }
533
534 "SmartGatewayWeightEtx" {
535     yylval = NULL;
536     return TOK_SMART_GW_WEIGHT_ETX;
537 }
538
539 "SmartGatewayDividerEtx" {
540     yylval = NULL;
541     return TOK_SMART_GW_DIVIDER_ETX;
542 }
543
544 "SmartGatewayUplink" {
545     yylval = NULL;
546     return TOK_SMART_GW_UPLINK;
547 }
548  
549 "SmartGatewayUplinkNAT" {
550     yylval = NULL;
551     return TOK_SMART_GW_UPLINK_NAT;
552 }
553  
554 "SmartGatewaySpeed" {
555     yylval = NULL;
556     return TOK_SMART_GW_SPEED;
557 }
558
559 "SmartGatewayPrefix" {
560     yylval = NULL;
561     return TOK_SMART_GW_PREFIX;
562 }
563
564 "SrcIpRoutes" {
565     yylval = NULL;
566     return TOK_SRC_IP_ROUTES;
567 }
568 "Weight" {
569     yylval = NULL;
570     return TOK_IFWEIGHT;
571 }
572 "MainIp" {
573     yylval = NULL;
574     return TOK_MAIN_IP;
575 }
576 "SetIpForward" {
577     yylval = NULL;
578     return TOK_SET_IPFORWARD;
579 }
580 "Ip4Broadcast" {
581     yylval = NULL;
582     return TOK_IP4BROADCAST;
583 }
584 "IPv4Broadcast" {
585     yylval = NULL;
586     return TOK_IPV4BROADCAST;
587 }
588 "IPv4Multicast" {
589     yylval = NULL;
590     return TOK_IPV4MULTICAST;
591 }
592 "Mode" {
593     yylval = NULL;
594     return TOK_IFMODE;
595 }
596 "IPv6Multicast" {
597     yylval = NULL;
598     return TOK_IPV6MULTICAST;
599 }
600 "IPv4Src" {
601                 yylval = NULL;
602                 return TOK_IPV4SRC;
603 }
604 "IPv6Src" {
605                 yylval = NULL;
606                 return TOK_IPV6SRC;
607 }
608 "HelloInterval" {
609     yylval = NULL;
610     return TOK_HELLOINT;
611 }
612 "HelloValidityTime" {
613     yylval = NULL;
614     return TOK_HELLOVAL;
615 }
616 "TcInterval" {
617     yylval = NULL;
618     return TOK_TCINT;
619 }
620 "TcValidityTime" {
621     yylval = NULL;
622     return TOK_TCVAL;
623 }
624 "MidInterval" {
625     yylval = NULL;
626     return TOK_MIDINT;
627 }
628 "MidValidityTime" {
629     yylval = NULL;
630     return TOK_MIDVAL;
631 }
632 "HnaInterval" {
633     yylval = NULL;
634     return TOK_HNAINT;
635 }
636 "HnaValidityTime" {
637     yylval = NULL;
638     return TOK_HNAVAL;
639 }
640 "AutoDetectChanges" {
641     yylval = NULL;
642     return TOK_AUTODETCHG;
643 }
644
645
646 \n|\r\n {
647     current_line++;
648 }
649
650 \ |\t
651
652 . {
653   /* Do nothing */
654   //fprintf(stderr, "Failed to parse line %d of configuration file.\n",
655   //      current_line);
656   //yyterminate();
657   //yy_fatal_error("Parsing failed.\n");
658
659   /* To avoid compiler warning (stupid...) */
660   if(0)
661     yyunput(0, NULL);
662 }
663
664 %%