summaryrefslogtreecommitdiff
path: root/buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'buffer.c')
-rw-r--r--buffer.c59
1 files changed, 57 insertions, 2 deletions
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 <stdlib.h>
+#include <string.h>
#include <unistd.h>
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;