~ chicken-core (chicken-5) d7bc26071a3ab26c58cb9474056b61f90f017fab
commit d7bc26071a3ab26c58cb9474056b61f90f017fab Author: Evan Hanson <evhan@foldling.org> AuthorDate: Thu Oct 31 19:05:17 2013 +1300 Commit: Moritz Heidkamp <moritz@twoticketsplease.de> CommitDate: Sun Nov 3 18:18:39 2013 +0100 Treat lone carriage returns as line endings in ##sys#scan-buffer-line This fixes #1004. Signed-off-by: Peter Bex <peter.bex@xs4all.nl> diff --git a/library.scm b/library.scm index 364b4778..7297a72e 100644 --- a/library.scm +++ b/library.scm @@ -3677,6 +3677,8 @@ EOF (##sys#string-append line "\r"))) ;; Restore \r here, too (when we reached EOF) (values offset (##sys#string-append line "\r") #t))))) + ((eq? c #\return) + (values (fx+ pos 1) (copy&append buf offset pos line) #t)) (else (loop buf offset (fx+ pos 1) limit line)) ) ) ) ) ) (define (open-input-string string) diff --git a/tests/port-tests.scm b/tests/port-tests.scm index ebba3503..259892cf 100644 --- a/tests/port-tests.scm +++ b/tests/port-tests.scm @@ -353,6 +353,27 @@ EOF buf "89067"))) +(test-group "line endings" + (let ((s "foo\nbar\rbaz\r\nqux") + (f (lambda () + (test-equal "\\n" (read-line) "foo") + (test-equal "\\r" (read-line) "bar") + (test-equal "\\r\\n" (read-line) "baz") + (test-equal "eof" (read-line) "qux")))) + (test-group "string port" + (with-input-from-string s f)) + (test-group "file port" + (let ((file "mixed-line-endings")) + (with-output-to-file file (lambda () (display s))) + (with-input-from-file file f) + (delete-file* file))) + (test-group "custom port" + (let* ((p (open-input-string s)) + (p* (make-input-port (lambda () (read-char p)) + (lambda () (char-ready? p)) + (lambda () (close-input-port p))))) + (with-input-from-port p* f))))) + ;; Disabled because it requires `echo -n` for ;; the EOF test, and that is not available on all systems. ;; Uncomment locally to run.Trap