~ chicken-core (chicken-5) 1b499f9022ca5650bea2510eb1f061e5997e98a1


commit 1b499f9022ca5650bea2510eb1f061e5997e98a1
Author:     Peter Bex <peter.bex@xs4all.nl>
AuthorDate: Sat Nov 3 21:47:11 2012 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Mon Nov 5 20:45:58 2012 +0100

    Simplify and fix fast_read_string_from_file so it will correctly keep reading when interrupted after having read 0 bytes (by always clearing errors)
    
    Signed-off-by: felix <felix@call-with-current-continuation.org>

diff --git a/library.scm b/library.scm
index 1711b84a..569c9f5c 100644
--- a/library.scm
+++ b/library.scm
@@ -117,16 +117,10 @@ fast_read_string_from_file(C_word dest, C_word port, C_word len, C_word pos)
   size_t m = fread (buf, sizeof (char), n, fp);
 
   if (m < n) {
-    if (feof (fp)) {
-      if (0 == m)
-	return C_SCHEME_END_OF_FILE;
-    } else if (ferror (fp)) {
-      if (0 == m) {
-	return C_SCHEME_FALSE;
-      } else {
-	clearerr (fp);
-      }
-    }
+    if (ferror(fp)) /* Report to Scheme, which may retry, so clear errors */
+      clearerr(fp);
+    else if (feof(fp) && 0 == m) /* eof but m > 0? Return data first, below */
+      return C_SCHEME_END_OF_FILE; /* Calling again will get us here */
   }
 
   return C_fix (m);
@@ -1796,9 +1790,8 @@ EOF
 	  (lambda (p n dest start)		; read-string!
 	    (let loop ([rem (or n (fx- (##sys#size dest) start))] [act 0] [start start])
 	      (let ([len (##core#inline "fast_read_string_from_file" dest p rem start)])
-		(cond [(or (not len)	      ; error returns EOF
-			   (eof-object? len)) ; EOF returns 0 bytes read
-		       act]
+		(cond ((eof-object? len) ; EOF returns 0 bytes read
+		       act)
 		      ((fx< len 0)
 		       (##sys#update-errno)
 		       (if (eq? (errno) (foreign-value "EINTR" int))
@@ -1810,10 +1803,10 @@ EOF
 			    #:file-error 'read-string!
 			    (##sys#string-append "cannot read from port - " strerror)
 			    p n dest start)))
-		      [(fx< len rem)
-		       (loop (fx- rem len) (fx+ act len) (fx+ start len))]
-		      [else
-		       (fx+ act len) ] ) )))
+		      ((fx< len rem)
+		       (loop (fx- rem len) (fx+ act len) (fx+ start len)))
+		      (else
+		       (fx+ act len) ) ) )))
 	  (lambda (p rlimit)		; read-line
 	    (if rlimit (##sys#check-exact rlimit 'read-line))
 	    (let ((sblen read-line-buffer-initial-size))
Trap