aboutsummaryrefslogtreecommitdiff
path: root/sys/base/bufio/read.c
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;
}