summaryrefslogtreecommitdiff
path: root/lib/darr.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/darr.c')
-rw-r--r--lib/darr.c39
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;