summaryrefslogtreecommitdiff
path: root/buffer.c
diff options
context:
space:
mode:
authormikeos <mike.osipov@gmail.com>2012-10-13 23:20:14 +0400
committermikeos <mike.osipov@gmail.com>2012-10-13 23:20:14 +0400
commit893c216b889f260378fb21a7f576c061f7ff2248 (patch)
treead4566df268c76de8fc743d006b14baf6bfb6594 /buffer.c
initial
Diffstat (limited to 'buffer.c')
-rw-r--r--buffer.c78
1 files changed, 78 insertions, 0 deletions
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 <stdlib.h>
+#include <unistd.h>
+
+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;
+}
+