d42699e743ef33d86d838cbba390df00b390020d
[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.6 2004/11/01 20:13:27 kattemat 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 "auto"|{DECDIGIT}+ {
197
198   yylval = get_conf_token();
199
200   if (strncmp(yytext, "auto", 4) == 0)
201     {
202       yylval->boolean = 1;
203     }
204   else
205     {
206       yylval->boolean = 0;
207       yylval->integer = atoi(yytext);
208     }
209
210   return TOK_INTEGER;
211
212 }
213
214
215 "yes"|"no" {
216   yylval = get_conf_token();
217
218   if (strncmp(yytext, "yes", 3) == 0)
219     yylval->boolean = 1;
220
221   else
222     yylval->boolean = 0;
223
224   return TOK_BOOLEAN;
225 }
226
227
228
229 "site-local"|"global" {
230   yylval = get_conf_token();
231
232   if (strncmp(yytext, "site-local", 10) == 0)
233     yylval->boolean = 1;
234
235   else
236     yylval->boolean = 0;
237
238   return TOK_IP6TYPE;
239 }
240
241
242 "DebugLevel" {
243   yylval = NULL;
244   return TOK_DEBUGLEVEL;
245 }
246
247 "IpVersion" {
248   yylval = NULL;
249   return TOK_IPVERSION;
250 }
251
252 "Hna4" {
253   yylval = NULL;
254   return TOK_HNA4;
255 }
256
257 "Hna6" {
258   yylval = NULL;
259   return TOK_HNA6;
260 }
261
262 "LoadPlugin" {
263   yylval = NULL;
264   return TOK_PLUGIN;
265 }
266
267 "PlName" {
268   yylval = NULL;
269   return TOK_PLNAME;
270 }
271
272 "PlParam" {
273   yylval = NULL;
274   return TOK_PLPARAM;
275 }
276
277 "Interface" {
278   yylval = NULL;
279   return TOK_INTERFACE;
280 }
281
282 "AllowNoInt" {
283   yylval = NULL;
284   return TOK_NOINT;
285 }
286
287 "TosValue" {
288   yylval = NULL;
289   return TOK_TOS;
290 }
291
292 "Willingness" {
293   yylval = NULL;
294   return TOK_WILLINGNESS;
295 }
296
297 "IpcConnect" {
298   yylval = NULL;
299   return TOK_IPCCON;
300 }
301
302 "UseHysteresis" {
303   yylval = NULL;
304   return TOK_USEHYST;
305 }
306
307 "HystScaling" {
308   yylval = NULL;
309   return TOK_HYSTSCALE;
310 }
311
312 "HystThrHigh" {
313   yylval = NULL;
314   return TOK_HYSTUPPER;
315 }
316
317 "HystThrLow" {
318   yylval = NULL;
319   return TOK_HYSTLOWER;
320 }
321
322 "Pollrate" {
323   yylval = NULL;
324   return TOK_POLLRATE;
325 }
326
327
328 "TcRedundancy" {
329   yylval = NULL;
330   return TOK_TCREDUNDANCY;
331 }
332
333 "MprCoverage" {
334   yylval = NULL;
335   return TOK_MPRCOVERAGE;
336 }
337
338 "Ip4Broadcast" {
339   yylval = NULL;
340   return TOK_IP4BROADCAST;
341 }
342 "Ip6AddrType" {
343   yylval = NULL;
344   return TOK_IP6ADDRTYPE;
345 }
346 "Ip6MulticastSite" {
347   yylval = NULL;
348   return TOK_IP6MULTISITE;
349 }
350 "Ip6MulticastGlobal" {
351   yylval = NULL;
352   return TOK_IP6MULTIGLOBAL;
353 }
354 "HelloInterval" {
355   yylval = NULL;
356   return TOK_HELLOINT;
357 }
358 "HelloValidityTime" {
359   yylval = NULL;
360   return TOK_HELLOVAL;
361 }
362 "TcInterval" {
363   yylval = NULL;
364   return TOK_TCINT;
365 }
366 "TcValidityTime" {
367   yylval = NULL;
368   return TOK_TCVAL;
369 }
370 "MidInterval" {
371   yylval = NULL;
372   return TOK_MIDINT;
373 }
374 "MidValidityTime" {
375   yylval = NULL;
376   return TOK_MIDVAL;
377 }
378 "HnaInterval" {
379   yylval = NULL;
380   return TOK_HNAINT;
381 }
382 "HnaValidityTime" {
383   yylval = NULL;
384   return TOK_HNAVAL;
385 }
386
387
388
389 \n|\r\n {
390   current_line++;
391 }
392
393 \ |\t
394
395 . {
396   /* Do nothing */
397   //fprintf(stderr, "Failed to parse line %d of configuration file.\n",
398   //      current_line);
399   //yyterminate();
400   //yy_fatal_error("Parsing failed.\n");
401
402   /* To avoid compiler warning (stupid...) */
403   if(0)
404     yyunput(0, NULL);
405 }
406
407 %%