diff --git a/CHANGELOG.md b/CHANGELOG.md index 73d0100..faa616a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,8 +19,11 @@ ### Fixed * Compiler error _‘fmt’ may be used uninitialized_ ([#311][311]). +* map: conditions failing to match when they contain multiple, quoted + tag values ([#302][302]). [311]: https://codeberg.org/dnkl/yambar/issues/311 +[302]: https://codeberg.org/dnkl/yambar/issues/302 ### Security diff --git a/particles/map.l b/particles/map.l index 7a5ebc8..d34f086 100644 --- a/particles/map.l +++ b/particles/map.l @@ -2,13 +2,67 @@ #include #include "map.h" #include "map.tab.h" +void yyerror(const char *s); %} %option warn nodefault nounput noinput noyywrap + char *quoted = NULL; + size_t quote_len = 0; + +%x QUOTE + %% + [[:alnum:]_-]+ yylval.str = strdup(yytext); return WORD; -\".*\" yylval.str = strndup(yytext + 1, strlen(yytext) - 2); return STRING; + +\" { + BEGIN(QUOTE); + quoted = calloc(1, sizeof(quoted[0])); +} + +[^\\\"]* { + /* printf("CAT: %s\n", yytext); */ + const size_t yy_length = strlen(yytext); + quoted = realloc(quoted, quote_len + yy_length + 1); + strcat(quoted, yytext); + quote_len += yy_length; +} + +\\\" { + /* printf("escaped quote\n"); */ + quoted = realloc(quoted, quote_len + 1 + 1); + strcat(quoted, "\""); + quote_len++; +} + +\\. { + /* printf("CAT: %s\n", yytext); */ + const size_t yy_length = strlen(yytext); + quoted = realloc(quoted, quote_len + yy_length + 1); + strcat(quoted, yytext); + quote_len += yy_length; +} + +\\ { + /* quoted string that ends with a backslash: "string\ */ + quoted = realloc(quoted, quote_len + 1 + 1); + strcat(quoted, "\\"); + quote_len++; +} + +\" { + /* printf("QUOTED=%s\n", quoted); */ + yylval.str = strdup(quoted); + + free(quoted); + quoted = NULL; + quote_len = 0; + + BEGIN(INITIAL); + return STRING; +} + == yylval.op = MAP_OP_EQ; return CMP_OP; != yylval.op = MAP_OP_NE; return CMP_OP; \<= yylval.op = MAP_OP_LE; return CMP_OP;