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

Spotted by David Hagood with test suggested by Dan Kegel.
This commit is contained in:
Duane Clark 2006-08-08 16:08:05 -07:00 committed by Alexandre Julliard
parent b997cd7629
commit 4d3952f3dc
2 changed files with 61 additions and 0 deletions

View File

@ -1634,6 +1634,19 @@ static int read_i(int fd, void *buf, unsigned int count)
*/ */
if (ReadFile(hand, bufstart, count, &num_read, NULL)) 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) if (num_read != count)
{ {
MSVCRT_fdesc[fd].wxflag |= WX_ATEOF; MSVCRT_fdesc[fd].wxflag |= WX_ATEOF;

View File

@ -372,6 +372,53 @@ static void test_fgetwc( void )
unlink(tempf); 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 ) static void test_file_put_get( void )
{ {
char* tempf; char* tempf;
@ -727,6 +774,7 @@ START_TEST(file)
test_readmode(FALSE); /* binary mode */ test_readmode(FALSE); /* binary mode */
test_readmode(TRUE); /* ascii mode */ test_readmode(TRUE); /* ascii mode */
test_fgetwc(); test_fgetwc();
test_ctrlz();
test_file_put_get(); test_file_put_get();
test_tmpnam(); test_tmpnam();
test_get_osfhandle(); test_get_osfhandle();