1 /*- 2 * Copyright (c) 1990 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Chris Torek. 7 * 8 * %sccs.include.redist.c% 9 */ 10 11 #if defined(LIBC_SCCS) && !defined(lint) 12 static char sccsid[] = "@(#)fread.c 5.6 (Berkeley) 03/04/93"; 13 #endif /* LIBC_SCCS and not lint */ 14 15 #include <stdio.h> 16 #include <string.h> 17 18 size_t 19 fread(buf, size, count, fp) 20 void *buf; 21 size_t size, count; 22 register FILE *fp; 23 { 24 register size_t resid; 25 register char *p; 26 register int r; 27 size_t total; 28 29 if ((resid = count * size) == 0) 30 return (count); 31 if (fp->_r < 0) 32 fp->_r = 0; 33 total = resid; 34 p = buf; 35 while (resid > (r = fp->_r)) { 36 (void)memcpy((void *)p, (void *)fp->_p, (size_t)r); 37 fp->_p += r; 38 /* fp->_r = 0 ... done in __srefill */ 39 p += r; 40 resid -= r; 41 if (__srefill(fp)) { 42 /* no more input: return partial result */ 43 return ((total - resid) / size); 44 } 45 } 46 (void)memcpy((void *)p, (void *)fp->_p, resid); 47 fp->_r -= resid; 48 fp->_p += resid; 49 return (count); 50 } 51