xref: /csrg-svn/lib/libc/stdio/fread.c (revision 16549)
1*16549Skarels /* @(#)fread.c	4.1 (Berkeley) 05/29/84 */
2*16549Skarels #include	<stdio.h>
3*16549Skarels 
4*16549Skarels fread(ptr, size, count, iop)
5*16549Skarels 	register char *ptr;
6*16549Skarels 	unsigned size, count;
7*16549Skarels 	register FILE *iop;
8*16549Skarels {
9*16549Skarels 	register int s;
10*16549Skarels 
11*16549Skarels 	s = size * count;
12*16549Skarels 	while (s > 0) {
13*16549Skarels 		if (iop->_cnt < s) {
14*16549Skarels 			if (iop->_cnt > 0) {
15*16549Skarels 				bcopy(iop->_ptr, ptr, iop->_cnt);
16*16549Skarels 				ptr += iop->_cnt;
17*16549Skarels 				s -= iop->_cnt;
18*16549Skarels 			}
19*16549Skarels 			/*
20*16549Skarels 			 * filbuf clobbers _cnt & _ptr,
21*16549Skarels 			 * so don't waste time setting them.
22*16549Skarels 			 */
23*16549Skarels 			if ((*ptr++ = _filbuf(iop)) == EOF)
24*16549Skarels 				break;
25*16549Skarels 			s--;
26*16549Skarels 		}
27*16549Skarels 		if (iop->_cnt >= s) {
28*16549Skarels 			bcopy(iop->_ptr, ptr, s);
29*16549Skarels 			iop->_ptr += s;
30*16549Skarels 			iop->_cnt -= s;
31*16549Skarels 			return (count);
32*16549Skarels 		}
33*16549Skarels 	}
34*16549Skarels 	return (count - ((s + size - 1) / size));
35*16549Skarels }
36