Duane Clark : msvcrt: Remove read_i loop and fix fread.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jul 31 15:01:26 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 5c4b18a931cc1779ec7cc49a4c871ec7397eebcc
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=5c4b18a931cc1779ec7cc49a4c871ec7397eebcc

Author: Duane Clark <fpga at pacbell.net>
Date:   Mon Jul 31 12:12:02 2006 -0700

msvcrt: Remove read_i loop and fix fread.

---

 dlls/msvcrt/file.c |   50 +++++++++++++++++++-------------------------------
 1 files changed, 19 insertions(+), 31 deletions(-)

diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index d5d9647..266adb2 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -1619,7 +1619,7 @@ static unsigned int remove_cr(char *buf,
  */
 static int read_i(int fd, void *buf, unsigned int count)
 {
-  DWORD num_read, all_read = 0;
+  DWORD num_read;
   char *bufstart = buf;
   HANDLE hand = msvcrt_fdtoh(fd);
 
@@ -1630,34 +1630,25 @@ static int read_i(int fd, void *buf, uns
     return -1;
 
   /* Reading single bytes in O_TEXT mode makes things slow
-   * So read big chunks, then remove the \r in memory and try reading
-   * the rest until the request is satisfied or EOF is met
+   * So read big chunks
    */
-  while (all_read < count)
-  {
-      if (ReadFile(hand, bufstart+all_read, count - all_read, &num_read, NULL))
-      {
-          if (num_read != (count - all_read))
-          {
-              TRACE(":EOF\n");
-              MSVCRT_fdesc[fd].wxflag |= WX_ATEOF;
-              all_read += num_read;
-              if (count > 4)
-                  TRACE("%s\n",debugstr_an(buf,all_read));
-              return all_read;
-          }
-          all_read += num_read;
-      }
-      else
-      {
-          TRACE(":failed-last error (%ld)\n",GetLastError());
-          return -1;
-      }
-  }
+    if (ReadFile(hand, bufstart, count, &num_read, NULL))
+    {
+        if (num_read != count)
+        {
+            MSVCRT_fdesc[fd].wxflag |= WX_ATEOF;
+            TRACE(":EOF %s\n",debugstr_an(buf,num_read));
+        }
+    }
+    else
+    {
+        TRACE(":failed-last error (%ld)\n",GetLastError());
+        return -1;
+    }
 
   if (count > 4)
-      TRACE("(%lu), %s\n",all_read,debugstr_an(buf, all_read));
-  return all_read;
+      TRACE("(%lu), %s\n",num_read,debugstr_an(buf, num_read));
+  return num_read;
 }
 
 /*********************************************************************
@@ -2132,11 +2123,8 @@ int CDECL MSVCRT_fgetc(MSVCRT_FILE* file
       file->_cnt--;
       i = file->_ptr++;
       j = *i;
-    } else {
+    } else
       j = MSVCRT__filbuf(file);
-      if (j == MSVCRT_EOF)
-        return j;
-    }
     if (!(MSVCRT_fdesc[file->_file].wxflag & WX_TEXT) || (j != '\r'))
       return j;
   } while(1);
@@ -2508,7 +2496,6 @@ MSVCRT_size_t CDECL MSVCRT_fread(void *p
   while(rcnt>0)
   {
     int i = _read(file->_file,ptr, rcnt);
-    if (i==0) break;
     pread += i;
     rcnt -= i;
     /* expose feof condition in the flags
@@ -2522,6 +2509,7 @@ MSVCRT_size_t CDECL MSVCRT_fread(void *p
         pread = 0;
         rcnt = 0;
     }
+    if (i < 1) break;
   }
   read+=pread;
   return read / size;




More information about the wine-cvs mailing list