home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 2 / DATAFILE_PDCD2.iso / utilities2 / unixlib36d / UnixLib36d / src / stdio / c / fwrite < prev    next >
Encoding:
Text File  |  1994-03-08  |  967 b   |  51 lines

  1. static char sccs_id[] = "@(#) fwrite.c 3.2 " __DATE__ " HJR";
  2.  
  3. /* fwrite.c (c) Copyright 1990 H.Rogers */
  4.  
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <stdio.h>
  8.  
  9. extern int write (int, void *, int);
  10.  
  11. __STDIOLIB__
  12.  
  13. int
  14. __fwrite (register FILE * f, register char *s, register int _n)
  15. {
  16.   register int n, i, b, g = f->flag;
  17.  
  18.   if ((g & (_IOWRITE | _IOERR | _IOEOF)) != _IOWRITE)
  19.     return (-1);
  20.  
  21.   b = (g & _IONBF) ? 1 : f->bufsiz;
  22.  
  23.   n = _n;
  24.  
  25.   while (n)
  26.     {
  27.       if (i = ((n > f->o_cnt) ? f->o_cnt : n))    /* write buffer */
  28.     {
  29.       memcpy (f->o_ptr, s, i);
  30.       f->o_cnt -= i, f->o_ptr += i;
  31.       n -= i, s += i;
  32.     }
  33.       if (n || ((g & _IOLBF) && i && s[-1] == '\n'))
  34.     {
  35.       if (__flsbuf (-1, f) < 0)    /* flush buffer */
  36.         return (_n - n);
  37.     }
  38.       while (n >= b)        /* direct write() */
  39.     {
  40.       if ((i = write (f->fd, s, n - (n % b))) < b)
  41.         {
  42.           f->flag |= _IOERR;
  43.           return (_n - n + i);
  44.         }
  45.       f->pos += i, n -= i, s += i;
  46.     }
  47.     }
  48.  
  49.   return (_n);
  50. }
  51.