diff --git a/src/utils/strbuf.c b/src/utils/strbuf.c
index 7c24b3a8a75733382274d3f34f4ea46a46283f80..993b086d0ef0adbcb060faf046cd7390f548e4bd 100644 (file)
--- a/src/utils/strbuf.c
+++ b/src/utils/strbuf.c
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
+#include <string.h>
/*
* private data structures
return status;
} /* sdb_strbuf_sprintf */
+ssize_t
+sdb_strbuf_memappend(sdb_strbuf_t *strbuf, const void *data, size_t n)
+{
+ if ((! strbuf) || (! data))
+ return -1;
+
+ assert((strbuf->size == 0) || (strbuf->string[strbuf->pos] == '\0'));
+
+ if (strbuf->pos + n + 1 >= strbuf->size) {
+ size_t newsize = strbuf->size * 2;
+
+ if (! newsize)
+ newsize = 64;
+ while (strbuf->pos + n + 1 >= newsize)
+ newsize *= 2;
+
+ if (strbuf_resize(strbuf, newsize))
+ return -1;
+ }
+
+ assert(strbuf->size && strbuf->string);
+ assert(strbuf->pos < strbuf->size);
+
+ memcpy((void *)(strbuf->string + strbuf->pos), data, n);
+ strbuf->pos += n;
+ strbuf->string[strbuf->pos] = '\0';
+
+ return (ssize_t)n;
+} /* sdb_strbuf_memappend */
+
+ssize_t
+sdb_strbuf_memcpy(sdb_strbuf_t *strbuf, const void *data, size_t n)
+{
+ if ((! strbuf) || (! data))
+ return -1;
+
+ if (strbuf->size) {
+ strbuf->string[0] = '\0';
+ strbuf->pos = 0;
+ }
+
+ return sdb_strbuf_memappend(strbuf, data, n);
+} /* sdb_strbuf_memcpy */
+
ssize_t
sdb_strbuf_chomp(sdb_strbuf_t *strbuf)
{