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

  1. static char sccs_id[] = "@(#) fread.c 3.2 " __DATE__ " HJR";
  2.  
  3. /* fread.c (c) Copyright 1990 H.Rogers */
  4.  
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <stdio.h>
  8.  
  9. extern int read (int, void *, int);
  10.  
  11. __STDIOLIB__
  12.  
  13. int
  14. __fread (register FILE * f, register char *s, int _n)
  15. {
  16.   register int n, i, b, g = f->flag;
  17.  
  18.   if ((g & (_IOREAD | _IOERR | _IOEOF)) != _IOREAD)
  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->i_cnt) ? f->i_cnt : n))    /* read buffer */
  28.     {
  29.       memcpy (s, f->i_ptr, i);
  30.       f->i_cnt -= i, f->i_ptr += i;
  31.       n -= i, s += i;
  32.     }
  33.       while (n >= b)        /* direct read() */
  34.     {
  35.       if ((i = read (f->fd, s, b)) <= 0)
  36.         {
  37.           f->flag |= ((i) ? _IOERR : _IOEOF);
  38.           i = _n - n;
  39.           return (i ? i : -1);
  40.         }
  41.       f->pos += i, n -= i, s += i;
  42.     }
  43.       if (n)
  44.     {
  45.       if ((i = __filbuf (f)) < 0)    /* fill buffer */
  46.         {
  47.           i = _n - n;
  48.           return (i ? i : -1);
  49.         }
  50.       --n, *s++ = i;
  51.     }
  52.     }
  53.   return (_n - n);
  54. }
  55.