msvcrt._read was in fact waiting until all buffer was filled, while it should only handle pending character in queue
this patch fixes it
A+
--
Eric Pouech
Name: crtread ChangeLog: fixed msvcrt._read to only return the pending chars but not to wait until all buffer is read (O_TEXT mode only) License: X11 GenDate: 2003/09/19 20:05:48 UTC ModifiedFiles: dlls/msvcrt/file.c =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/dlls/msvcrt/file.c,v retrieving revision 1.51 diff -u -u -r1.51 file.c --- dlls/msvcrt/file.c 5 Sep 2003 23:08:35 -0000 1.51 +++ dlls/msvcrt/file.c 19 Sep 2003 20:02:56 -0000 @@ -1177,56 +1177,57 @@ if (hand == INVALID_HANDLE_VALUE) return -1; - if (MSVCRT_flags[fd]& _O_BINARY) - { - if (ReadFile(hand, buf, count, &num_read, NULL)) - { - if (num_read != count && MSVCRT_files[fd]) - { - TRACE(":EOF\n"); - MSVCRT_flags[fd] |= MSVCRT__IOEOF; - /* - MSVCRT_files[fd]->_flag |= MSVCRT__IOEOF; - */ - } - TRACE("%s\n",debugstr_an(buf,num_read)); - return num_read; - } + if (!ReadFile(hand, buf, count, &num_read, NULL)) + { TRACE(":failed-last error (%ld)\n",GetLastError()); if (MSVCRT_files[fd]) MSVCRT_files[fd]->_flag |= MSVCRT__IOERR; return -1; - } - else - { - char cc, *s=(char*)buf,* buf_start=(char*)buf; - unsigned int i; - - for (i = 0 , num_read = 1; i < count && (num_read == 1);) - { - if (ReadFile(hand, &cc, 1, &num_read, NULL)) - if (num_read == 1) - if ((cc != '\r') || MSVCRT_flags[fd] & _O_BINARY) - { - *s++ = (char)cc; - i++; - } - } - if (num_read != 1) - { - TRACE(":EOF\n"); - if (MSVCRT_files[fd]) - MSVCRT_flags[fd] |= MSVCRT__IOEOF; - /* - MSVCRT_files[fd]->_flag |= MSVCRT__IOEOF; - */ - } - - if (count > 4) - TRACE("%s\n",debugstr_an(buf_start, s-buf_start)); - return s-buf_start; - } - return 0; + } + if (!(MSVCRT_flags[fd] & _O_BINARY)) + { + char *dst, *src; + + for (dst = src = (char*)buf; src < (char*)buf + num_read; src++, dst++) + { + if (*src == 26 /* CTRL-Z */) + { + if (MSVCRT_files[fd]) MSVCRT_flags[fd] |= MSVCRT__IOEOF; + break; + } + else if (*src == '\r') + { + if (src < (char*)buf + num_read - 1) + { + if (src[1] == '\n') + { + *dst = *++src; + } + else *dst = *src; + } + else + { + char next; + + if (!ReadFile(hand, &next, 1, NULL, NULL)) *dst = '\r'; + else + { + if (dst == buf && next == '\n') *dst = '\n'; + else + { + if (next != '\n') *dst = '\r'; + if (SetFilePointer(hand, (long)-1, NULL, SEEK_CUR) == INVALID_SET_FILE_POINTER) + FIXME(":issue: putback failed on %p (%ld)\n", hand, GetLastError()); + } + } + } + } + else *dst = *src; + } + num_read = dst - (char*)buf; /* recompute new len */ + TRACE("%s\n",debugstr_an(buf,num_read)); + } + return num_read; } /*********************************************************************