95 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright (c) 1990 The Regents of the University of California.
 | |
|  * All rights reserved.
 | |
|  *
 | |
|  * Redistribution and use in source and binary forms are permitted
 | |
|  * provided that the above copyright notice and this paragraph are
 | |
|  * duplicated in all such forms and that any documentation,
 | |
|  * and/or other materials related to such
 | |
|  * distribution and use acknowledge that the software was developed
 | |
|  * by the University of California, Berkeley.  The name of the
 | |
|  * University may not be used to endorse or promote products derived
 | |
|  * from this software without specific prior written permission.
 | |
|  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 | |
|  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 | |
|  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 | |
|  */
 | |
| /* No user fns here.  Pesch 15apr92. */
 | |
| 
 | |
| #if defined(LIBC_SCCS) && !defined(lint)
 | |
| static char sccsid[] = "%W% (Berkeley) %G%";
 | |
| #endif /* LIBC_SCCS and not lint */
 | |
| 
 | |
| #include <_ansi.h>
 | |
| #include <stdio.h>
 | |
| #include <errno.h>
 | |
| #include "local.h"
 | |
| #include "fvwrite.h"
 | |
| 
 | |
| /*
 | |
|  * Write the given character into the (probably full) buffer for
 | |
|  * the given file.  Flush the buffer out if it is or becomes full,
 | |
|  * or if c=='\n' and the file is line buffered.
 | |
|  */
 | |
| 
 | |
| int
 | |
| __swbuf_r (struct _reent *ptr,
 | |
|        register int c,
 | |
|        register FILE *fp)
 | |
| {
 | |
|   register int n;
 | |
| 
 | |
|   /* Ensure stdio has been initialized.  */
 | |
| 
 | |
|   CHECK_INIT (ptr, fp);
 | |
| 
 | |
|   /*
 | |
|    * In case we cannot write, or longjmp takes us out early,
 | |
|    * make sure _w is 0 (if fully- or un-buffered) or -_bf._size
 | |
|    * (if line buffered) so that we will get called again.
 | |
|    * If we did not do this, a sufficient number of putc()
 | |
|    * calls might wrap _w from negative to positive.
 | |
|    */
 | |
| 
 | |
|   fp->_w = fp->_lbfsize;
 | |
|   if (cantwrite (ptr, fp))
 | |
|     return EOF;
 | |
|   c = (unsigned char) c;
 | |
| 
 | |
|   ORIENT (fp, -1);
 | |
| 
 | |
|   /*
 | |
|    * If it is completely full, flush it out.  Then, in any case,
 | |
|    * stuff c into the buffer.  If this causes the buffer to fill
 | |
|    * completely, or if c is '\n' and the file is line buffered,
 | |
|    * flush it (perhaps a second time).  The second flush will always
 | |
|    * happen on unbuffered streams, where _bf._size==1; fflush()
 | |
|    * guarantees that putc() will always call wbuf() by setting _w
 | |
|    * to 0, so we need not do anything else.
 | |
|    */
 | |
| 
 | |
|   n = fp->_p - fp->_bf._base;
 | |
|   if (n >= fp->_bf._size)
 | |
|     {
 | |
|       if (_fflush_r (ptr, fp))
 | |
| 	return EOF;
 | |
|       n = 0;
 | |
|     }
 | |
|   fp->_w--;
 | |
|   *fp->_p++ = c;
 | |
|   if (++n == fp->_bf._size || (fp->_flags & __SLBF && c == '\n'))
 | |
|     if (_fflush_r (ptr, fp))
 | |
|       return EOF;
 | |
|   return c;
 | |
| }
 | |
| 
 | |
| /* This function isn't any longer declared in stdio.h, but it's
 | |
|    required for backward compatibility with applications built against
 | |
|    earlier dynamically built newlib libraries. */
 | |
| int
 | |
| __swbuf (register int c,
 | |
|        register FILE *fp)
 | |
| {
 | |
|   return __swbuf_r (_REENT, c, fp);
 | |
| }
 |