From 893c216b889f260378fb21a7f576c061f7ff2248 Mon Sep 17 00:00:00 2001 From: mikeos Date: Sat, 13 Oct 2012 23:20:14 +0400 Subject: initial --- buffer.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 buffer.c (limited to 'buffer.c') diff --git a/buffer.c b/buffer.c new file mode 100644 index 0000000..167db65 --- /dev/null +++ b/buffer.c @@ -0,0 +1,78 @@ +#include "buffer.h" +#include "xwrap.h" + +#include +#include + +void binit(struct buffer *b, size_t size) +{ + char *p; + + p = (char *) xmalloc(size); + b->addr = b->begin = b->end = p; + b->size = size; +} + +void bfree(struct buffer *b) +{ + if (b->addr != NULL) { + free(b->addr); + b->addr = b->begin = b->end = NULL; + b->size = 0; + } +} + +static inline int bavail_write(struct buffer *b) +{ + return b->end - b->begin; +} + +static inline int bavail_read(struct buffer *b) +{ + return b->addr + b->size - b->end; +} + +int bread(struct buffer *b, int fd) +{ + int size; + int n; + + size = bavail_read(b); + if (size == 0) + return 0; + + n = read(fd, b->end, size); + if (n < 1) + return -1; + b->end += n; + return n; +} + +int bwrite(struct buffer *b, int fd) +{ + int size; + int n; + + size = bavail_write(b); + if (size == 0) + return 0; + + 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; + return n; +} + +int bcanfill(struct buffer *b) +{ + return bavail_read(b) > 0; +} + +int bhasdata(struct buffer *b) +{ + return bavail_write(b) > 0; +} + -- cgit v1.2.3-70-g09d2