# HG changeset patch # User Matti Hamalainen # Date 1529922267 -10800 # Node ID 47fe47f01fead42368c8fb96f7e52b51c6d2c989 # Parent 08b0cbadbc4568c97a0835f0be611cdb0e35d18f Implement dm_strdup_vprintf_len(const char *fmt, va_list args, int *len), which returns length of the generated string in int pointer *len. diff -r 08b0cbadbc45 -r 47fe47f01fea src/dmlib.h --- a/src/dmlib.h Mon Jun 25 13:22:39 2018 +0300 +++ b/src/dmlib.h Mon Jun 25 13:24:27 2018 +0300 @@ -410,6 +410,7 @@ char * dm_strdup(const char *str); char * dm_strndup(const char *str, const size_t n); +char * dm_strdup_vprintf_len(const char *fmt, va_list args, int *len); char * dm_strdup_vprintf(const char *fmt, va_list args); char * dm_strdup_printf(const char *fmt, ...); diff -r 08b0cbadbc45 -r 47fe47f01fea src/dmstring.c --- a/src/dmstring.c Mon Jun 25 13:22:39 2018 +0300 +++ b/src/dmstring.c Mon Jun 25 13:24:27 2018 +0300 @@ -105,7 +105,7 @@ /* Simulate a sprintf() that allocates memory */ -char *dm_strdup_vprintf(const char *fmt, va_list args) +char *dm_strdup_vprintf_len(const char *fmt, va_list args, int *len) { int size = 64; char *buf, *tmp; @@ -115,16 +115,15 @@ while (1) { - int n; va_list ap; va_copy(ap, args); - n = vsnprintf(buf, size, fmt, ap); + *len = vsnprintf(buf, size, fmt, ap); va_end(ap); - if (n > -1 && n < size) + if (*len > -1 && *len < size) return buf; - if (n > -1) - size = n + 1; + if (*len > -1) + size = *len + 1; else size *= 2; @@ -139,13 +138,21 @@ } +char *dm_strdup_vprintf(const char *fmt, va_list args) +{ + int len; + return dm_strdup_vprintf_len(fmt, args, &len); +} + + char *dm_strdup_printf(const char *fmt, ...) { + int len; char *res; va_list ap; va_start(ap, fmt); - res = dm_strdup_vprintf(fmt, ap); + res = dm_strdup_vprintf_len(fmt, ap, &len); va_end(ap); return res;