diff --git a/src/utils/strbuf.c b/src/utils/strbuf.c
index 4d8fc8b91ba234df10edd8d15d552169bcbf9930..822f01928c4437b40bb4d621f905cf0b649cea6a 100644 (file)
--- a/src/utils/strbuf.c
+++ b/src/utils/strbuf.c
assert((strbuf->size == 0) || (strbuf->string[strbuf->pos] == '\0'));
- if (strbuf->pos >= strbuf->size)
+ if (! strbuf->size) {
/* use some arbitrary but somewhat reasonable default */
- if (strbuf_resize(strbuf, strbuf->size ? 2 * strbuf->size : 64))
+ if (strbuf_resize(strbuf, 64))
+ return -1;
+ }
+ /* make sure to reserve space for the nul-byte */
+ else if (strbuf->pos >= strbuf->size - 1)
+ if (strbuf_resize(strbuf, 2 * strbuf->size))
return -1;
assert(strbuf->size && strbuf->string);
return status;
}
- if ((size_t)status >= strbuf->size - strbuf->pos) {
- strbuf_resize(strbuf, (size_t)status + 1);
+ /* 'status' does not include nul-byte */
+ if ((size_t)status >= strbuf->size - strbuf->pos - 1) {
+ if (strbuf_resize(strbuf, strbuf->size + (size_t)status)) {
+ va_end(aq);
+ return -1;
+ }
/* reset string and try again */
strbuf->string[strbuf->pos] = '\0';
} /* sdb_strbuf_chomp */
void
-sdb_strbuf_skip(sdb_strbuf_t *strbuf, size_t n)
+sdb_strbuf_skip(sdb_strbuf_t *strbuf, size_t offset, size_t n)
{
+ char *start;
+ size_t len;
+
if ((! strbuf) || (! n))
return;
- if (n >= strbuf->pos) {
- strbuf->string[0] = '\0';
- strbuf->pos = 0;
+ if (offset >= strbuf->pos)
+ return;
+
+ len = strbuf->pos - offset;
+
+ if (n >= len) {
+ strbuf->string[offset] = '\0';
+ strbuf->pos = offset;
return;
}
- assert(n < strbuf->pos);
- memmove(strbuf->string, strbuf->string + n, strbuf->pos - n);
+ assert(offset + n < strbuf->pos);
+ assert(offset < strbuf->pos);
+
+ start = strbuf->string + offset;
+ memmove(start, start + n, len - n);
strbuf->pos -= n;
strbuf->string[strbuf->pos] = '\0';
} /* sdb_strbuf_skip */
+void
+sdb_strbuf_clear(sdb_strbuf_t *strbuf)
+{
+ if ((! strbuf) || (! strbuf->size))
+ return;
+
+ strbuf->string[0] = '\0';
+ strbuf->pos = 0;
+} /* sdb_strbuf_clear */
+
const char *
sdb_strbuf_string(sdb_strbuf_t *strbuf)
{