Don't drop characters in fget(w)s
Uwe Bonnes
bon at elektron.ikp.physik.tu-darmstadt.de
Sun Oct 5 06:27:16 CDT 2003
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. fgetws still shows an
error with detecting EOF. It will be fixed with more patches to come.
--
Uwe Bonnes bon at 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_EOF) && (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;
}
More information about the wine-patches
mailing list