diff packages/language/c/libc/stdio/current/src/input/fread.cxx @ 163:0d2b193a635f

Merge from eCos master repository on 2001-06-22-17:38:39-BST
author jlarmour
date Fri, 22 Jun 2001 18:18:44 +0000
parents 6ed91473a1cd
children e0c0827131d1
line wrap: on
line diff
--- a/packages/language/c/libc/stdio/current/src/input/fread.cxx
+++ b/packages/language/c/libc/stdio/current/src/input/fread.cxx
@@ -63,7 +63,10 @@ fread( void *ptr, size_t object_size, si
 {
     Cyg_StdioStream *real_stream = (Cyg_StdioStream *)stream;
     cyg_ucount32 bytes_read;
+    cyg_ucount32 bytes_to_read;
+    cyg_ucount32 total_read;
     Cyg_ErrNo err;
+    cyg_uint8 *ptrc = (cyg_uint8 *)ptr;
     
 
     CYG_REPORT_FUNCNAMETYPE( "fread", "read %d objects" );
@@ -71,20 +74,30 @@ fread( void *ptr, size_t object_size, si
                          "stream=%08x", ptr, object_size, num_objects,
                          stream );
 
-    if ( (object_size==0) || (num_objects==0) ) {
+    bytes_to_read = object_size*num_objects;
+    total_read = 0;
+
+    if ( !bytes_to_read ) {
         CYG_REPORT_RETVAL(0);
         return 0;
     } // if
 
-    err = real_stream->read( (cyg_uint8 *)ptr, object_size*num_objects,
+    err = real_stream->read( (cyg_uint8 *)ptr, bytes_to_read,
                              &bytes_read );
+    bytes_to_read -= bytes_read;
+    total_read += bytes_read;
+    ptrc += bytes_read;
 
-    if (!err && !bytes_read) { // if no err, but nothing to read, try again
+    while (!err && bytes_to_read) { // if no err, but not finished - get next
         err = real_stream->refill_read_buffer();
-        if ( !err )
-            err = real_stream->read( (cyg_uint8 *)ptr, object_size*num_objects,
+        if ( !err ) {
+            err = real_stream->read( (cyg_uint8 *)ptr, bytes_to_read,
                                      &bytes_read );
-    } // if
+            bytes_to_read -= bytes_read;
+            total_read += bytes_read;
+            ptrc += bytes_read;
+        } // if
+    } // while
 
     if (err) {
         real_stream->set_error( err );
@@ -94,7 +107,7 @@ fread( void *ptr, size_t object_size, si
     // we return the number of _objects_ read. Simple division is
     // sufficient as this returns the quotient rather than rounding
     CYG_REPORT_RETVAL( bytes_read/object_size );
-    return bytes_read/object_size;
+    return total_read/object_size;
 
 } // fread()