~ chicken-core (chicken-5) 9508c87607b69dbe5026ea7227e1c1ff9ce1ef22
commit 9508c87607b69dbe5026ea7227e1c1ff9ce1ef22
Author: Peter Bex <peter@more-magic.net>
AuthorDate: Sun Jul 29 17:33:27 2018 +0200
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Mon Jul 30 09:57:13 2018 +0200
Restore read-string semantics when reading 0 bytes by not attempting to peek
We accidentally changed this behaviour when we changed read-string to
return #!eof on EOF. The code was slightly restructured under the
assumption that calling peek-char will never hurt, and then return ""
when asking for zero bytes.
Logically, this is correct, but in some cases the FD might not be
ready. In those cases you may run into a read timeout, but reading
zero bytes should arguably always succeed immediately, regardless of
port/FD state.
Signed-off-by: felix <felix@call-with-current-continuation.org>
diff --git a/extras.scm b/extras.scm
index bc04f161..ec504fc6 100644
--- a/extras.scm
+++ b/extras.scm
@@ -153,8 +153,8 @@
(define read-string/port
(lambda (n p)
- (cond ((eof-object? (##sys#peek-char-0 p))
- (if (eq? n 0) "" #!eof))
+ (cond ((eq? n 0) "") ; Don't attempt to peek (fd might not be ready)
+ ((eof-object? (##sys#peek-char-0 p)) #!eof)
(n (let* ((str (##sys#make-string n))
(n2 (read-string!/port n str p 0)))
(if (eq? n n2)
Trap