glibc/libio/tst-ext.c

142 lines
3.1 KiB
C

#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;
}