Added licence and updated config file generation to actually write to a file not...
[olsrd.git] / src / cfgparser / oscan.lex
1 %{
2
3 /*
4  * OLSR ad-hoc routing table management protocol config parser
5  * Copyright (C) 2004 Andreas T√łnnesen (andreto@olsr.org)
6  *
7  * This file is part of the olsr.org OLSR daemon.
8  *
9  * olsr.org is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * olsr.org is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with olsr.org; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22  * 
23  * 
24  * $Id: oscan.lex,v 1.2 2004/10/16 23:17:48 kattemat Exp $
25  *
26  */
27
28
29 #define YYSTYPE struct conf_token *
30
31 #include <stdio.h>
32 #include <string.h>
33 #include <sys/types.h>
34 #include <sys/socket.h>
35 #include <arpa/inet.h>
36
37 #include "olsrd_conf.h"
38
39 #include "oparse.h"
40
41
42
43 struct conf_token *
44 get_conf_token()
45 {
46   struct conf_token *t = malloc(sizeof(struct conf_token));
47
48   if (t == NULL)
49     {
50       fprintf(stderr, "Cannot allocate %d bytes for an configuration token.\n",
51               sizeof (struct conf_token));
52       exit(EXIT_FAILURE);
53     }
54
55   memset(t, 0, sizeof(struct conf_token));
56
57   return t;
58 }
59
60
61
62 struct if_config_options *
63 get_default_if_config()
64 {
65   struct if_config_options *io = malloc(sizeof(struct if_config_options));
66   struct in6_addr in6;
67  
68   memset(io, 0, sizeof(struct if_config_options));
69
70   io->ipv6_addrtype = 1;
71
72   if(inet_pton(AF_INET6, OLSR_IPV6_MCAST_SITE_LOCAL, &in6) < 0)
73     {
74       fprintf(stderr, "Failed converting IP address %s\n", OLSR_IPV6_MCAST_SITE_LOCAL);
75       exit(EXIT_FAILURE);
76     }
77   memcpy(&io->ipv6_multi_site.v6, &in6, sizeof(struct in6_addr));
78
79   if(inet_pton(AF_INET6, OLSR_IPV6_MCAST_GLOBAL, &in6) < 0)
80     {
81       fprintf(stderr, "Failed converting IP address %s\n", OLSR_IPV6_MCAST_GLOBAL);
82       exit(EXIT_FAILURE);
83     }
84   memcpy(&io->ipv6_multi_glbl.v6, &in6, sizeof(struct in6_addr));
85
86
87   io->hello_params.emission_interval = HELLO_INTERVAL;
88   io->hello_params.validity_time = NEIGHB_HOLD_TIME;
89   io->tc_params.emission_interval = TC_INTERVAL;
90   io->tc_params.validity_time = TOP_HOLD_TIME;
91   io->mid_params.emission_interval = MID_INTERVAL;
92   io->mid_params.validity_time = MID_HOLD_TIME;
93   io->hna_params.emission_interval = HNA_INTERVAL;
94   io->hna_params.validity_time = HNA_HOLD_TIME;
95
96   return io;
97
98 }
99
100
101 %}
102
103 %option noyywrap
104
105 DECDIGIT [0-9]
106 FLOAT {DECDIGIT}+\.{DECDIGIT}+
107 HEXDIGIT [a-f][A-F][0-9]
108
109 IPV4ADDR ({DECDIGIT}){1,3}\.({DECDIGIT}){1,3}\.({DECDIGIT}){1,3}\.({DECDIGIT}){1,3}
110
111 HEXBYTE ([a-f]|[A-F]|[0-9]){1,4}
112
113 IP6PAT1 ({HEXBYTE}:){7}{HEXBYTE}
114 IP6PAT2 {HEXBYTE}::({HEXBYTE}:){0,5}{HEXBYTE}
115 IP6PAT3 ({HEXBYTE}:){2}:({HEXBYTE}:){0,4}{HEXBYTE}
116 IP6PAT4 ({HEXBYTE}:){3}:({HEXBYTE}:){0,3}{HEXBYTE}
117 IP6PAT5 ({HEXBYTE}:){4}:({HEXBYTE}:){0,2}{HEXBYTE}
118 IP6PAT6 ({HEXBYTE}:){5}:({HEXBYTE}:){0,1}{HEXBYTE}
119 IP6PAT7 ({HEXBYTE}:){6}:{HEXBYTE}
120 IP6PAT8 ({HEXBYTE}:){1,7}:
121 IP6PAT9 ::
122
123 IPV6ADDR {IP6PAT1}|{IP6PAT2}|{IP6PAT3}|{IP6PAT4}|{IP6PAT5}|{IP6PAT6}|{IP6PAT7}|{IP6PAT8}|{IP6PAT9}
124
125
126 %%
127
128 \s*"#".*\n {
129
130   current_line++;
131   return TOK_COMMENT;
132 }
133
134 \{ {
135   yylval = NULL;
136   return TOK_OPEN;
137 }
138
139 \} {
140   yylval = NULL;
141   return TOK_CLOSE;
142 }
143
144 \; {
145   yylval = NULL;
146   return TOK_SEMI;
147 }
148
149 \"[^\"]*\" {
150   yylval = get_conf_token();
151
152   yylval->string = malloc(yyleng - 1);
153
154   if (yylval->string == NULL)
155   {
156     fprintf(stderr,
157             "Cannot allocate %d bytes for string token data.\n", yyleng - 1);
158     yyterminate();
159   }
160
161   strncpy(yylval->string, yytext + 1, yyleng - 2);
162   yylval->string[yyleng - 2] = 0;
163
164   return TOK_STRING;
165 }
166
167 0x{HEXDIGIT}+ {
168   yylval = get_conf_token();
169
170   yylval->integer = strtol(yytext, NULL, 0);
171
172   return TOK_INTEGER;
173 }
174
175 {FLOAT} {
176   yylval = get_conf_token();
177
178   sscanf(yytext, "%f", &yylval->floating);
179   return TOK_FLOAT;
180 }
181
182 {IPV4ADDR} {
183   yylval = get_conf_token();
184   
185   yylval->string = malloc(yyleng + 1);
186   
187   if (yylval->string == NULL)
188     {
189       fprintf(stderr,
190               "Cannot allocate %d bytes for string token data.\n", yyleng + 1);
191       yyterminate();
192     }
193   
194   strncpy(yylval->string, yytext, yyleng+1);
195
196   return TOK_IP4_ADDR;
197 }
198
199
200
201 {IPV6ADDR} {
202
203   yylval = get_conf_token();
204   
205   yylval->string = malloc(yyleng+1);
206   
207   if (yylval->string == NULL)
208     {
209       fprintf(stderr,
210               "Cannot allocate %d bytes for string token data.\n", yyleng + 1);
211       yyterminate();
212     }
213   
214   strncpy(yylval->string, yytext, yyleng+1);
215   
216   return TOK_IP6_ADDR;
217 }
218
219
220 "auto"|{DECDIGIT}+ {
221
222   yylval = get_conf_token();
223
224   if (strncmp(yytext, "auto", 4) == 0)
225     {
226       yylval->boolean = 1;
227     }
228   else
229     {
230       yylval->boolean = 0;
231       yylval->integer = atoi(yytext);
232     }
233
234   return TOK_INTEGER;
235
236 }
237
238
239 "yes"|"no" {
240   yylval = get_conf_token();
241
242   if (strncmp(yytext, "yes", 3) == 0)
243     yylval->boolean = 1;
244
245   else
246     yylval->boolean = 0;
247
248   return TOK_BOOLEAN;
249 }
250
251
252
253 "site-local"|"global" {
254   yylval = get_conf_token();
255
256   if (strncmp(yytext, "site-local", 10) == 0)
257     yylval->boolean = 1;
258
259   else
260     yylval->boolean = 0;
261
262   return TOK_IP6TYPE;
263 }
264
265
266 "DebugLevel" {
267   yylval = NULL;
268   return TOK_DEBUGLEVEL;
269 }
270
271 "IpVersion" {
272   yylval = NULL;
273   return TOK_IPVERSION;
274 }
275
276 "Hna4" {
277   yylval = NULL;
278   return TOK_HNA4;
279 }
280
281 "Hna6" {
282   yylval = NULL;
283   return TOK_HNA6;
284 }
285
286 "LoadPlugin" {
287   yylval = NULL;
288   return TOK_PLUGIN;
289 }
290
291 "PlName" {
292   yylval = NULL;
293   return TOK_PLNAME;
294 }
295
296 "PlParam" {
297   yylval = NULL;
298   return TOK_PLPARAM;
299 }
300
301 "Interfaces" {
302   yylval = NULL;
303   return TOK_INTERFACES;
304 }
305
306 "AllowNoInt" {
307   yylval = NULL;
308   return TOK_NOINT;
309 }
310
311 "TosValue" {
312   yylval = NULL;
313   return TOK_TOS;
314 }
315
316 "Willingness" {
317   yylval = NULL;
318   return TOK_WILLINGNESS;
319 }
320
321 "IpcConnect" {
322   yylval = NULL;
323   return TOK_IPCCON;
324 }
325
326 "UseHysteresis" {
327   yylval = NULL;
328   return TOK_USEHYST;
329 }
330
331 "HystScaling" {
332   yylval = NULL;
333   return TOK_HYSTSCALE;
334 }
335
336 "HystThrHigh" {
337   yylval = NULL;
338   return TOK_HYSTUPPER;
339 }
340
341 "HystThrLow" {
342   yylval = NULL;
343   return TOK_HYSTLOWER;
344 }
345
346 "Pollrate" {
347   yylval = NULL;
348   return TOK_POLLRATE;
349 }
350
351
352 "TcRedundancy" {
353   yylval = NULL;
354   return TOK_TCREDUNDANCY;
355 }
356
357 "MprCoverage" {
358   yylval = NULL;
359   return TOK_MPRCOVERAGE;
360 }
361
362
363 "IfSetup" {
364   yylval = NULL;
365   return TOK_IFSETUP;
366 }
367
368
369 "Ip4Broadcast" {
370   yylval = NULL;
371   return TOK_IP4BROADCAST;
372 }
373 "Ip6AddrType" {
374   yylval = NULL;
375   return TOK_IP6ADDRTYPE;
376 }
377 "Ip6MulticastSite" {
378   yylval = NULL;
379   return TOK_IP6MULTISITE;
380 }
381 "Ip6MulticastGlobal" {
382   yylval = NULL;
383   return TOK_IP6MULTIGLOBAL;
384 }
385 "HelloInterval" {
386   yylval = NULL;
387   return TOK_HELLOINT;
388 }
389 "HelloValidityTime" {
390   yylval = NULL;
391   return TOK_HELLOVAL;
392 }
393 "TcInterval" {
394   yylval = NULL;
395   return TOK_TCINT;
396 }
397 "TcValidityTime" {
398   yylval = NULL;
399   return TOK_TCVAL;
400 }
401 "MidInterval" {
402   yylval = NULL;
403   return TOK_MIDINT;
404 }
405 "MidValidityTime" {
406   yylval = NULL;
407   return TOK_MIDVAL;
408 }
409 "HnaInterval" {
410   yylval = NULL;
411   return TOK_HNAINT;
412 }
413 "HnaValidityTime" {
414   yylval = NULL;
415   return TOK_HNAVAL;
416 }
417
418
419
420 \n|\r\n {
421   current_line++;
422 }
423
424 \ |\t
425
426 . {
427   /* Do nothing */
428   //fprintf(stderr, "Failed to parse line %d of configuration file.\n",
429   //      current_line);
430   //yyterminate();
431   //yy_fatal_error("Parsing failed.\n");
432
433   /* To avoid compiler warning (stupid...) */
434   if(0)
435     yyunput(0, NULL);
436 }
437
438 %%