#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; }