Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
#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;
}