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