plpgsql, scala, vimscript, yorick: Detect more unterminated strings.
authorBen Harris <bjh21@bjh21.me.uk>
Sun, 19 May 2019 09:50:54 +0000 (10:50 +0100)
committerBen Harris <bjh21@bjh21.me.uk>
Sun, 19 May 2019 11:00:07 +0000 (12:00 +0100)
This is achieved by tightening the regexp used to detect valid strings.

plpgsql/reader.sql
scala/reader.scala
vimscript/reader.vim
yorick/reader.i

index 4210961..1ac54b3 100644 (file)
@@ -36,7 +36,7 @@ BEGIN
         INSERT INTO types.value (type_id, val_int)
             VALUES (3, CAST(token AS integer))
             RETURNING value_id INTO result;
-    ELSIF token ~ '^".*"' THEN  -- string
+    ELSIF token ~ '^"(?:[\\\\].|[^\\\\"])*"' THEN  -- string
         -- string
         str := substring(token FROM 2 FOR (char_length(token)-2));
         str := replace(str, '\\', chr(CAST(x'7f' AS integer)));
index cbd9ec5..d4913f8 100644 (file)
@@ -37,7 +37,7 @@ object reader {
     val token = rdr.next()
     val re_int = """^(-?[0-9]+)$""".r
     val re_flt = """^(-?[0-9][0-9.]*)$""".r
-    val re_str =  """^"(.*)"$""".r
+    val re_str =  """^"((?:\\.|[^\\"])*)"$""".r
     val re_str_bad =  """^"(.*)$""".r
     val re_key = """^:(.*)$""".r
     return token match {
index ed1a694..5d86dec 100644 (file)
@@ -65,7 +65,7 @@ function ReadAtom(rdr)
     return IntegerNew(str2nr(token))
   elseif token =~ "^-\\?[0-9][0-9.]*$"
     return FloatNew(str2float(token))
-  elseif token =~ "^\".*\"$"
+  elseif token =~ "^\"\\%(\\\\.\\|[^\\\\\"]\\)*\"$"
     return StringNew(ParseString(token))
   elseif token =~ "^\".*$"
     throw "expected '\"', got EOF"
index 571192e..f102a41 100644 (file)
@@ -45,7 +45,7 @@ func reader_next(rdr)
 }
 
 NUMBER_REGEXP = regcomp("^-?[0-9]+$")
-STR_REGEXP = regcomp("^\".*\"$")
+STR_REGEXP = regcomp("^\"([\\].|[^\\\"])*\"$")
 STR_BAD_REGEXP = regcomp("^\".*$")
 
 func unescape(s)