diff options
| author | mikeos <mike.osipov@gmail.com> | 2013-01-28 23:15:49 +0400 |
|---|---|---|
| committer | mikeos <mike.osipov@gmail.com> | 2013-01-28 23:15:49 +0400 |
| commit | 90810f9f35494ed55784547ea3f91f20da91f2c4 (patch) | |
| tree | 02c006e66906a068c5e88ddca059b1e55c9788cb /buffer.c | |
| parent | 656e5b71064f5ee521e3d28a6c1c0e7f5f85a622 (diff) | |
command interface improvements
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; |
