From dd0d462afae75ff243f8cd1528963f9ad489706d Mon Sep 17 00:00:00 2001 From: Richard Nyberg Date: Fri, 24 Jun 2005 09:51:38 +0000 Subject: Import btpd-0.1. git-svn-id: file:///home/rnyberg/svngit/btpd/releases/0.1@1 76a1f634-46fa-0310-9943-bd1476092a85 --- misc/iobuf.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 misc/iobuf.c (limited to 'misc/iobuf.c') diff --git a/misc/iobuf.c b/misc/iobuf.c new file mode 100644 index 0000000..a7304c6 --- /dev/null +++ b/misc/iobuf.c @@ -0,0 +1,64 @@ +#include +#include +#include +#include +#include +#include + +#include "iobuf.h" + +#define GROWLEN (1 << 14) + +int +buf_init(struct io_buffer *iob, size_t size) +{ + iob->buf_off = 0; + iob->buf_len = size; + iob->buf = malloc(size); + if (iob->buf == NULL) + return ENOMEM; + else + return 0; +} + +int +buf_grow(struct io_buffer *iob, size_t addlen) +{ + char *nbuf = realloc(iob->buf, iob->buf_len + addlen); + if (nbuf == NULL) + return ENOMEM; + else { + iob->buf = nbuf; + iob->buf_len += addlen; + return 0; + } +} + +int +buf_print(struct io_buffer *iob, const char *fmt, ...) +{ + int np; + va_list ap; + va_start(ap, fmt); + np = vsnprintf(NULL, 0, fmt, ap); + va_end(ap); + while (np + 1 > iob->buf_len - iob->buf_off) + if (buf_grow(iob, GROWLEN) != 0) + return ENOMEM; + va_start(ap, fmt); + vsnprintf(iob->buf + iob->buf_off, np + 1, fmt, ap); + va_end(ap); + iob->buf_off += np; + return 0; +} + +int +buf_write(struct io_buffer *iob, const void *buf, size_t len) +{ + while (iob->buf_len - iob->buf_off < len) + if (buf_grow(iob, GROWLEN) != 0) + return ENOMEM; + bcopy(buf, iob->buf + iob->buf_off, len); + iob->buf_off += len; + return 0; +} -- cgit 1.4.1