summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars-Dominik Braun <lars@6xq.net>2024-05-04 09:43:11 +0200
committerSharlatan Hellseher <sharlatanus@gmail.com>2024-12-13 20:18:36 +0000
commit63cb43d56cab5cea439890056359434d89c2b611 (patch)
tree25da90e4976023605adfdb079537c968a762d1a6
parentb59cdd59eba7567f21593e8ab21e595dac7aeff4 (diff)
guix: toml: Fix parsing empty strings in arrays.
Change-Id: Id14d4008391a01820ade754fa9c2ca8e88b8c7f9
-rw-r--r--guix/build/toml.scm15
-rw-r--r--tests/toml.scm27
2 files changed, 36 insertions, 6 deletions
diff --git a/guix/build/toml.scm b/guix/build/toml.scm
index d5ea01d001..81b54fa5b7 100644
--- a/guix/build/toml.scm
+++ b/guix/build/toml.scm
@@ -97,7 +97,7 @@
;; Basic String
(define-peg-pattern basic-string body (and (ignore "\"")
- (* basic-char)
+ (or (+ basic-char) "")
(ignore "\"")))
(define-peg-pattern basic-char body (or basic-unescaped escaped))
(define-peg-pattern basic-unescaped body (or wschar
@@ -116,9 +116,11 @@
;; Multiline Basic String
(define-peg-pattern ml-basic-string body (and
- ml-basic-string-delim
+ ml-basic-string-delim
(? ignore-newline)
- ml-basic-body
+ ;; Force the result of the empty string
+ ;; to be a string, not no token.
+ (and ml-basic-body "")
ml-basic-string-delim))
(define-peg-pattern ml-basic-string-delim none "\"\"\"")
(define-peg-pattern ml-basic-body body (and
@@ -145,7 +147,7 @@
;; Literal String
(define-peg-pattern literal-string body (and (ignore "'")
- (* literal-char)
+ (or (+ literal-char) "")
(ignore "'")))
(define-peg-pattern literal-char body (or "\x09"
(range #\x20 #\x26)
@@ -156,7 +158,9 @@
(define-peg-pattern ml-literal-string body (and
ml-literal-string-delim
(? ignore-newline)
- ml-literal-body
+ ;; Force the result of the empty string
+ ;; to be a string, not no token.
+ (and ml-literal-body "")
ml-literal-string-delim))
(define-peg-pattern ml-literal-string-delim none "'''")
(define-peg-pattern ml-literal-body body (and
@@ -475,4 +479,3 @@ the list KEY. For instance a KEY (a b) would retrieve alist[a][b]."
"Parse and evaluate toml document from file FILE."
(parse-toml (call-with-input-file file get-string-all)))
-
diff --git a/tests/toml.scm b/tests/toml.scm
index cd731cd2f0..cd8e4d2338 100644
--- a/tests/toml.scm
+++ b/tests/toml.scm
@@ -305,6 +305,33 @@ integers3 = [
2, # this is ok
]"))
+(test-equal "parse-toml: Arrays of empty strings"
+ '(("empty1" "")
+ ("empty2" "" "")
+ ("empty3" "" "" "")
+ ("emptyraw1" "")
+ ("emptyraw2" "" "")
+ ("emptyraw3" "" "" "")
+ ("emptyml1" "")
+ ("emptyml2" "" "")
+ ("emptyml3" "" "" "")
+ ("emptyrawml1" "")
+ ("emptyrawml2" "" "")
+ ("emptyrawml3" "" "" ""))
+ (parse-toml "empty1 = [ \"\" ]
+empty2 = [ \"\", \"\" ]
+empty3 = [ \"\", \"\", \"\" ]
+emptyraw1 = [ '' ]
+emptyraw2 = [ '', '' ]
+emptyraw3 = [ '', '', '' ]
+emptyml1 = [ \"\"\"\"\"\" ]
+emptyml2 = [ \"\"\"\"\"\", \"\"\"\"\"\" ]
+emptyml3 = [ \"\"\"\"\"\", \"\"\"\"\"\", \"\"\"\"\"\" ]
+emptyrawml1 = [ '''''' ]
+emptyrawml2 = [ '''''', '''''' ]
+emptyrawml3 = [ '''''', '''''', '''''' ]
+"))
+
(test-equal "parse-toml: Tables"
'(("table-1" ("key1" . "some string")
("key2" . 123))