aboutsummaryrefslogtreecommitdiff
path: root/src/base/bufio/read.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/bufio/read.c')
-rw-r--r--src/base/bufio/read.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/base/bufio/read.c b/src/base/bufio/read.c
new file mode 100644
index 0000000..09a9f83
--- /dev/null
+++ b/src/base/bufio/read.c
@@ -0,0 +1,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;
+}