home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / unixlib36d / src / stdio / c / flsbuf < prev    next >
Text File  |  1994-03-08  |  1KB  |  63 lines

  1. static char sccs_id[] = "@(#) flsbuf.c 4.1 " __DATE__ " HJR";
  2.  
  3. /* flsbuf.c (c) Copyright 1990 H.Rogers */
  4.  
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7.  
  8. #include "fcntl.h"
  9.  
  10. extern int write (int, void *, int);
  11.  
  12. __STDIOLIB__
  13.  
  14. /* __flsbuf(-1,f) flushes output without adding c */
  15.  
  16. int
  17. __flsbuf (register int c, register FILE * f)
  18. {
  19.   register int n, b, g = f->flag;
  20.   register unsigned char *a, *p;
  21.  
  22.   if ((g & (_IOWRITE | _IOERR | _IOEOF)) != _IOWRITE)
  23.     return (-1);
  24.  
  25.   b = (g & _IONBF) ? 1 : f->bufsiz;
  26.  
  27.   if (!(a = f->o_base))
  28.     {
  29.       if (!(a = f->o_base = malloc (b)))
  30.     {
  31.       f->flag = g | _IOERR;
  32.       return (-1);
  33.     }
  34.       if (b > 1 && c >= 0 && !(c == '\n' && (g & _IOLBF)))
  35.     {
  36.       f->o_cnt = b - 1;
  37.       f->o_ptr = a + 1;
  38.       return (*a = c);
  39.     }
  40.       p = f->o_ptr = a;
  41.     }
  42.   else
  43.     p = f->o_ptr;
  44.  
  45.   if (c >= 0)
  46.     *p++ = c;
  47.  
  48.   n = p - a;
  49.  
  50.   if (n > 0)
  51.     if (write (f->fd, a, n) < n)
  52.       {
  53.     f->flag = g | _IOERR;
  54.     return (-1);
  55.       }
  56.  
  57.   f->pos += n;
  58.   f->o_cnt = b;
  59.   f->o_ptr = a;
  60.  
  61.   return ((c >= 0) ? c : 0);
  62. }
  63.