]> git.ozlabs.org Git - petitboot/blobdiff - discover/grub2/grub2-lexer.l
discover/udev: Don't call udev_set_log_fn()
[petitboot] / discover / grub2 / grub2-lexer.l
index 066af6073baa78012a8dd7d513696adb96eefaa9..81dc5fe8ac78678d883a8c8325ace472fe953fed 100644 (file)
@@ -22,14 +22,14 @@ void yyerror(struct grub2_parser *parser, const char *fmt, ...);
 %x dqstring
 
 WORD   [^{}|&$;<> \t\n'"#]+
+DELIM  [ \t]+
+BLANK  ["]{2}|[']{2}
 VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#])
 
 %%
 
- /* discard leading & trailing whitespace, but keep inter-word delimeters */
-^[ \t]+        ;
-[ \t]+$        ;
-[ \t]+ return TOKEN_DELIM;
+ /* discard whitespace, unless we're looking for inter-word delimiters */
+{DELIM}             { if (yyget_extra(yyscanner)->inter_word) return TOKEN_DELIM; }
 
  /* reserved words */
 "[["         return TOKEN_LDSQBRACKET;
@@ -53,9 +53,16 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#])
 "until"      return TOKEN_UTIL;
 "while"      return TOKEN_WHILE;
 
+ /* ignore quoted empty strings */
+{BLANK} {
+               yylval->word = create_word_text(yyget_extra(yyscanner), "");
+               yyget_extra(yyscanner)->inter_word = true;
+               return TOKEN_WORD;
+       }
  /* anything that's not a metachar: return as a plain word */
 {WORD} {
                yylval->word = create_word_text(yyget_extra(yyscanner), yytext);
+               yyget_extra(yyscanner)->inter_word = true;
                return TOKEN_WORD;
        }
 
@@ -68,6 +75,7 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#])
                yytext++;
                yylval->word = create_word_var(yyget_extra(yyscanner), yytext,
                                                true);
+               yyget_extra(yyscanner)->inter_word = true;
                return TOKEN_WORD;
        }
 
@@ -80,6 +88,7 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#])
        }
 <sqstring>[^']+ {
                yylval->word = create_word_text(yyget_extra(yyscanner), yytext);
+               yyget_extra(yyscanner)->inter_word = true;
                return TOKEN_WORD;
        }
 
@@ -92,6 +101,7 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#])
        }
 <dqstring>([^"\$]|\\\")+ {
                yylval->word = create_word_text(yyget_extra(yyscanner), yytext);
+               yyget_extra(yyscanner)->inter_word = true;
                return TOKEN_WORD;
        }
 <dqstring>\${VARNAME} |
@@ -103,17 +113,21 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#])
                yytext++;
                yylval->word = create_word_var(yyget_extra(yyscanner), yytext,
                                                false);
+               yyget_extra(yyscanner)->inter_word = true;
                return TOKEN_WORD;
        }
 
 
 
  /* blocks */
-"{"    return '{';
-"}"    return '}';
+"{"    { yyget_extra(yyscanner)->inter_word = false; return '{'; }
+"}"    { yyget_extra(yyscanner)->inter_word = false; return '}'; }
 
  /* end-of-line */
-[ \t]*(;|\n)[ \t]*     return TOKEN_EOL;
+[ \t]*(;|\n)[ \t]*     {
+               yyget_extra(yyscanner)->inter_word = false;
+               return TOKEN_EOL;
+       }
 
  /* strip comments */
 #.*    ;