Dan Kegel : msvcrt: Fix ^Z handling in text mode.

Alexandre Julliard julliard at winehq.org
Tue Oct 9 13:37:28 CDT 2007


Module: wine
Branch: master
Commit: 56eb6f67305ae390c709adddd114fd9040334135
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=56eb6f67305ae390c709adddd114fd9040334135

Author: Dan Kegel <dank at kegel.com>
Date:   Fri Oct  5 04:27:08 2007 -0700

msvcrt: Fix ^Z handling in text mode.

---

 dlls/msvcrt/file.c       |   10 ++++++++--
 dlls/msvcrt/tests/file.c |   17 +++++++++++++++++
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index b878781..8bacffa 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -59,6 +59,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
 /* values for wxflag in file descriptor */
 #define WX_OPEN           0x01
 #define WX_ATEOF          0x02
+#define WX_READEOF        0x04  /* like ATEOF, but for underlying file rather than buffer */
 #define WX_DONTINHERIT    0x10
 #define WX_APPEND         0x20
 #define WX_TEXT           0x80
@@ -827,7 +828,7 @@ __int64 CDECL _lseeki64(int fd, __int64 offset, int whence)
   ofs.QuadPart = offset;
   if (SetFilePointerEx(hand, ofs, &ret, whence))
   {
-    MSVCRT_fdesc[fd].wxflag &= ~WX_ATEOF;
+    MSVCRT_fdesc[fd].wxflag &= ~(WX_ATEOF|WX_READEOF);
     /* FIXME: What if we seek _to_ EOF - is EOF set? */
 
     return ret.QuadPart;
@@ -1666,6 +1667,11 @@ static int read_i(int fd, void *buf, unsigned int count)
   char *bufstart = buf;
   HANDLE hand = msvcrt_fdtoh(fd);
 
+  if (MSVCRT_fdesc[fd].wxflag & WX_READEOF) {
+     MSVCRT_fdesc[fd].wxflag |= WX_ATEOF;
+     TRACE("already at EOF, returning 0\n");
+     return 0;
+  }
   /* Don't trace small reads, it gets *very* annoying */
   if (count > 4)
     TRACE(":fd (%d) handle (%p) buf (%p) len (%d)\n",fd,hand,buf,count);
@@ -1692,7 +1698,7 @@ static int read_i(int fd, void *buf, unsigned int count)
         }
         if (num_read != count)
         {
-            MSVCRT_fdesc[fd].wxflag |= WX_ATEOF;
+            MSVCRT_fdesc[fd].wxflag |= (WX_ATEOF|WX_READEOF);
             TRACE(":EOF %s\n",debugstr_an(buf,num_read));
         }
     }
diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c
index 4a311e4..e0f1b99 100644
--- a/dlls/msvcrt/tests/file.c
+++ b/dlls/msvcrt/tests/file.c
@@ -287,6 +287,23 @@ static void test_asciimode(void)
     ok((fread(buf, 1, sizeof(buf), fp) == 2) && (0 == strcmp(buf, "\r\n")), "CR CR LF not read as CR LF\n");
     fclose(fp);
     unlink("ascii.tst");
+
+    /* Simple test of foo ^Z [more than one block] bar handling */
+    fp = fopen("ascii.tst", "wb");
+    fputs("foo\032", fp);  /* foo, logical EOF, ... */
+    fseek(fp, 65536L, SEEK_SET); /* ... more than MSVCRT_BUFSIZ, ... */
+    fputs("bar", fp); /* ... bar */
+    fclose(fp);
+    fp = fopen("ascii.tst", "rt");
+    ok(fgets(buf, sizeof(buf), fp) != NULL, "fgets foo\n");
+    ok(0 == strcmp(buf, "foo"), "foo ^Z not read as foo by fgets\n");
+    ok(fgets(buf, sizeof(buf), fp) == NULL, "fgets after logical EOF\n");
+    rewind(fp);
+    ok((fread(buf, 1, sizeof(buf), fp) == 3) && (0 == strcmp(buf, "foo")), "foo ^Z not read as foo by fread\n");
+    ok((fread(buf, 1, sizeof(buf), fp) == 0), "fread after logical EOF\n");
+    fclose(fp);
+
+    unlink("ascii.tst");
 }
 
 static WCHAR* AtoW( const char* p )




More information about the wine-cvs mailing list