X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Futils%2Fstrbuf.c;h=77d19f044d71a1fec89ec629877d0deda5b3585d;hb=2e2e989712ec5991526b3aaeec011440adb5bf7e;hp=993b086d0ef0adbcb060faf046cd7390f548e4bd;hpb=db10803daef8bf91971171c86f22abebcd74d4eb;p=sysdb.git diff --git a/src/utils/strbuf.c b/src/utils/strbuf.c index 993b086..77d19f0 100644 --- a/src/utils/strbuf.c +++ b/src/utils/strbuf.c @@ -34,6 +34,8 @@ #include #include +#include + /* * private data structures */ @@ -117,9 +119,14 @@ sdb_strbuf_vappend(sdb_strbuf_t *strbuf, const char *fmt, va_list ap) 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); @@ -135,8 +142,12 @@ sdb_strbuf_vappend(sdb_strbuf_t *strbuf, const char *fmt, va_list ap) 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'; @@ -233,6 +244,23 @@ sdb_strbuf_memcpy(sdb_strbuf_t *strbuf, const void *data, size_t n) return sdb_strbuf_memappend(strbuf, data, n); } /* sdb_strbuf_memcpy */ +ssize_t +sdb_strbuf_read(sdb_strbuf_t *strbuf, int fd, size_t n) +{ + ssize_t ret; + + if (! strbuf) + return -1; + + if (strbuf_resize(strbuf, strbuf->pos + n + 1)) + return -1; + + ret = read(fd, strbuf->string + strbuf->pos, n); + if (ret > 0) + strbuf->pos += (size_t)ret; + return ret; +} /* sdb_strbuf_read */ + ssize_t sdb_strbuf_chomp(sdb_strbuf_t *strbuf) { @@ -254,6 +282,24 @@ sdb_strbuf_chomp(sdb_strbuf_t *strbuf) return ret; } /* sdb_strbuf_chomp */ +void +sdb_strbuf_skip(sdb_strbuf_t *strbuf, size_t n) +{ + if ((! strbuf) || (! n)) + return; + + if (n >= strbuf->pos) { + strbuf->string[0] = '\0'; + strbuf->pos = 0; + return; + } + + assert(n < strbuf->pos); + memmove(strbuf->string, strbuf->string + n, strbuf->pos - n); + strbuf->pos -= n; + strbuf->string[strbuf->pos] = '\0'; +} /* sdb_strbuf_skip */ + const char * sdb_strbuf_string(sdb_strbuf_t *strbuf) {