diff --git a/app/src/util/str_util.c b/app/src/util/str_util.c index ce0498a5..6d7e37ff 100644 --- a/app/src/util/str_util.c +++ b/app/src/util/str_util.c @@ -1,7 +1,9 @@ #include "str_util.h" +#include #include #include +#include #include #include @@ -195,3 +197,33 @@ utf8_from_wide_char(const wchar_t *ws) { } #endif + +char * +sc_asprintf(const char *fmt, ...) { + va_list va; + va_start(va, fmt); + char *s = sc_vasprintf(fmt, va); + va_end(va); + return s; +} + +char * +sc_vasprintf(const char *fmt, va_list ap) { + va_list va; + va_copy(va, ap); + int len = vsnprintf(NULL, 0, fmt, va); + va_end(va); + + char *str = malloc(len + 1); + if (!str) { + return NULL; + } + + va_copy(va, ap); + int len2 = vsprintf(str, fmt, va); + (void) len2; + assert(len == len2); + va_end(va); + + return str; +} diff --git a/app/src/util/str_util.h b/app/src/util/str_util.h index c7f26cdb..ac20bf66 100644 --- a/app/src/util/str_util.h +++ b/app/src/util/str_util.h @@ -1,8 +1,10 @@ #ifndef STRUTIL_H #define STRUTIL_H +#include #include #include +#include #include "config.h" @@ -57,4 +59,13 @@ char * utf8_from_wide_char(const wchar_t *s); #endif +// compatibility function similar to asprintf() +// (but returning the resulting string for convenience) +char * +sc_asprintf(const char *fmt, ...) +__attribute__((format(printf, 1, 2))); + +char * +sc_vasprintf(const char *fmt, va_list ap); + #endif