blob: 813a98fb242ba8a8a031a964a79b745af269a986 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
#include <sys/types.h>
#include "dietstdio.h"
#include <unistd.h>
size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream) {
int res;
unsigned long i,j;
j=size*nmemb;
i=0;
if (!j || j/nmemb!=size) return 0;
if (stream->ungotten) {
stream->ungotten=0;
*(char*)ptr=stream->ungetbuf;
++i;
}
if (!j) return 1;
#ifdef WANT_FREAD_OPTIMIZATION
if ( !(stream->flags&FDPIPE) && (j>stream->buflen)) {
size_t tmp=j-i;
int res;
fflush(stream);
while ((res=read(stream->fd,ptr+i,tmp))<(int)tmp) {
if (res==-1) {
stream->flags|=ERRORINDICATOR;
goto exit;
} else if (!res) {
stream->flags|=EOFINDICATOR;
goto exit;
}
i+=res; tmp-=res;
}
return nmemb;
}
#endif
for (; i<j; ++i) {
res=fgetc(stream);
if (res==EOF)
exit:
return i/size;
else
((unsigned char*)ptr)[i]=(unsigned char)res;
}
return nmemb;
}
|