mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	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.
		
			
				
	
	
		
			142 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			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;
 | |
| }
 |