Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
300 | serge | 1 | #include "kolibc.h" |
2 | #include "kolibri.h" |
||
3 | |||
4 | int fill_buff(FILE* f); |
||
5 | |||
6 | int fread(void* dst,size_t size,size_t count,FILE* f) |
||
7 | { size_t req; |
||
8 | size_t cnt; |
||
9 | char *p = dst; |
||
10 | if(!((f->mode & FILE_OPEN_READ)|(f->mode & FILE_OPEN_PLUS))) |
||
11 | return 0; |
||
12 | req=count*size; |
||
13 | if (req+f->filepos+f->strpos > f->filesize) |
||
14 | req=f->filesize-f->filepos-f->strpos; |
||
15 | count=0; |
||
16 | while(req) |
||
17 | { |
||
18 | if (f->remain) |
||
19 | { cnt= req > f->remain ? f->remain : req; |
||
20 | memcpy(p,f->stream,cnt); |
||
21 | p+=cnt; |
||
22 | f->stream+=cnt; |
||
23 | f->strpos+=cnt; |
||
24 | f->remain-=cnt; |
||
25 | count+=cnt; |
||
26 | req-=cnt; |
||
27 | } |
||
28 | else |
||
29 | { |
||
30 | f->filepos+=4096; |
||
31 | if(!fill_buff(f)) //eof or error |
||
32 | break; |
||
33 | } |
||
34 | }; |
||
35 | return count/size; |
||
36 | } |
||
37 | |||
38 | int fill_buff(FILE* f) |
||
39 | { int err; |
||
40 | size_t bytes; |
||
41 | |||
42 | err=read_file(f->filename,f->buffer,f->filepos, |
||
43 | 4096,&bytes); |
||
44 | if (err) return 0; |
||
45 | if(!bytes) return 0; |
||
46 | f->stream = f->buffer; |
||
47 | f->remain = 4096; |
||
48 | f->strpos=0; |
||
49 | return bytes; |
||
50 | }; |