mirror of https://gitee.com/Nocallback/glibc.git
Browse Source
2001-03-26 Ulrich Drepper <drepper@redhat.com> * libio/Makefile (tests): Add tst-ext. * libio/tst-ext.c: New file. * libio/iosetvbuf.c (_IO_setvbuf): Clear line buffer flag for _IONBF.cvs/glibc-2-2-branch
4 changed files with 152 additions and 2 deletions
@ -0,0 +1,141 @@ |
|||
#include <stdio_ext.h> |
|||
#include <stdlib.h> |
|||
#include <string.h> |
|||
|
|||
|
|||
int |
|||
main (void) |
|||
{ |
|||
FILE *fp; |
|||
const char teststring[] = "hello world"; |
|||
char buf[3072]; |
|||
int result = 0; |
|||
char readbuf[256]; |
|||
|
|||
/* Open a file. */ |
|||
fp = tmpfile (); |
|||
|
|||
/* Set a buffer. */ |
|||
if (setvbuf (fp, buf, _IOFBF, sizeof buf) == EOF) |
|||
{ |
|||
printf ("setvbuf failed: %m\n"); |
|||
exit (1); |
|||
} |
|||
|
|||
/* Get the buffer size. */ |
|||
if (__fbufsize (fp) != sizeof buf) |
|||
{ |
|||
printf ("__fbusize() reported a buffer size of %Zd bytes;" |
|||
" we installed a buffer with %Zd bytes\n", |
|||
__fbufsize (fp), sizeof buf); |
|||
result = 1; |
|||
} |
|||
|
|||
/* Write something and read it back. */ |
|||
if (fputs (teststring, fp) == EOF) |
|||
{ |
|||
printf ("writing to new stream failed: %m\n"); |
|||
exit (1); |
|||
} |
|||
rewind (fp); |
|||
if (fgets (readbuf, sizeof readbuf, fp) == NULL) |
|||
{ |
|||
printf ("reading from new stream failed: %m\n"); |
|||
exit (1); |
|||
} |
|||
if (strcmp (readbuf, teststring) != 0) |
|||
{ |
|||
puts ("not the correct string read"); |
|||
exit (1); |
|||
} |
|||
|
|||
/* The file must be opened for reading and writing. */ |
|||
if (__freading (fp) == 0) |
|||
{ |
|||
puts ("__freading() reported stream is not last read from"); |
|||
result = 1; |
|||
} |
|||
if (__fwriting (fp) != 0) |
|||
{ |
|||
puts ("__fwriting() reported stream is write-only or last written to"); |
|||
result = 1; |
|||
} |
|||
rewind (fp); |
|||
if (fputs (teststring, fp) == EOF) |
|||
{ |
|||
printf ("writing(2) to new stream failed: %m\n"); |
|||
exit (1); |
|||
} |
|||
if (__fwriting (fp) == 0) |
|||
{ |
|||
puts ("__fwriting() doe snot reported stream is last written to"); |
|||
result = 1; |
|||
} |
|||
if (__freading (fp) != 0) |
|||
{ |
|||
puts ("__freading() reported stream is last read from"); |
|||
result = 1; |
|||
} |
|||
|
|||
if (__freadable (fp) == 0) |
|||
{ |
|||
puts ("__freading() reported stream is last readable"); |
|||
result = 1; |
|||
} |
|||
if (__fwritable (fp) == 0) |
|||
{ |
|||
puts ("__freading() reported stream is last writable"); |
|||
result = 1; |
|||
} |
|||
|
|||
/* The string we wrote above should still be in the buffer. */ |
|||
if (__fpending (fp) != strlen (teststring)) |
|||
{ |
|||
printf ("__fpending() returned %Zd; expected %Zd\n", |
|||
__fpending (fp), strlen (teststring)); |
|||
result = 1; |
|||
} |
|||
/* Discard all the output. */ |
|||
__fpurge (fp); |
|||
/* And check again. */ |
|||
if (__fpending (fp) != 0) |
|||
{ |
|||
printf ("__fpending() returned %Zd; expected 0\n", |
|||
__fpending (fp)); |
|||
result = 1; |
|||
} |
|||
|
|||
|
|||
/* Find out whether buffer is line buffered. */ |
|||
if (__flbf (fp) != 0) |
|||
{ |
|||
puts ("__flbf() reports line buffered but it is fully buffered"); |
|||
result = 1; |
|||
} |
|||
|
|||
if (setvbuf (fp, buf, _IOLBF, sizeof buf) == EOF) |
|||
{ |
|||
printf ("setvbuf(2) failed: %m\n"); |
|||
exit (1); |
|||
} |
|||
if (__flbf (fp) == 0) |
|||
{ |
|||
puts ("__flbf() reports file is not line buffered"); |
|||
result = 1; |
|||
} |
|||
|
|||
if (setvbuf (fp, NULL, _IONBF, 0) == EOF) |
|||
{ |
|||
printf ("setvbuf(3) failed: %m\n"); |
|||
exit (1); |
|||
} |
|||
if (__flbf (fp) != 0) |
|||
{ |
|||
puts ("__flbf() reports line buffered but it is not buffered"); |
|||
result = 1; |
|||
} |
|||
|
|||
fclose (fp); |
|||
|
|||
return result; |
|||
} |
|||
Loading…
Reference in new issue