blob: 09a9f83f866abda06f0e09410d1ca1e76411cd88 (
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
|
#include "internal.h"
#include "refill.h"
int
bufio·read(io·Buffer *buf, int sz, int n, void *out)
{
byte *wtr;
int nr, rem, diff;
if(n == 0 || buf->state & bufio·end)
return bufio·err;
assert(buf->state & bufio·rdr);
wtr = out;
rem = n*sz;
while(rem > 0){
diff = buf->end - buf->pos;
nr = MIN(diff, rem);
if(!nr){
if(buf->state & bufio·end)
break;
if(refill(buf) <= 0)
break;
continue;
}
memmove(wtr, buf->pos, nr);
wtr += nr;
buf->pos += nr;
rem -= nr;
}
return n - rem/sz;
}
|