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