From 28bbaeac8058653a4a46ae439c37d251a550f4f9 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Thu, 23 May 2019 17:03:17 -0400 Subject: dstring: Add a printf()-style creation API --- dstring.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'dstring.c') diff --git a/dstring.c b/dstring.c index 35ea5b2..d7ce456 100644 --- a/dstring.c +++ b/dstring.c @@ -15,6 +15,9 @@ ****************************************************************************/ #include "dstring.h" +#include +#include +#include #include #include @@ -117,6 +120,31 @@ int dstrapp(char **str, char c) { return dstrcat_impl(str, &c, 1); } +char *dstrprintf(const char *format, ...) { + va_list args; + + va_start(args, format); + int len = vsnprintf(NULL, 0, format, args); + va_end(args); + + assert(len > 0); + + char *str = dstralloc(len); + if (!str) { + return NULL; + } + + va_start(args, format); + len = vsnprintf(str, len + 1, format, args); + va_end(args); + + struct dstring *header = dstrheader(str); + assert(len == header->capacity); + header->length = len; + + return str; +} + void dstrfree(char *dstr) { if (dstr) { free(dstrheader(dstr)); -- cgit v1.2.3