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 ++++++++++++++++++++++++++++ dstring.h | 14 ++++++++++++++ 2 files changed, 42 insertions(+) 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)); diff --git a/dstring.h b/dstring.h index 0374447..22476b9 100644 --- a/dstring.h +++ b/dstring.h @@ -21,6 +21,7 @@ #ifndef BFS_DSTRING_H #define BFS_DSTRING_H +#include "util.h" #include /** @@ -105,6 +106,19 @@ int dstrncat(char **dest, const char *src, size_t n); */ int dstrapp(char **str, char c); +/** + * Create a dynamic string from a format string. + * + * @param format + * The format string to fill in. + * @param ... + * Any arguments for the format string. + * @return + * The created string, or NULL on failure. + */ +BFS_FORMATTER(1, 2) +char *dstrprintf(const char *format, ...); + /** * Free a dynamic string. * -- cgit v1.2.3