Commit 5c4b18a9 authored by Duane Clark's avatar Duane Clark Committed by Alexandre Julliard

msvcrt: Remove read_i loop and fix fread.

parent 3e1ace5a
...@@ -1619,7 +1619,7 @@ static unsigned int remove_cr(char *buf, unsigned int count) ...@@ -1619,7 +1619,7 @@ static unsigned int remove_cr(char *buf, unsigned int count)
*/ */
static int read_i(int fd, void *buf, unsigned int count) static int read_i(int fd, void *buf, unsigned int count)
{ {
DWORD num_read, all_read = 0; DWORD num_read;
char *bufstart = buf; char *bufstart = buf;
HANDLE hand = msvcrt_fdtoh(fd); HANDLE hand = msvcrt_fdtoh(fd);
...@@ -1630,34 +1630,25 @@ static int read_i(int fd, void *buf, unsigned int count) ...@@ -1630,34 +1630,25 @@ static int read_i(int fd, void *buf, unsigned int count)
return -1; return -1;
/* Reading single bytes in O_TEXT mode makes things slow /* Reading single bytes in O_TEXT mode makes things slow
* So read big chunks, then remove the \r in memory and try reading * So read big chunks
* the rest until the request is satisfied or EOF is met
*/ */
while (all_read < count) if (ReadFile(hand, bufstart, count, &num_read, NULL))
{ {
if (ReadFile(hand, bufstart+all_read, count - all_read, &num_read, NULL)) if (num_read != count)
{ {
if (num_read != (count - all_read)) MSVCRT_fdesc[fd].wxflag |= WX_ATEOF;
{ TRACE(":EOF %s\n",debugstr_an(buf,num_read));
TRACE(":EOF\n"); }
MSVCRT_fdesc[fd].wxflag |= WX_ATEOF; }
all_read += num_read; else
if (count > 4) {
TRACE("%s\n",debugstr_an(buf,all_read)); TRACE(":failed-last error (%ld)\n",GetLastError());
return all_read; return -1;
} }
all_read += num_read;
}
else
{
TRACE(":failed-last error (%ld)\n",GetLastError());
return -1;
}
}
if (count > 4) if (count > 4)
TRACE("(%lu), %s\n",all_read,debugstr_an(buf, all_read)); TRACE("(%lu), %s\n",num_read,debugstr_an(buf, num_read));
return all_read; return num_read;
} }
/********************************************************************* /*********************************************************************
...@@ -2132,11 +2123,8 @@ int CDECL MSVCRT_fgetc(MSVCRT_FILE* file) ...@@ -2132,11 +2123,8 @@ int CDECL MSVCRT_fgetc(MSVCRT_FILE* file)
file->_cnt--; file->_cnt--;
i = file->_ptr++; i = file->_ptr++;
j = *i; j = *i;
} else { } else
j = MSVCRT__filbuf(file); j = MSVCRT__filbuf(file);
if (j == MSVCRT_EOF)
return j;
}
if (!(MSVCRT_fdesc[file->_file].wxflag & WX_TEXT) || (j != '\r')) if (!(MSVCRT_fdesc[file->_file].wxflag & WX_TEXT) || (j != '\r'))
return j; return j;
} while(1); } while(1);
...@@ -2508,7 +2496,6 @@ MSVCRT_size_t CDECL MSVCRT_fread(void *ptr, MSVCRT_size_t size, MSVCRT_size_t nm ...@@ -2508,7 +2496,6 @@ MSVCRT_size_t CDECL MSVCRT_fread(void *ptr, MSVCRT_size_t size, MSVCRT_size_t nm
while(rcnt>0) while(rcnt>0)
{ {
int i = _read(file->_file,ptr, rcnt); int i = _read(file->_file,ptr, rcnt);
if (i==0) break;
pread += i; pread += i;
rcnt -= i; rcnt -= i;
/* expose feof condition in the flags /* expose feof condition in the flags
...@@ -2522,6 +2509,7 @@ MSVCRT_size_t CDECL MSVCRT_fread(void *ptr, MSVCRT_size_t size, MSVCRT_size_t nm ...@@ -2522,6 +2509,7 @@ MSVCRT_size_t CDECL MSVCRT_fread(void *ptr, MSVCRT_size_t size, MSVCRT_size_t nm
pread = 0; pread = 0;
rcnt = 0; rcnt = 0;
} }
if (i < 1) break;
} }
read+=pread; read+=pread;
return read / size; return read / size;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment