Fix bug in MSVCRT handling of CTRL-Z at EOF of text files

David D. Hagood wowbagger at sktc.net
Sat Aug 5 10:19:25 CDT 2006


The bug in the handling of text mode files with CTRL-Z's at the end is back.

Due to compatibility with DOS, which is compatible with CP/M, text mode 
files may be padded with a number of CTRL-Z characters (\x1A) to fill 
out a sector.

The current Wine implementation of MSVCRT does NOT strip these - this 
breaks several programs, among them Delorme Street Atlas 5 (my test case 
for this.)

The attached patch corrects this behavior.

Changelog:
   dlls/msvcrt/file.c David Hagood (wowbagger at sktc.net) Remove 
CTRL-Z's at EOF of text mode files

Index: dlls/msvcrt/file.c
===================================================================
RCS file: /home/wine/wine/dlls/msvcrt/file.c,v
retrieving revision 1.107
diff -u -u -r1.107 file.c
--- dlls/msvcrt/file.c	31 Jul 2006 20:02:38 -0000	1.107
+++ dlls/msvcrt/file.c	5 Aug 2006 15:10:33 -0000
@@ -1638,6 +1638,21 @@
          {
              MSVCRT_fdesc[fd].wxflag |= WX_ATEOF;
              TRACE(":EOF %s\n",debugstr_an(buf,num_read));
+            if (MSVCRT_fdesc[fd].wxflag & WX_TEXT)
+            {
+                /* if at EOF in text mode, we need to remove any final 
CTRL-Z's
+                   from the file. Ahh the joys of CP/M^WDOS compatibility.
+                */
+                if (num_read && (bufstart[num_read-1] == 0x1a))
+                {
+                   while (num_read && (bufstart[num_read-1] == 0x1a))
+                   {
+                       num_read --;
+                   }
+                   TRACE("Removing CTRL-Z from EOF\n");
+                   bufstart[num_read-1] = 0;
+                }
+            }
          }
      }
      else



More information about the wine-devel mailing list