Implemented LinkQualityMult per-interface configuration directive.
[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.15 2005/02/15 17:17:56 tlopatic 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
72 struct conf_token *
73 get_conf_token(void);
74
75 struct conf_token *
76 get_conf_token()
77 {
78   struct conf_token *t = malloc(sizeof(struct conf_token));
79
80   if (t == NULL)
81     {
82       fprintf(stderr, "Cannot allocate %d bytes for an configuration token.\n",
83               sizeof (struct conf_token));
84       exit(EXIT_FAILURE);
85     }
86
87   memset(t, 0, sizeof(struct conf_token));
88
89   return t;
90 }
91
92
93
94 %}
95
96 %option noyywrap
97
98 DECDIGIT [0-9]
99 FLOAT {DECDIGIT}+\.{DECDIGIT}+
100 HEXDIGIT [a-f][A-F][0-9]
101
102 IPV4ADDR ({DECDIGIT}){1,3}\.({DECDIGIT}){1,3}\.({DECDIGIT}){1,3}\.({DECDIGIT}){1,3}
103
104 HEXBYTE ([a-f]|[A-F]|[0-9]){1,4}
105
106 IP6PAT1 ({HEXBYTE}:){7}{HEXBYTE}
107 IP6PAT2 {HEXBYTE}::({HEXBYTE}:){0,5}{HEXBYTE}
108 IP6PAT3 ({HEXBYTE}:){2}:({HEXBYTE}:){0,4}{HEXBYTE}
109 IP6PAT4 ({HEXBYTE}:){3}:({HEXBYTE}:){0,3}{HEXBYTE}
110 IP6PAT5 ({HEXBYTE}:){4}:({HEXBYTE}:){0,2}{HEXBYTE}
111 IP6PAT6 ({HEXBYTE}:){5}:({HEXBYTE}:){0,1}{HEXBYTE}
112 IP6PAT7 ({HEXBYTE}:){6}:{HEXBYTE}
113 IP6PAT8 ({HEXBYTE}:){1,7}:
114 IP6PAT9 ::
115
116 IPV6ADDR {IP6PAT1}|{IP6PAT2}|{IP6PAT3}|{IP6PAT4}|{IP6PAT5}|{IP6PAT6}|{IP6PAT7}|{IP6PAT8}|{IP6PAT9}
117
118 %%
119
120 \s*"#".*\n {
121
122   current_line++;
123   return TOK_COMMENT;
124 }
125
126 \{ {
127   yylval = NULL;
128   return TOK_OPEN;
129 }
130
131 \} {
132   yylval = NULL;
133   return TOK_CLOSE;
134 }
135
136 \; {
137   yylval = NULL;
138   return TOK_SEMI;
139 }
140
141 \"[^\"]*\" {
142   yylval = get_conf_token();
143
144   yylval->string = malloc(yyleng - 1);
145
146   if (yylval->string == NULL)
147   {
148     fprintf(stderr,
149             "Cannot allocate %d bytes for string token data.\n", yyleng - 1);
150     yyterminate();
151   }
152
153   strncpy(yylval->string, yytext + 1, yyleng - 2);
154   yylval->string[yyleng - 2] = 0;
155
156   return TOK_STRING;
157 }
158
159 0x{HEXDIGIT}+ {
160   yylval = get_conf_token();
161
162   yylval->integer = strtol(yytext, NULL, 0);
163
164   return TOK_INTEGER;
165 }
166
167 {FLOAT} {
168   yylval = get_conf_token();
169
170   sscanf(yytext, "%f", &yylval->floating);
171   return TOK_FLOAT;
172 }
173
174 {IPV4ADDR} {
175   yylval = get_conf_token();
176   
177   yylval->string = malloc(yyleng + 1);
178   
179   if (yylval->string == NULL)
180     {
181       fprintf(stderr,
182               "Cannot allocate %d bytes for string token data.\n", yyleng + 1);
183       yyterminate();
184     }
185   
186   strncpy(yylval->string, yytext, yyleng+1);
187
188   return TOK_IP4_ADDR;
189 }
190
191
192
193 {IPV6ADDR} {
194
195   yylval = get_conf_token();
196   
197   yylval->string = malloc(yyleng+1);
198   
199   if (yylval->string == NULL)
200     {
201       fprintf(stderr,
202               "Cannot allocate %d bytes for string token data.\n", yyleng + 1);
203       yyterminate();
204     }
205   
206   strncpy(yylval->string, yytext, yyleng+1);
207   
208   return TOK_IP6_ADDR;
209 }
210
211 "default" {
212   yylval = NULL;
213   return TOK_DEFAULT;
214 }
215
216 {DECDIGIT}+ {
217
218   yylval = get_conf_token();
219
220   yylval->integer = atoi(yytext);
221
222   return TOK_INTEGER;
223
224 }
225
226
227 "yes"|"no" {
228   yylval = get_conf_token();
229
230   if (strncmp(yytext, "yes", 3) == 0)
231     yylval->boolean = OLSR_TRUE;
232
233   else
234     yylval->boolean = OLSR_FALSE;
235
236   return TOK_BOOLEAN;
237 }
238
239
240
241 "site-local"|"global" {
242   yylval = get_conf_token();
243
244   if (strncmp(yytext, "site-local", 10) == 0)
245     yylval->boolean = OLSR_TRUE;
246
247   else
248     yylval->boolean = OLSR_FALSE;
249
250   return TOK_IP6TYPE;
251 }
252
253 "Host" {
254   yylval = NULL;
255   return TOK_HOSTLABEL;
256 }
257
258 "Net" {
259   yylval = NULL;
260   return TOK_NETLABEL;
261 }
262
263 "MaxConnections" {
264   yylval = NULL;
265   return TOK_MAXIPC;
266 }
267
268 "DebugLevel" {
269   yylval = NULL;
270   return TOK_DEBUGLEVEL;
271 }
272
273 "IpVersion" {
274   yylval = NULL;
275   return TOK_IPVERSION;
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 "PlName" {
294   yylval = NULL;
295   return TOK_PLNAME;
296 }
297
298 "PlParam" {
299   yylval = NULL;
300   return TOK_PLPARAM;
301 }
302
303 "Interface" {
304   yylval = NULL;
305   return TOK_INTERFACE;
306 }
307
308 "AllowNoInt" {
309   yylval = NULL;
310   return TOK_NOINT;
311 }
312
313 "TosValue" {
314   yylval = NULL;
315   return TOK_TOS;
316 }
317
318 "Willingness" {
319   yylval = NULL;
320   return TOK_WILLINGNESS;
321 }
322
323 "IpcConnect" {
324   yylval = NULL;
325   return TOK_IPCCON;
326 }
327
328 "UseHysteresis" {
329   yylval = NULL;
330   return TOK_USEHYST;
331 }
332
333 "HystScaling" {
334   yylval = NULL;
335   return TOK_HYSTSCALE;
336 }
337
338 "HystThrHigh" {
339   yylval = NULL;
340   return TOK_HYSTUPPER;
341 }
342
343 "HystThrLow" {
344   yylval = NULL;
345   return TOK_HYSTLOWER;
346 }
347
348 "Pollrate" {
349   yylval = NULL;
350   return TOK_POLLRATE;
351 }
352
353
354 "TcRedundancy" {
355   yylval = NULL;
356   return TOK_TCREDUNDANCY;
357 }
358
359 "MprCoverage" {
360   yylval = NULL;
361   return TOK_MPRCOVERAGE;
362 }
363
364 "LinkQualityLevel" {
365   yylval = NULL;
366   return TOK_LQ_LEVEL;
367 }
368
369 "LinkQualityWinSize" {
370   yylval = NULL;
371   return TOK_LQ_WSIZE;
372 }
373
374 "LinkQualityMult" {
375   yylval = NULL;
376   return TOK_LQ_MULT;
377 }
378
379 "ClearScreen" {
380   yylval = NULL;
381   return TOK_CLEAR_SCREEN;
382 }
383
384 "Ip4Broadcast" {
385   yylval = NULL;
386   return TOK_IP4BROADCAST;
387 }
388 "Ip6AddrType" {
389   yylval = NULL;
390   return TOK_IP6ADDRTYPE;
391 }
392 "Ip6MulticastSite" {
393   yylval = NULL;
394   return TOK_IP6MULTISITE;
395 }
396 "Ip6MulticastGlobal" {
397   yylval = NULL;
398   return TOK_IP6MULTIGLOBAL;
399 }
400 "HelloInterval" {
401   yylval = NULL;
402   return TOK_HELLOINT;
403 }
404 "HelloValidityTime" {
405   yylval = NULL;
406   return TOK_HELLOVAL;
407 }
408 "TcInterval" {
409   yylval = NULL;
410   return TOK_TCINT;
411 }
412 "TcValidityTime" {
413   yylval = NULL;
414   return TOK_TCVAL;
415 }
416 "MidInterval" {
417   yylval = NULL;
418   return TOK_MIDINT;
419 }
420 "MidValidityTime" {
421   yylval = NULL;
422   return TOK_MIDVAL;
423 }
424 "HnaInterval" {
425   yylval = NULL;
426   return TOK_HNAINT;
427 }
428 "HnaValidityTime" {
429   yylval = NULL;
430   return TOK_HNAVAL;
431 }
432
433
434
435 \n|\r\n {
436   current_line++;
437 }
438
439 \ |\t
440
441 . {
442   /* Do nothing */
443   //fprintf(stderr, "Failed to parse line %d of configuration file.\n",
444   //      current_line);
445   //yyterminate();
446   //yy_fatal_error("Parsing failed.\n");
447
448   /* To avoid compiler warning (stupid...) */
449   if(0)
450     yyunput(0, NULL);
451 }
452
453 %%