~ chicken-core (chicken-5) 59007e8bb8ea153f9e942945380139714a045f88
commit 59007e8bb8ea153f9e942945380139714a045f88
Author: Evan Hanson <evhan@foldling.org>
AuthorDate: Fri Dec 27 06:41:48 2013 +1300
Commit: Evan Hanson <evhan@foldling.org>
CommitDate: Fri Dec 27 06:41:48 2013 +1300
Fix premature EOF termination
This fixes the same issue as 1d9b585 in a slightly different way, in
order to fix a bug in empty line handling for here documents introduced
by that change.
diff --git a/library.scm b/library.scm
index 7ff334dc..2f81948e 100644
--- a/library.scm
+++ b/library.scm
@@ -4577,7 +4577,7 @@ EOF
(let ([ln (open-output-string)])
(do ([c (##sys#read-char-0 port) (##sys#read-char-0 port)])
((or (eof-object? c) (char=? #\newline c))
- (get-output-string ln))
+ (if (eof-object? c) c (get-output-string ln)))
(##sys#write-char-0 c ln) ) ) )
(define (read-escaped-sexp port skip-brace?)
(when skip-brace? (##sys#read-char-0 port))
@@ -4600,7 +4600,7 @@ EOF
(let ([str (open-output-string)]
[end (readln port)]
[f #f] )
- (let ((endlen (string-length end)))
+ (let ((endlen (if (eof-object? end) 0 (string-length end))))
(cond
((fx= endlen 0)
(##sys#read-warning
@@ -4611,8 +4611,8 @@ EOF
port "Whitespace after #<< here-doc tag"))
))
(do ([ln (readln port) (readln port)])
- ((or (string=? "" ln) (string=? end ln))
- (when (string=? "" ln)
+ ((or (eof-object? ln) (string=? end ln))
+ (when (eof-object? ln)
(##sys#read-warning port
(##sys#format-here-doc-warning end)))
(get-output-string str) )
@@ -4629,7 +4629,7 @@ EOF
(set! str (open-output-string))
s))
- (let ((endlen (string-length end)))
+ (let ((endlen (if (eof-object? end) 0 (string-length end))))
(cond
((fx= endlen 0)
(##sys#read-warning
diff --git a/tests/library-tests.scm b/tests/library-tests.scm
index 562f8846..ba75076d 100644
--- a/tests/library-tests.scm
+++ b/tests/library-tests.scm
@@ -377,6 +377,31 @@
(assert-fail (with-input-from-string "|\\" read))
(assert-fail (with-input-from-string "\"\\" read))
+;;; here documents
+
+(assert (string=? "" #<<A
+A
+))
+
+(assert (string=? "foo" #<<A
+foo
+A
+))
+
+(assert (string=? "\nfoo\n" #<<A
+
+foo
+
+A
+))
+
+(assert (string=? "foo\nbar\nbaz" #<<A
+foo
+bar
+baz
+A
+))
+
;;; setters
(define x '(a b c))
Trap