]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/command_lex.l
lib: add CLI token for 48-bit mac addresses
[mirror_frr.git] / lib / command_lex.l
index 5c709dce222120299e5c846f37a862fe5bbf8c07..59d0d840a88a8325cd1b66aa6bb794d99b291544 100644 (file)
  */
 
 %{
+/* ignore harmless bug in old versions of flex */
+#pragma GCC diagnostic ignored "-Wsign-compare"
+
 #include "command_parse.h"
 
-extern void set_lexer_string (const char *);
-extern void cleanup_lexer (void);
-YY_BUFFER_STATE buffer;
+#define YY_USER_ACTION yylloc->last_column += yyleng;
+#define LOC_STEP do { if (yylloc) { \
+        yylloc->first_column = yylloc->last_column; \
+        yylloc->first_line = yylloc->last_line; \
+       } } while(0)
 %}
 
-WORD            (\-|\+)?[a-z\*][-+_a-zA-Z0-9\*]*
+WORD            (\-|\+)?[a-z0-9\*][-+_a-zA-Z0-9\*]*
 IPV4            A\.B\.C\.D
 IPV4_PREFIX     A\.B\.C\.D\/M
 IPV6            X:X::X:X
 IPV6_PREFIX     X:X::X:X\/M
+MAC             M:A:C
+MAC_PREFIX      M:A:C\/M
 VARIABLE        [A-Z][-_a-zA-Z:0-9]+
 NUMBER          (\-|\+)?[0-9]{1,20}
 RANGE           \({NUMBER}[ ]?\-[ ]?{NUMBER}\)
@@ -44,28 +51,42 @@ RANGE           \({NUMBER}[ ]?\-[ ]?{NUMBER}\)
 %option noyywrap
 %option nounput
 %option noinput
-%option outfile="command_lex.c"
+%option outfile="lib/command_lex.c"
+%option header-file="lib/command_lex.h"
+%option prefix="cmd_yy"
+%option reentrant
+%option bison-bridge
+%option bison-locations
 
 %%
-[ /t]           /* ignore whitespace */;
-{WORD}          {yylval.string = XSTRDUP(MTYPE_TMP, yytext); return WORD;}
-{IPV4}          {yylval.string = XSTRDUP(MTYPE_TMP, yytext); return IPV4;}
-{IPV4_PREFIX}   {yylval.string = XSTRDUP(MTYPE_TMP, yytext); return IPV4_PREFIX;}
-{IPV6}          {yylval.string = XSTRDUP(MTYPE_TMP, yytext); return IPV6;}
-{IPV6_PREFIX}   {yylval.string = XSTRDUP(MTYPE_TMP, yytext); return IPV6_PREFIX;}
-{VARIABLE}      {yylval.string = XSTRDUP(MTYPE_TMP, yytext); return VARIABLE;}
-{RANGE}         {yylval.string = XSTRDUP(MTYPE_TMP, yytext); return RANGE;}
+%{
+                LOC_STEP;
+%}
+
+[ \t]+          LOC_STEP /* ignore whitespace */;
+{WORD}          {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return WORD;}
+{IPV4}          {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV4;}
+{IPV4_PREFIX}   {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV4_PREFIX;}
+{IPV6}          {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV6;}
+{IPV6_PREFIX}   {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV6_PREFIX;}
+{MAC}           {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return MAC;}
+{MAC_PREFIX}    {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return MAC_PREFIX;}
+{VARIABLE}      {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return VARIABLE;}
+{RANGE}         {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return RANGE;}
 .               {return yytext[0];}
 %%
 
-void
-set_lexer_string (const char *string)
+YY_BUFFER_STATE buffer;
+
+void set_lexer_string (yyscan_t *scn, const char *string)
 {
-  buffer = yy_scan_string (string);
+  *scn = NULL;
+  yylex_init(scn);
+  buffer = yy_scan_string (string, *scn);
 }
 
-void
-cleanup_lexer ()
+void cleanup_lexer (yyscan_t *scn)
 {
-  yy_delete_buffer (buffer);
+  // yy_delete_buffer (buffer, *scn);
+  yylex_destroy(*scn);
 }