Link quality window size is now configurable. Screen clearing is, too.
[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.11 2004/11/20 17:10:03 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 "Host" {
234   yylval = NULL;
235   return TOK_HOSTLABEL;
236 }
237
238 "Net" {
239   yylval = NULL;
240   return TOK_NETLABEL;
241 }
242
243 "MaxConnections" {
244   yylval = NULL;
245   return TOK_MAXIPC;
246 }
247
248 "DebugLevel" {
249   yylval = NULL;
250   return TOK_DEBUGLEVEL;
251 }
252
253 "IpVersion" {
254   yylval = NULL;
255   return TOK_IPVERSION;
256 }
257
258 "Hna4" {
259   yylval = NULL;
260   return TOK_HNA4;
261 }
262
263 "Hna6" {
264   yylval = NULL;
265   return TOK_HNA6;
266 }
267
268 "LoadPlugin" {
269   yylval = NULL;
270   return TOK_PLUGIN;
271 }
272
273 "PlName" {
274   yylval = NULL;
275   return TOK_PLNAME;
276 }
277
278 "PlParam" {
279   yylval = NULL;
280   return TOK_PLPARAM;
281 }
282
283 "Interface" {
284   yylval = NULL;
285   return TOK_INTERFACE;
286 }
287
288 "AllowNoInt" {
289   yylval = NULL;
290   return TOK_NOINT;
291 }
292
293 "TosValue" {
294   yylval = NULL;
295   return TOK_TOS;
296 }
297
298 "Willingness" {
299   yylval = NULL;
300   return TOK_WILLINGNESS;
301 }
302
303 "IpcConnect" {
304   yylval = NULL;
305   return TOK_IPCCON;
306 }
307
308 "UseHysteresis" {
309   yylval = NULL;
310   return TOK_USEHYST;
311 }
312
313 "HystScaling" {
314   yylval = NULL;
315   return TOK_HYSTSCALE;
316 }
317
318 "HystThrHigh" {
319   yylval = NULL;
320   return TOK_HYSTUPPER;
321 }
322
323 "HystThrLow" {
324   yylval = NULL;
325   return TOK_HYSTLOWER;
326 }
327
328 "Pollrate" {
329   yylval = NULL;
330   return TOK_POLLRATE;
331 }
332
333
334 "TcRedundancy" {
335   yylval = NULL;
336   return TOK_TCREDUNDANCY;
337 }
338
339 "MprCoverage" {
340   yylval = NULL;
341   return TOK_MPRCOVERAGE;
342 }
343
344 "LinkQualityLevel" {
345   yylval = NULL;
346   return TOK_LQ_LEVEL;
347 }
348
349 "LinkQualityWinSize" {
350   yylval = NULL;
351   return TOK_LQ_WSIZE;
352 }
353
354 "ClearScreen" {
355   yylval = NULL;
356   return TOK_CLEAR_SCREEN;
357 }
358
359 "Ip4Broadcast" {
360   yylval = NULL;
361   return TOK_IP4BROADCAST;
362 }
363 "Ip6AddrType" {
364   yylval = NULL;
365   return TOK_IP6ADDRTYPE;
366 }
367 "Ip6MulticastSite" {
368   yylval = NULL;
369   return TOK_IP6MULTISITE;
370 }
371 "Ip6MulticastGlobal" {
372   yylval = NULL;
373   return TOK_IP6MULTIGLOBAL;
374 }
375 "HelloInterval" {
376   yylval = NULL;
377   return TOK_HELLOINT;
378 }
379 "HelloValidityTime" {
380   yylval = NULL;
381   return TOK_HELLOVAL;
382 }
383 "TcInterval" {
384   yylval = NULL;
385   return TOK_TCINT;
386 }
387 "TcValidityTime" {
388   yylval = NULL;
389   return TOK_TCVAL;
390 }
391 "MidInterval" {
392   yylval = NULL;
393   return TOK_MIDINT;
394 }
395 "MidValidityTime" {
396   yylval = NULL;
397   return TOK_MIDVAL;
398 }
399 "HnaInterval" {
400   yylval = NULL;
401   return TOK_HNAINT;
402 }
403 "HnaValidityTime" {
404   yylval = NULL;
405   return TOK_HNAVAL;
406 }
407
408
409
410 \n|\r\n {
411   current_line++;
412 }
413
414 \ |\t
415
416 . {
417   /* Do nothing */
418   //fprintf(stderr, "Failed to parse line %d of configuration file.\n",
419   //      current_line);
420   //yyterminate();
421   //yy_fatal_error("Parsing failed.\n");
422
423   /* To avoid compiler warning (stupid...) */
424   if(0)
425     yyunput(0, NULL);
426 }
427
428 %%