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