From 63cb43d56cab5cea439890056359434d89c2b611 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Sat, 4 May 2024 09:43:11 +0200 Subject: [PATCH] guix: toml: Fix parsing empty strings in arrays. Change-Id: Id14d4008391a01820ade754fa9c2ca8e88b8c7f9 --- guix/build/toml.scm | 15 +++++++++------ tests/toml.scm | 27 +++++++++++++++++++++++++++ 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 @@ (define-peg-pattern string all (or ml-basic-string ;; 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 @@ (define-peg-pattern escaped all (and ;; 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 @@ (define-peg-pattern mlb-escaped-nl none (and "\\" ws newline ;; 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 literal-char body (or "\x09" (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 @@ (define (parse-toml-file file) "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 @@ (define-module (test-toml) 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))