~ chicken-core (chicken-5) df10e8ae06e98d27f045463949b8acaef765c6e7
commit df10e8ae06e98d27f045463949b8acaef765c6e7 Author: Peter Bex <peter.bex@xs4all.nl> AuthorDate: Sun Sep 29 13:17:58 2013 +0200 Commit: Christian Kellermann <ckeen@pestilenz.org> CommitDate: Wed Oct 2 14:26:55 2013 +0200 Fix read-string! behaviour after peeking at EOF & add regression test. Slot 6 does not store the peeked character (anymore?), but whether the port is in an EOF state. Peeking goes via ungetc on FILE * ports, and via custom logic in other port types. Signed-off-by: Christian Kellermann <ckeen@pestilenz.org> diff --git a/extras.scm b/extras.scm index 613edeef..36b6bc99 100644 --- a/extras.scm +++ b/extras.scm @@ -148,9 +148,6 @@ (define (##sys#read-string! n dest port start) (cond ((eq? n 0) 0) (else - (when (##sys#slot port 6) ; peeked? - (##core#inline "C_setsubchar" dest start (##sys#read-char-0 port)) - (set! start (fx+ start 1)) ) (let ((rdstring (##sys#slot (##sys#slot port 2) 7))) (if rdstring (let loop ((start start) (n n) (m 0)) diff --git a/tests/port-tests.scm b/tests/port-tests.scm index bd7c8586..ebba3503 100644 --- a/tests/port-tests.scm +++ b/tests/port-tests.scm @@ -300,6 +300,9 @@ EOF (test-group "read-string!" (let ((in (open-input-string "1234567890")) (buf (make-string 5))) + (test-equal "peek-char won't influence the result of read-string!" + (peek-char in) + #\1) (test-equal "read-string! won't read past buffer if given #f" (read-string! #f buf in) 5) @@ -317,6 +320,11 @@ EOF 3) (test-equal "read-string! leaves the buffer's tail intact" buf + "89067") + (test-equal "after peek-char at EOF, read-string! doesn't mutate the buffer" + (begin (peek-char in) + (read-string! #f buf in) + buf) "89067")) (let ((in (open-input-string "1234567890")) (buf (make-string 5))) @@ -336,6 +344,12 @@ EOF (read-string! 10 buf in) 3) (test-equal "read-string! leaves the buffer's tail intact" + buf + "89067") + (test-equal "read-string! at EOF reads nothing" + (read-string! 10 buf in) + 0) + (test-equal "read-string! at EOF doesn't mutate the buffer" buf "89067")))Trap