diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2012-03-24 20:55:27 +0100 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2012-03-24 20:55:27 +0100 |
commit | 4ffc28ecd6d914f9c1e5aaf5d5921ee4827bb289 (patch) | |
tree | ddd64c27220b75f45a6efdc162bbbe040a9ca001 /src/config.l | |
parent | 78fe2cda0572433e40889bcd7d64dd22707bfdd0 (diff) | |
download | fastd-4ffc28ecd6d914f9c1e5aaf5d5921ee4827bb289.tar fastd-4ffc28ecd6d914f9c1e5aaf5d5921ee4827bb289.zip |
Partial implementation of a config files parser
Diffstat (limited to 'src/config.l')
-rw-r--r-- | src/config.l | 57 |
1 files changed, 57 insertions, 0 deletions
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 <fastd.h> + #include <config.yy.h> + #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); +<STRING>[^"]* { yylval->str = yytext; return TOK_STRING; } +<STRING>\" BEGIN(INITIAL); + +\[ BEGIN(ADDR6); +<ADDR6>[^\]]+ { + if (!inet_pton(AF_INET6, yytext, &yylval->addr6)) + exit_error(ctx, "config error: invalid address"); + + return TOK_ADDR6; + } +<ADDR6>\] BEGIN(INITIAL); + +<INITIAL,STRING,ADDR6>. exit_error(ctx, "config error: invalid character"); +%% |