fread.c - vx32 - Local 9vx git repository for patches.
(HTM) git clone git://r-36.net/vx32
(DIR) Log
(DIR) Files
(DIR) Refs
---
fread.c (996B)
---
1
2 #include <string.h>
3 #include <unistd.h>
4
5 #include "ioprivate.h"
6
7 size_t fread(void *ptr, size_t eltsize, size_t nelts, FILE *f)
8 {
9 size_t totsize = eltsize * nelts;
10 size_t actsize = 0;
11
12 while (totsize > 0) {
13
14 size_t buffed = f->ilim - f->ipos;
15 if (totsize <= buffed) {
16
17 // The rest of the data we need is in the buffer.
18 memcpy(ptr, &f->ibuf[f->ipos], totsize);
19 f->ipos += totsize;
20 actsize += totsize;
21 goto done;
22 }
23
24 // Copy any remaining data we may have in the buffer.
25 memcpy(ptr, &f->ibuf[f->ipos], buffed);
26 f->ipos = f->ilim = 0;
27 ptr += buffed;
28 actsize += buffed;
29 totsize -= buffed;
30
31 // Don't use the buffer for large reads.
32 if (totsize >= BUFSIZ) {
33 ssize_t rc = read(f->fd, ptr, totsize);
34 if (rc < 0) {
35 f->errflag = 1;
36 goto done;
37 }
38 if (rc == 0) {
39 f->eofflag = 1;
40 goto done;
41 }
42 ptr += rc;
43 actsize += rc;
44 totsize -= rc;
45 } else {
46 if (__getinput(f) < 0)
47 goto done;
48 }
49 }
50
51 done:
52 return actsize / eltsize;
53 }
54