Changelog: dlls/msvcrt/file.c: fget(w)s() Don't drop characters when buffer is not large enough This fixes the errors exposed by the fget(w)s test. -- Uwe Bonnes bon@elektron.ikp.physik.tu-darmstadt.de Institut fuer Kernphysik Schlossgartenstrasse 9 64289 Darmstadt --------- Tel. 06151 162516 -------- Fax. 06151 164321 ---------- Index: wine/dlls/msvcrt/file.c =================================================================== RCS file: /home/wine/wine/dlls/msvcrt/file.c,v retrieving revision 1.52 diff -u -r1.52 file.c --- wine/dlls/msvcrt/file.c 27 Sep 2003 02:45:39 -0000 1.52 +++ wine/dlls/msvcrt/file.c 5 Oct 2003 11:22:23 -0000 @@ -1680,27 +1680,24 @@ */ char *MSVCRT_fgets(char *s, int size, MSVCRT_FILE* file) { - int cc; + int cc = MSVCRT_EOF; char * buf_start = s; TRACE(":file(%p) fd (%d) str (%p) len (%d)\n", file,file->_file,s,size); - for(cc = MSVCRT_fgetc(file); cc != MSVCRT_EOF && cc != '\n'; - cc = MSVCRT_fgetc(file)) - /* _read already handled the translation */ + while ((size >1) && (cc = MSVCRT_fgetc(file)) != MSVCRT_EOF && cc != '\n') { - if (--size <= 0) break; *s++ = (char)cc; + size --; } if ((cc == MSVCRT_EOF) && (s == buf_start)) /* If nothing read, return 0*/ { TRACE(":nothing read\n"); return 0; } - if (cc == '\n') - if (--size > 0) - *s++ = '\n'; + if ((cc != MSVCRT_EOF) && (size > 1)) + *s++ = cc; *s = '\0'; TRACE(":got '%s'\n", debugstr_a(buf_start)); return buf_start; @@ -1763,29 +1760,26 @@ */ MSVCRT_wchar_t *MSVCRT_fgetws(MSVCRT_wchar_t *s, int size, MSVCRT_FILE* file) { - int cc; + int cc = MSVCRT_WEOF; MSVCRT_wchar_t * buf_start = s; TRACE(":file(%p) fd (%d) str (%p) len (%d)\n", file,file->_file,s,size); - for(cc = MSVCRT_fgetwc(file); cc != MSVCRT_WEOF && cc != L'\n'; - cc = MSVCRT_fgetwc(file)) - /* _read already handled the translation */ + while ((size >1) && (cc = MSVCRT_fgetwc(file)) != MSVCRT_WEOF && cc != '\n') { - if (--size <= 0) break; - *s++ = cc; + *s++ = (char)cc; + size --; } if ((cc == MSVCRT_WEOF) && (s == buf_start)) /* If nothing read, return 0*/ { TRACE(":nothing read\n"); return 0; } - if (cc == L'\n') - if (--size > 0) - *s++ = '\n'; - *s = '\0'; -/* TRACE(":got '%s'\n", buf_start); */ + if ((cc != MSVCRT_WEOF) && (size > 1)) + *s++ = cc; + *s = L'\0'; + TRACE(":got '%s'\n", debugstr_w(buf_start)); return buf_start; }