Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/*
2
 * pANS stdio -- fread
3
 */
4
#include "iolib.h"
5
#include <string.h>
6
 
7
#define BIGN (BUFSIZ/2)
8
 
9
size_t fread(void *p, size_t recl, size_t nrec, FILE *f){
10
	char *s;
11
	int n, d, c;
12
 
13
	s=(char *)p;
14
	n=recl*nrec;
15
	while(n>0){
16
		d=f->wp-f->rp;
17
		if(d>0){
18
			if(d>n)
19
				d=n;
20
			memcpy(s, f->rp, d);
21
			f->rp+=d;
22
		}else{
23
			if(n >= BIGN && f->state==RD && !(f->flags&STRING) && f->buf!=f->unbuf){
24
				d=read(f->fd, s, n);
25
				if(d<=0){
26
					f->state=(d==0)?END:ERR;
27
					goto ret;
28
				}
29
			}else{
30
 				c=_IO_getc(f);
31
				if(c==EOF)
32
					goto ret;
33
				*s=c;
34
				d=1;
35
			}
36
		}
37
		s+=d;
38
		n-=d;
39
	}
40
    ret:
41
	if(recl)
42
		return (s-(char*)p)/recl;
43
	else
44
		return s-(char*)p;
45
}