diff options
Diffstat (limited to 'buffer.c')
| -rw-r--r-- | buffer.c | 59 |
1 files changed, 57 insertions, 2 deletions
@@ -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; |
