X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fstring-utils%2Fstring-utils.cpp;fp=src%2Fcommon%2Fstring-utils%2Fstring-utils.cpp;h=d23cf794cb34b0edb7da097f4393b4bced4fb8bb;hp=8dcc6b2aae9ce9fab7b3beeefbea0b495fc15db4;hb=d50d200af8d01f4b58a14e384cabd46b1afb4817;hpb=411b31544f22b773b4aad6cdb81faa81dc05e641 diff --git a/src/common/string-utils/string-utils.cpp b/src/common/string-utils/string-utils.cpp index 8dcc6b2aa..d23cf794c 100644 --- a/src/common/string-utils/string-utils.cpp +++ b/src/common/string-utils/string-utils.cpp @@ -7,11 +7,13 @@ #define _LGPL_SOURCE #include +#include #include #include #include #include #include +#include #include "string-utils.h" #include "../macros.h" @@ -395,3 +397,49 @@ int strutils_append_str(char **s, const char *append) free(old); return 0; } + +int strutils_appendf(char **s, const char *fmt, ...) +{ + char *new_str; + size_t oldlen = (*s) ? strlen(*s) : 0; + int ret; + va_list args; + + /* Compute length of formatted string we append. */ + va_start(args, fmt); + ret = vsnprintf(NULL, 0, fmt, args); + va_end(args); + + if (ret == -1) { + goto end; + } + + /* Allocate space for old string + new string + \0. */ + new_str = (char *) zmalloc(oldlen + ret + 1); + if (!new_str) { + ret = -ENOMEM; + goto end; + } + + /* Copy old string, if there was one. */ + if (oldlen) { + strcpy(new_str, *s); + } + + /* Format new string in-place. */ + va_start(args, fmt); + ret = vsprintf(&new_str[oldlen], fmt, args); + va_end(args); + + if (ret == -1) { + ret = -1; + goto end; + } + + free(*s); + *s = new_str; + new_str = NULL; + +end: + return ret; +}