From 4a6598906402ace1e9e40e312bef3a61112b28a2 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 13 Aug 2013 18:05:26 +0200 Subject: lexer: simplify IPv6 address matching --- src/config.l | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/config.l b/src/config.l index dee1d39..e04903b 100644 --- a/src/config.l +++ b/src/config.l @@ -35,23 +35,22 @@ %top { - #include +#include } %s NEEDSPACE %s STRING -%s ADDR6 %s COMMENT %% %{ - #define UPDATE_LOCATION do { \ - yylloc->first_line = yylloc->last_line; \ - yylloc->first_column = yylloc->last_column+1; \ - yylloc->last_column += yyleng; \ - } while (0) +#define UPDATE_LOCATION do { \ + yylloc->first_line = yylloc->last_line; \ + yylloc->first_column = yylloc->last_column+1; \ + yylloc->last_column += yyleng; \ + } while (0) - #define TOKEN(tok) do { UPDATE_LOCATION; BEGIN(NEEDSPACE); return tok; } while (0) +#define TOKEN(tok) do { UPDATE_LOCATION; BEGIN(NEEDSPACE); return tok; } while (0) %} { @@ -142,6 +141,20 @@ auto { TOKEN(TOK_AUTO); } return TOK_ADDR4; } +\[[0-9a-fA-F:]+\] { + UPDATE_LOCATION; + + yytext[yyleng-1] = 0; + + if (!inet_pton(AF_INET6, yytext+1, &yylval->addr6)) { + yylval->error = "invalid address"; + return -1; + } + + BEGIN(NEEDSPACE); + return TOK_ADDR6; + } + [;:\{\}] { UPDATE_LOCATION; return yytext[0]; } [ \t] { yylloc->last_column++; } @@ -189,16 +202,6 @@ auto { TOKEN(TOK_AUTO); } } -\[ { UPDATE_LOCATION; BEGIN(ADDR6); } -[0-9a-fA-F:]+ { - yylloc->last_column += yyleng; - if (!inet_pton(AF_INET6, yytext, &yylval->addr6)) { - yylval->error = "invalid address"; - return -1; - } - } -\] { yylloc->last_column++; BEGIN(NEEDSPACE); return TOK_ADDR6; } - #.* { yylloc->last_column += yyleng; } \/\/.* { yylloc->last_column += yyleng; } @@ -218,5 +221,4 @@ auto { TOKEN(TOK_AUTO); } <> { return 0; } <> { yylval->error = "unterminated block comment"; return -1; } <> { yylval->error = "unterminated string"; return -1; } -<> { yylval->error = "unterminated address"; return -1; } %% -- cgit v1.2.3