Rev 7172 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7172 | Rev 7184 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | #include |
1 | #include |
- | 2 | #include |
|
- | 3 | #include |
|
2 | #include |
4 | #include |
Line 3... | Line 5... | ||
3 | 5 | ||
4 | int fread(void *buffer,int size,int count,FILE* file) |
6 | int fread(void *buffer,int size,int count,FILE* file) |
5 | { |
7 | { |
6 | dword res; |
8 | dword res, readbytes; |
Line 7... | Line 9... | ||
7 | dword fullsize; |
9 | dword fullsize, read4cache, toread, readcount; |
8 | 10 | ||
9 | if(!file || !buffer) |
11 | if(!file || !buffer) |
10 | { |
12 | { |
Line 17... | Line 19... | ||
17 | errno = E_ACCESS; |
19 | errno = E_ACCESS; |
18 | return 0; |
20 | return 0; |
19 | } |
21 | } |
Line 20... | Line 22... | ||
20 | 22 | ||
21 | fullsize=count*size; |
23 | fullsize=count*size; |
22 | if ((fullsize+file->filepos)>=(file->filesize)) |
24 | if (fullsize + file->filepos >= file->filesize) |
23 | { |
25 | { |
24 | fullsize=file->filesize-file->filepos; |
26 | fullsize=file->filesize - file->filepos; |
25 | if (fullsize<=0) return(0); |
27 | if (fullsize <= 0) return 0; |
Line -... | Line 28... | ||
- | 28 | } |
|
- | 29 | ||
- | 30 | /***** file buffering strategy, just read forward ***** |
|
- | 31 | if we read small part - read full buffer, but if buffer have this data - dont read again nothing (or partial read forward 4k pages) |
|
- | 32 | any writes drops buffers as ungetc_buf */ |
|
- | 33 | read4cache = 0; |
|
- | 34 | readcount = 0; |
|
26 | } |
35 | if (file->filepos >= file->buffer_start && file->filepos < file->buffer_end) |
- | 36 | { |
|
- | 37 | read4cache = min(file->buffer_end - file->filepos, fullsize); |
|
- | 38 | memcpy(buffer, file->buffer + file->filepos - file->buffer_start, read4cache); |
|
- | 39 | file->filepos += read4cache; |
|
- | 40 | if (file->ungetc_buf != EOF) // subst ungetc byte |
|
- | 41 | { |
|
- | 42 | *((char*)buffer) = (char)file->ungetc_buf; |
|
- | 43 | file->ungetc_buf = EOF; |
|
27 | 44 | } |
|
- | 45 | buffer += read4cache; // ! advance |
|
- | 46 | fullsize -= read4cache; |
|
- | 47 | readcount = read4cache / size; |
|
- | 48 | } |
|
- | 49 | ||
28 | res=_ksys_readfile(file->filename,file->filepos,fullsize,buffer); |
50 | toread = max(fullsize, file->buffersize); |
29 | if (res==0) |
51 | if (toread + file->filepos >= file->filesize) |
30 | { |
- | |
31 | file->filepos=file->filepos+fullsize; |
- | |
32 | fullsize=fullsize/size; |
52 | { |
- | 53 | toread = file->filesize - file->filepos; |
|
- | 54 | } |
|
- | 55 | ||
33 | return(fullsize); |
56 | if (fullsize <= 0 || toread <= 0) |
34 | } |
57 | res = 0; // already read or file end |
- | 58 | else |
|
- | 59 | { |
|
- | 60 | file->buffer_start = file->filepos; |
|
- | 61 | if (toread <= fullsize) // read to bigger buffer |
|
- | 62 | { |
|
- | 63 | res = _ksys_readfile(file->filename, file->filepos, toread, buffer, &readbytes); |
|
- | 64 | read4cache = min(readbytes, file->buffersize); |
|
- | 65 | memcpy(file->buffer, buffer, read4cache); |
|
- | 66 | file->filepos += readbytes; |
|
- | 67 | } else |
|
- | 68 | { |
|
- | 69 | res = _ksys_readfile(file->filename, file->filepos, toread, file->buffer, &readbytes); |
|
- | 70 | read4cache = readbytes; |
|
- | 71 | memcpy(buffer, file->buffer, min(fullsize, read4cache)); |
|
- | 72 | file->filepos += min(fullsize, read4cache); |
|
- | 73 | } |
|
- | 74 | file->buffer_end = file->buffer_start + read4cache; |
|
- | 75 | if (readbytes >= fullsize) |
|
- | 76 | readcount += fullsize / size; |
|
- | 77 | else |
|
- | 78 | readcount += readbytes / size; |
|
- | 79 | } |
|
- | 80 | ||
- | 81 | if (file->ungetc_buf != EOF) // subst ungetc byte |
|
- | 82 | { |
|
- | 83 | *((char*)buffer) = (char)file->ungetc_buf; |
|
- | 84 | file->ungetc_buf = EOF; |
|
- | 85 | } |
|
- | 86 | ||
- | 87 | if (res != 0) |
|
35 | else |
88 | { |
36 | { |
- | |
37 | errno = -res; |
89 | file->ungetc_buf = EOF; |
- | 90 | errno = -res; |
|
- | 91 | } |
|
38 | return 0; |
92 |