__FreeBSD__ is defined by default on FreeBSD. Include netinet/in.h for
[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.14 2004/11/30 17:12:28 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
121 \s*"#".*\n {
122
123   current_line++;
124   return TOK_COMMENT;
125 }
126
127 \{ {
128   yylval = NULL;
129   return TOK_OPEN;
130 }
131
132 \} {
133   yylval = NULL;
134   return TOK_CLOSE;
135 }
136
137 \; {
138   yylval = NULL;
139   return TOK_SEMI;
140 }
141
142 \"[^\"]*\" {
143   yylval = get_conf_token();
144
145   yylval->string = malloc(yyleng - 1);
146
147   if (yylval->string == NULL)
148   {
149     fprintf(stderr,
150             "Cannot allocate %d bytes for string token data.\n", yyleng - 1);
151     yyterminate();
152   }
153
154   strncpy(yylval->string, yytext + 1, yyleng - 2);
155   yylval->string[yyleng - 2] = 0;
156
157   return TOK_STRING;
158 }
159
160 0x{HEXDIGIT}+ {
161   yylval = get_conf_token();
162
163   yylval->integer = strtol(yytext, NULL, 0);
164
165   return TOK_INTEGER;
166 }
167
168 {FLOAT} {
169   yylval = get_conf_token();
170
171   sscanf(yytext, "%f", &yylval->floating);
172   return TOK_FLOAT;
173 }
174
175 {IPV4ADDR} {
176   yylval = get_conf_token();
177   
178   yylval->string = malloc(yyleng + 1);
179   
180   if (yylval->string == NULL)
181     {
182       fprintf(stderr,
183               "Cannot allocate %d bytes for string token data.\n", yyleng + 1);
184       yyterminate();
185     }
186   
187   strncpy(yylval->string, yytext, yyleng+1);
188
189   return TOK_IP4_ADDR;
190 }
191
192
193
194 {IPV6ADDR} {
195
196   yylval = get_conf_token();
197   
198   yylval->string = malloc(yyleng+1);
199   
200   if (yylval->string == NULL)
201     {
202       fprintf(stderr,
203               "Cannot allocate %d bytes for string token data.\n", yyleng + 1);
204       yyterminate();
205     }
206   
207   strncpy(yylval->string, yytext, yyleng+1);
208   
209   return TOK_IP6_ADDR;
210 }
211
212
213 {DECDIGIT}+ {
214
215   yylval = get_conf_token();
216
217   yylval->integer = atoi(yytext);
218
219   return TOK_INTEGER;
220
221 }
222
223
224 "yes"|"no" {
225   yylval = get_conf_token();
226
227   if (strncmp(yytext, "yes", 3) == 0)
228     yylval->boolean = OLSR_TRUE;
229
230   else
231     yylval->boolean = OLSR_FALSE;
232
233   return TOK_BOOLEAN;
234 }
235
236
237
238 "site-local"|"global" {
239   yylval = get_conf_token();
240
241   if (strncmp(yytext, "site-local", 10) == 0)
242     yylval->boolean = OLSR_TRUE;
243
244   else
245     yylval->boolean = OLSR_FALSE;
246
247   return TOK_IP6TYPE;
248 }
249
250 "Host" {
251   yylval = NULL;
252   return TOK_HOSTLABEL;
253 }
254
255 "Net" {
256   yylval = NULL;
257   return TOK_NETLABEL;
258 }
259
260 "MaxConnections" {
261   yylval = NULL;
262   return TOK_MAXIPC;
263 }
264
265 "DebugLevel" {
266   yylval = NULL;
267   return TOK_DEBUGLEVEL;
268 }
269
270 "IpVersion" {
271   yylval = NULL;
272   return TOK_IPVERSION;
273 }
274
275 "Hna4" {
276   yylval = NULL;
277   return TOK_HNA4;
278 }
279
280 "Hna6" {
281   yylval = NULL;
282   return TOK_HNA6;
283 }
284
285 "LoadPlugin" {
286   yylval = NULL;
287   return TOK_PLUGIN;
288 }
289
290 "PlName" {
291   yylval = NULL;
292   return TOK_PLNAME;
293 }
294
295 "PlParam" {
296   yylval = NULL;
297   return TOK_PLPARAM;
298 }
299
300 "Interface" {
301   yylval = NULL;
302   return TOK_INTERFACE;
303 }
304
305 "AllowNoInt" {
306   yylval = NULL;
307   return TOK_NOINT;
308 }
309
310 "TosValue" {
311   yylval = NULL;
312   return TOK_TOS;
313 }
314
315 "Willingness" {
316   yylval = NULL;
317   return TOK_WILLINGNESS;
318 }
319
320 "IpcConnect" {
321   yylval = NULL;
322   return TOK_IPCCON;
323 }
324
325 "UseHysteresis" {
326   yylval = NULL;
327   return TOK_USEHYST;
328 }
329
330 "HystScaling" {
331   yylval = NULL;
332   return TOK_HYSTSCALE;
333 }
334
335 "HystThrHigh" {
336   yylval = NULL;
337   return TOK_HYSTUPPER;
338 }
339
340 "HystThrLow" {
341   yylval = NULL;
342   return TOK_HYSTLOWER;
343 }
344
345 "Pollrate" {
346   yylval = NULL;
347   return TOK_POLLRATE;
348 }
349
350
351 "TcRedundancy" {
352   yylval = NULL;
353   return TOK_TCREDUNDANCY;
354 }
355
356 "MprCoverage" {
357   yylval = NULL;
358   return TOK_MPRCOVERAGE;
359 }
360
361 "LinkQualityLevel" {
362   yylval = NULL;
363   return TOK_LQ_LEVEL;
364 }
365
366 "LinkQualityWinSize" {
367   yylval = NULL;
368   return TOK_LQ_WSIZE;
369 }
370
371 "ClearScreen" {
372   yylval = NULL;
373   return TOK_CLEAR_SCREEN;
374 }
375
376 "Ip4Broadcast" {
377   yylval = NULL;
378   return TOK_IP4BROADCAST;
379 }
380 "Ip6AddrType" {
381   yylval = NULL;
382   return TOK_IP6ADDRTYPE;
383 }
384 "Ip6MulticastSite" {
385   yylval = NULL;
386   return TOK_IP6MULTISITE;
387 }
388 "Ip6MulticastGlobal" {
389   yylval = NULL;
390   return TOK_IP6MULTIGLOBAL;
391 }
392 "HelloInterval" {
393   yylval = NULL;
394   return TOK_HELLOINT;
395 }
396 "HelloValidityTime" {
397   yylval = NULL;
398   return TOK_HELLOVAL;
399 }
400 "TcInterval" {
401   yylval = NULL;
402   return TOK_TCINT;
403 }
404 "TcValidityTime" {
405   yylval = NULL;
406   return TOK_TCVAL;
407 }
408 "MidInterval" {
409   yylval = NULL;
410   return TOK_MIDINT;
411 }
412 "MidValidityTime" {
413   yylval = NULL;
414   return TOK_MIDVAL;
415 }
416 "HnaInterval" {
417   yylval = NULL;
418   return TOK_HNAINT;
419 }
420 "HnaValidityTime" {
421   yylval = NULL;
422   return TOK_HNAVAL;
423 }
424
425
426
427 \n|\r\n {
428   current_line++;
429 }
430
431 \ |\t
432
433 . {
434   /* Do nothing */
435   //fprintf(stderr, "Failed to parse line %d of configuration file.\n",
436   //      current_line);
437   //yyterminate();
438   //yy_fatal_error("Parsing failed.\n");
439
440   /* To avoid compiler warning (stupid...) */
441   if(0)
442     yyunput(0, NULL);
443 }
444
445 %%