From 4ffc28ecd6d914f9c1e5aaf5d5921ee4827bb289 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 24 Mar 2012 20:55:27 +0100 Subject: Partial implementation of a config files parser --- src/config.l | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/config.l (limited to 'src/config.l') diff --git a/src/config.l b/src/config.l new file mode 100644 index 0000000..e9dd235 --- /dev/null +++ b/src/config.l @@ -0,0 +1,57 @@ +%option prefix="fastd_config_" +%option noyywrap +%option bison-bridge +%option reentrant + +%top { + #include + #include + #define YY_DECL int fastd_config_lex(YYSTYPE *yylval_param, fastd_context *ctx, void *yyscanner) +} + +%x STRING +%x ADDR6 + +%% +[0-9]+ { yylval->num = atoi(yytext); return TOK_INTEGER; } + +interface { yylval->str = yytext; return TOK_INTERFACE; } +bind { yylval->str = yytext; return TOK_BIND; } +mtu { yylval->str = yytext; return TOK_MTU; } +mode { yylval->str = yytext; return TOK_MODE; } +protocol { yylval->str = yytext; return TOK_PROTOCOL; } +peer { yylval->str = yytext; return TOK_PEER; } + +[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} { + if (!inet_pton(AF_INET, yytext, &yylval->addr)) + exit_error(ctx, "config error: invalid address"); + + return TOK_ADDR; + } + +any { yylval->str = yytext; return TOK_ANY; } +float { yylval->str = yytext; return TOK_FLOAT; } +tap { yylval->str = yytext; return TOK_TAP; } +tun { yylval->str = yytext; return TOK_TUN; } + +[A-Za-z_][A-Za-z0-9_]* { yylval->str = yytext; return TOK_IDENTIFIER; } + +[;:\{\}] { return *yytext; } + +[ \t\n] ; + +\" BEGIN(STRING); +[^"]* { yylval->str = yytext; return TOK_STRING; } +\" BEGIN(INITIAL); + +\[ BEGIN(ADDR6); +[^\]]+ { + if (!inet_pton(AF_INET6, yytext, &yylval->addr6)) + exit_error(ctx, "config error: invalid address"); + + return TOK_ADDR6; + } +\] BEGIN(INITIAL); + +. exit_error(ctx, "config error: invalid character"); +%% -- cgit v1.2.3