[template-glib] expr-scanner.l: cleanup scanning of string literals



commit 4a1f6088a8d959eeed5883bc944fe4e7cef94e16
Author: Christian Hergert <chergert redhat com>
Date:   Wed May 4 13:01:46 2022 -0700

    expr-scanner.l: cleanup scanning of string literals
    
    We don't care about the whole L"" stuff in the literal as that should only
    be dealt with when scanning so the parser can be naive.

 src/tmpl-expr-parser.y  |  6 ++----
 src/tmpl-expr-scanner.l | 17 ++++++++++++++++-
 2 files changed, 18 insertions(+), 5 deletions(-)
---
diff --git a/src/tmpl-expr-parser.y b/src/tmpl-expr-parser.y
index 202b2b9..d8c11eb 100644
--- a/src/tmpl-expr-parser.y
+++ b/src/tmpl-expr-parser.y
@@ -165,7 +165,7 @@ exp: exp CMP exp {
     $$ = tmpl_expr_new_boolean ($1);
   }
   | STRING_LITERAL {
-    $$ = tmpl_expr_new_string ($1+1, strlen($1) - 2);
+    $$ = tmpl_expr_new_string ($1, -1);
   }
   | NAME {
     $$ = tmpl_expr_new_symbol_ref ($1);
@@ -204,9 +204,7 @@ exp: exp CMP exp {
     $$ = tmpl_expr_new_require ($2, NULL);
   }
   | REQUIRE NAME VERSION STRING_LITERAL {
-    char *vstr = g_strndup ($4+1, strlen($4)-2);
-    $$ = tmpl_expr_new_require ($2, vstr);
-    g_free (vstr);
+    $$ = tmpl_expr_new_require ($2, $4);
   }
 ;
 
diff --git a/src/tmpl-expr-scanner.l b/src/tmpl-expr-scanner.l
index 6e1368b..b2d9bbf 100644
--- a/src/tmpl-expr-scanner.l
+++ b/src/tmpl-expr-scanner.l
@@ -16,6 +16,21 @@
 
 #pragma GCC diagnostic ignored "-Wswitch-default"
 #pragma GCC diagnostic ignored "-Wunused-function"
+
+static char *
+copy_literal (const char *str)
+{
+  gsize len;
+  if (str[0] == 'L')
+    str++;
+  g_assert (str[0] == '\"');
+  str++;
+  len = strlen (str);
+  g_assert (len > 0);
+  g_assert (str[len-1] == '\"');
+  return g_strndup (str, len - 1);
+}
+
 %}
 
 %option extra-type="TmplExprParser *"
@@ -76,7 +91,7 @@ TmplExprParser *parser = yyextra;
 "typeof" { yylval->fn = TMPL_EXPR_BUILTIN_TYPEOF; return BUILTIN; }
 
  /* string literals */
-L?\"(\\.|[^\\"])*\" { yylval->s = yytext; return STRING_LITERAL; }
+L?\"(\\.|[^\\"])*\" { yylval->s = copy_literal (yytext); return STRING_LITERAL; }
 
  /* @ to escape reserved keywords */
 @[a-zA-Z_][a-zA-Z0-9_]* {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]