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