From 90810f9f35494ed55784547ea3f91f20da91f2c4 Mon Sep 17 00:00:00 2001 From: mikeos Date: Mon, 28 Jan 2013 23:15:49 +0400 Subject: command interface improvements --- buffer.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) (limited to 'buffer.c') diff --git a/buffer.c b/buffer.c index 167db65..3d08468 100644 --- a/buffer.c +++ b/buffer.c @@ -2,6 +2,7 @@ #include "xwrap.h" #include +#include #include void binit(struct buffer *b, size_t size) @@ -32,6 +33,12 @@ static inline int bavail_read(struct buffer *b) return b->addr + b->size - b->end; } +static inline void bcheck_empty(struct buffer *b) +{ + if (b->begin == b->end) + b->begin = b->end = b->addr; +} + int bread(struct buffer *b, int fd) { int size; @@ -60,12 +67,60 @@ int bwrite(struct buffer *b, int fd) n = write(fd, b->begin, size); if (n < 1) return -1; + b->begin += n; - if (b->begin == b->end) - b->begin = b->end = b->addr; + bcheck_empty(b); + return n; } +int bgets(struct buffer *b, char *s, size_t len) +{ + int size; + char *p; + int n; + + if (len == 0) + return 0; + + size = bavail_write(b); + if (size == 0) + return 0; + + if ((p = memchr(b->begin, '\n', size)) == NULL) + return 0; + + n = p - b->begin + 1; + if (len > n) + len = n; + + memcpy(s, b->begin, len); + b->begin += len; + bcheck_empty(b); + + return len; +} + +int bputs(struct buffer *b, char *s, size_t len) +{ + int size; + + if (len == 0) + return 0; + + size = bavail_read(b); + if (size == 0) + return 0; + + if (len > size) + len = size; + + memcpy(b->end, s, len); + b->end += len; + + return len; +} + int bcanfill(struct buffer *b) { return bavail_read(b) > 0; -- cgit v1.2.3-70-g09d2