b0b237a4bfdf3781f6faa6c00008b1dd038bd43a
[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.13 2004/11/21 10:52:16 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 <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 int yyget_leng(void);
63 char *yyget_text(void);
64 void yyset_lineno(int);
65 void yyset_in(FILE *);
66 void yyset_out(FILE *);
67 int yyget_debug(void);
68 void yyset_debug(int);
69 int yylex_destroy(void);
70
71 struct conf_token *
72 get_conf_token(void);
73
74 struct conf_token *
75 get_conf_token()
76 {
77   struct conf_token *t = malloc(sizeof(struct conf_token));
78
79   if (t == NULL)
80     {
81       fprintf(stderr, "Cannot allocate %d bytes for an configuration token.\n",
82               sizeof (struct conf_token));
83       exit(EXIT_FAILURE);
84     }
85
86   memset(t, 0, sizeof(struct conf_token));
87
88   return t;
89 }
90
91
92
93 %}
94
95 %option noyywrap
96
97 DECDIGIT [0-9]
98 FLOAT {DECDIGIT}+\.{DECDIGIT}+
99 HEXDIGIT [a-f][A-F][0-9]
100
101 IPV4ADDR ({DECDIGIT}){1,3}\.({DECDIGIT}){1,3}\.({DECDIGIT}){1,3}\.({DECDIGIT}){1,3}
102
103 HEXBYTE ([a-f]|[A-F]|[0-9]){1,4}
104
105 IP6PAT1 ({HEXBYTE}:){7}{HEXBYTE}
106 IP6PAT2 {HEXBYTE}::({HEXBYTE}:){0,5}{HEXBYTE}
107 IP6PAT3 ({HEXBYTE}:){2}:({HEXBYTE}:){0,4}{HEXBYTE}
108 IP6PAT4 ({HEXBYTE}:){3}:({HEXBYTE}:){0,3}{HEXBYTE}
109 IP6PAT5 ({HEXBYTE}:){4}:({HEXBYTE}:){0,2}{HEXBYTE}
110 IP6PAT6 ({HEXBYTE}:){5}:({HEXBYTE}:){0,1}{HEXBYTE}
111 IP6PAT7 ({HEXBYTE}:){6}:{HEXBYTE}
112 IP6PAT8 ({HEXBYTE}:){1,7}:
113 IP6PAT9 ::
114
115 IPV6ADDR {IP6PAT1}|{IP6PAT2}|{IP6PAT3}|{IP6PAT4}|{IP6PAT5}|{IP6PAT6}|{IP6PAT7}|{IP6PAT8}|{IP6PAT9}
116
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
212 {DECDIGIT}+ {
213
214   yylval = get_conf_token();
215
216   yylval->integer = atoi(yytext);
217
218   return TOK_INTEGER;
219
220 }
221
222
223 "yes"|"no" {
224   yylval = get_conf_token();
225
226   if (strncmp(yytext, "yes", 3) == 0)
227     yylval->boolean = OLSR_TRUE;
228
229   else
230     yylval->boolean = OLSR_FALSE;
231
232   return TOK_BOOLEAN;
233 }
234
235
236
237 "site-local"|"global" {
238   yylval = get_conf_token();
239
240   if (strncmp(yytext, "site-local", 10) == 0)
241     yylval->boolean = OLSR_TRUE;
242
243   else
244     yylval->boolean = OLSR_FALSE;
245
246   return TOK_IP6TYPE;
247 }
248
249 "Host" {
250   yylval = NULL;
251   return TOK_HOSTLABEL;
252 }
253
254 "Net" {
255   yylval = NULL;
256   return TOK_NETLABEL;
257 }
258
259 "MaxConnections" {
260   yylval = NULL;
261   return TOK_MAXIPC;
262 }
263
264 "DebugLevel" {
265   yylval = NULL;
266   return TOK_DEBUGLEVEL;
267 }
268
269 "IpVersion" {
270   yylval = NULL;
271   return TOK_IPVERSION;
272 }
273
274 "Hna4" {
275   yylval = NULL;
276   return TOK_HNA4;
277 }
278
279 "Hna6" {
280   yylval = NULL;
281   return TOK_HNA6;
282 }
283
284 "LoadPlugin" {
285   yylval = NULL;
286   return TOK_PLUGIN;
287 }
288
289 "PlName" {
290   yylval = NULL;
291   return TOK_PLNAME;
292 }
293
294 "PlParam" {
295   yylval = NULL;
296   return TOK_PLPARAM;
297 }
298
299 "Interface" {
300   yylval = NULL;
301   return TOK_INTERFACE;
302 }
303
304 "AllowNoInt" {
305   yylval = NULL;
306   return TOK_NOINT;
307 }
308
309 "TosValue" {
310   yylval = NULL;
311   return TOK_TOS;
312 }
313
314 "Willingness" {
315   yylval = NULL;
316   return TOK_WILLINGNESS;
317 }
318
319 "IpcConnect" {
320   yylval = NULL;
321   return TOK_IPCCON;
322 }
323
324 "UseHysteresis" {
325   yylval = NULL;
326   return TOK_USEHYST;
327 }
328
329 "HystScaling" {
330   yylval = NULL;
331   return TOK_HYSTSCALE;
332 }
333
334 "HystThrHigh" {
335   yylval = NULL;
336   return TOK_HYSTUPPER;
337 }
338
339 "HystThrLow" {
340   yylval = NULL;
341   return TOK_HYSTLOWER;
342 }
343
344 "Pollrate" {
345   yylval = NULL;
346   return TOK_POLLRATE;
347 }
348
349
350 "TcRedundancy" {
351   yylval = NULL;
352   return TOK_TCREDUNDANCY;
353 }
354
355 "MprCoverage" {
356   yylval = NULL;
357   return TOK_MPRCOVERAGE;
358 }
359
360 "LinkQualityLevel" {
361   yylval = NULL;
362   return TOK_LQ_LEVEL;
363 }
364
365 "LinkQualityWinSize" {
366   yylval = NULL;
367   return TOK_LQ_WSIZE;
368 }
369
370 "ClearScreen" {
371   yylval = NULL;
372   return TOK_CLEAR_SCREEN;
373 }
374
375 "Ip4Broadcast" {
376   yylval = NULL;
377   return TOK_IP4BROADCAST;
378 }
379 "Ip6AddrType" {
380   yylval = NULL;
381   return TOK_IP6ADDRTYPE;
382 }
383 "Ip6MulticastSite" {
384   yylval = NULL;
385   return TOK_IP6MULTISITE;
386 }
387 "Ip6MulticastGlobal" {
388   yylval = NULL;
389   return TOK_IP6MULTIGLOBAL;
390 }
391 "HelloInterval" {
392   yylval = NULL;
393   return TOK_HELLOINT;
394 }
395 "HelloValidityTime" {
396   yylval = NULL;
397   return TOK_HELLOVAL;
398 }
399 "TcInterval" {
400   yylval = NULL;
401   return TOK_TCINT;
402 }
403 "TcValidityTime" {
404   yylval = NULL;
405   return TOK_TCVAL;
406 }
407 "MidInterval" {
408   yylval = NULL;
409   return TOK_MIDINT;
410 }
411 "MidValidityTime" {
412   yylval = NULL;
413   return TOK_MIDVAL;
414 }
415 "HnaInterval" {
416   yylval = NULL;
417   return TOK_HNAINT;
418 }
419 "HnaValidityTime" {
420   yylval = NULL;
421   return TOK_HNAVAL;
422 }
423
424
425
426 \n|\r\n {
427   current_line++;
428 }
429
430 \ |\t
431
432 . {
433   /* Do nothing */
434   //fprintf(stderr, "Failed to parse line %d of configuration file.\n",
435   //      current_line);
436   //yyterminate();
437   //yy_fatal_error("Parsing failed.\n");
438
439   /* To avoid compiler warning (stupid...) */
440   if(0)
441     yyunput(0, NULL);
442 }
443
444 %%