Subversion Repositories Kolibri OS

Rev

Rev 4874 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 1990 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted
  6.  * provided that the above copyright notice and this paragraph are
  7.  * duplicated in all such forms and that any documentation,
  8.  * advertising materials, and other materials related to such
  9.  * distribution and use acknowledge that the software was developed
  10.  * by the University of California, Berkeley.  The name of the
  11.  * University may not be used to endorse or promote products derived
  12.  * from this software without specific prior written permission.
  13.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  14.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  15.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  16.  */
  17. /* No user fns here.  Pesch 15apr92. */
  18.  
  19. #if defined(LIBC_SCCS) && !defined(lint)
  20. static char sccsid[] = "%W% (Berkeley) %G%";
  21. #endif /* LIBC_SCCS and not lint */
  22.  
  23. #include <_ansi.h>
  24. #include <stdio.h>
  25. #include <errno.h>
  26. #include "local.h"
  27. #include "fvwrite.h"
  28.  
  29. /*
  30.  * Write the given character into the (probably full) buffer for
  31.  * the given file.  Flush the buffer out if it is or becomes full,
  32.  * or if c=='\n' and the file is line buffered.
  33.  */
  34.  
  35. int
  36. _DEFUN(__swbuf_r, (ptr, c, fp),
  37.        struct _reent *ptr _AND
  38.        register int c _AND
  39.        register FILE *fp)
  40. {
  41.   register int n;
  42.  
  43.   /* Ensure stdio has been initialized.  */
  44.  
  45.   CHECK_INIT (ptr, fp);
  46.  
  47.   /*
  48.    * In case we cannot write, or longjmp takes us out early,
  49.    * make sure _w is 0 (if fully- or un-buffered) or -_bf._size
  50.    * (if line buffered) so that we will get called again.
  51.    * If we did not do this, a sufficient number of putc()
  52.    * calls might wrap _w from negative to positive.
  53.    */
  54.  
  55.   fp->_w = fp->_lbfsize;
  56.   if (cantwrite (ptr, fp))
  57.     return EOF;
  58.   c = (unsigned char) c;
  59.  
  60.   ORIENT (fp, -1);
  61.  
  62.   /*
  63.    * If it is completely full, flush it out.  Then, in any case,
  64.    * stuff c into the buffer.  If this causes the buffer to fill
  65.    * completely, or if c is '\n' and the file is line buffered,
  66.    * flush it (perhaps a second time).  The second flush will always
  67.    * happen on unbuffered streams, where _bf._size==1; fflush()
  68.    * guarantees that putc() will always call wbuf() by setting _w
  69.    * to 0, so we need not do anything else.
  70.    */
  71.  
  72.   n = fp->_p - fp->_bf._base;
  73.   if (n >= fp->_bf._size)
  74.     {
  75.       if (_fflush_r (ptr, fp))
  76.         return EOF;
  77.       n = 0;
  78.     }
  79.   fp->_w--;
  80.   *fp->_p++ = c;
  81.   if (++n == fp->_bf._size || (fp->_flags & __SLBF && c == '\n'))
  82.     if (_fflush_r (ptr, fp))
  83.       return EOF;
  84.   return c;
  85. }
  86.  
  87. /* This function isn't any longer declared in stdio.h, but it's
  88.    required for backward compatibility with applications built against
  89.    earlier dynamically built newlib libraries. */
  90. int
  91. _DEFUN(__swbuf, (c, fp),
  92.        register int c _AND
  93.        register FILE *fp)
  94. {
  95.   return __swbuf_r (_REENT, c, fp);
  96. }
  97.