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