Duane Clark : msvcrt: In text mode a ctrl-z signals EOF.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Aug 9 10:37:33 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 4d3952f3dc2b54a256726d5693adabcbefcc34d9
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=4d3952f3dc2b54a256726d5693adabcbefcc34d9

Author: Duane Clark <fpga at pacbell.net>
Date:   Tue Aug  8 16:08:05 2006 -0700

msvcrt: In text mode a ctrl-z signals EOF.

Spotted by David Hagood with test suggested by Dan Kegel.

---

 dlls/msvcrt/file.c       |   13 ++++++++++++
 dlls/msvcrt/tests/file.c |   48 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+), 0 deletions(-)

diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 9fe09dd..ba5b445 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -1634,6 +1634,19 @@ static int read_i(int fd, void *buf, uns
    */
     if (ReadFile(hand, bufstart, count, &num_read, NULL))
     {
+        if (MSVCRT_fdesc[fd].wxflag & WX_TEXT)
+        {
+            int i;
+            /* in text mode, a ctrl-z signals EOF */
+            for (i=0; i<num_read; i++)
+            {
+                if (bufstart[i] == 0x1a)
+                {
+                    num_read = i;
+                    break;
+                }
+            }
+        }
         if (num_read != count)
         {
             MSVCRT_fdesc[fd].wxflag |= WX_ATEOF;
diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c
index 0205de4..470a9e9 100644
--- a/dlls/msvcrt/tests/file.c
+++ b/dlls/msvcrt/tests/file.c
@@ -372,6 +372,53 @@ #define LLEN 512
   unlink(tempf);
 }
 
+static void test_ctrlz( void )
+{
+  char* tempf;
+  FILE *tempfh;
+  static const char mytext[]= "This is test_ctrlz";
+  char buffer[256];
+  int i, j;
+  long l;
+
+  tempf=_tempnam(".","wne");
+  tempfh = fopen(tempf,"wb");
+  fputs(mytext,tempfh);
+  j = 0x1a; /* a ctrl-z character signals EOF in text mode */
+  fputc(j,tempfh);
+  j = '\r';
+  fputc(j,tempfh);
+  j = '\n';
+  fputc(j,tempfh);
+  j = 'a';
+  fputc(j,tempfh);
+  fclose(tempfh);
+  tempfh = fopen(tempf,"rt"); /* open in TEXT mode */
+  ok(fgets(buffer,256,tempfh) != 0,"fgets failed unexpected\n");
+  i=strlen(buffer);
+  j=strlen(mytext);
+  ok(i==j, "returned string length expected %d got %d\n", j, i);
+  j+=4; /* ftell should indicate the true end of file */
+  l=ftell(tempfh);
+  ok(l==j, "ftell expected %d got %ld\n", j, l);
+  ok(feof(tempfh), "did not get EOF\n");
+  fclose(tempfh);
+  
+  tempfh = fopen(tempf,"rb"); /* open in BINARY mode */
+  ok(fgets(buffer,256,tempfh) != 0,"fgets failed unexpected\n");
+  i=strlen(buffer);
+  j=strlen(mytext)+3; /* should get through newline */
+  ok(i==j, "returned string length expected %d got %d\n", j, i);
+  l=ftell(tempfh);
+  ok(l==j, "ftell expected %d got %ld\n", j, l);
+  ok(fgets(buffer,256,tempfh) != 0,"fgets failed unexpected\n");
+  i=strlen(buffer);
+  ok(i==1, "returned string length expected %d got %d\n", 1, i);
+  ok(feof(tempfh), "did not get EOF\n");
+  fclose(tempfh);
+  unlink(tempf);
+}
+
 static void test_file_put_get( void )
 {
   char* tempf;
@@ -727,6 +774,7 @@ START_TEST(file)
     test_readmode(FALSE); /* binary mode */
     test_readmode(TRUE);  /* ascii mode */
     test_fgetwc();
+    test_ctrlz();
     test_file_put_get();
     test_tmpnam();
     test_get_osfhandle();




More information about the wine-cvs mailing list