diff options
Diffstat (limited to 'lib/darr.c')
| -rw-r--r-- | lib/darr.c | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/lib/darr.c b/lib/darr.c index 282e0dc5dc..9ec3cb63b0 100644 --- a/lib/darr.c +++ b/lib/darr.c @@ -52,6 +52,44 @@ static size_t darr_size(uint count, size_t esize) return count * esize + sizeof(struct darr_metadata); } +char *__darr_in_vsprintf(char **sp, bool concat, const char *fmt, va_list ap) +{ + size_t inlen = concat ? darr_strlen(*sp) : 0; + size_t capcount = strlen(fmt) + MIN(inlen + 64, 128); + ssize_t len; + + darr_ensure_cap(*sp, capcount); + + if (!concat) + darr_reset(*sp); + + /* code below counts on having a NUL terminated string */ + if (darr_len(*sp) == 0) + *darr_append(*sp) = 0; +again: + len = vsnprintf(darr_last(*sp), darr_avail(*sp), fmt, ap); + if (len < 0) + darr_in_strcat(*sp, fmt); + else if ((size_t)len < darr_avail(*sp)) + _darr_len(*sp) += len; + else { + darr_ensure_cap(*sp, darr_len(*sp) + (size_t)len); + goto again; + } + return *sp; +} + +char *__darr_in_sprintf(char **sp, bool concat, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + (void)__darr_in_vsprintf(sp, concat, fmt, ap); + va_end(ap); + return *sp; +} + + void *__darr_resize(void *a, uint count, size_t esize) { uint ncount = darr_next_count(count, esize); @@ -69,7 +107,6 @@ void *__darr_resize(void *a, uint count, size_t esize) void *__darr_insert_n(void *a, uint at, uint count, size_t esize, bool zero) { - struct darr_metadata *dm; uint olen, nlen; |
