Mercurial > hg > dmlib
changeset 1884:47fe47f01fea
Implement dm_strdup_vprintf_len(const char *fmt, va_list args, int *len), which
returns length of the generated string in int pointer *len.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 25 Jun 2018 13:24:27 +0300 |
parents | 08b0cbadbc45 |
children | e69de47d2419 |
files | src/dmlib.h src/dmstring.c |
diffstat | 2 files changed, 15 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- 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, ...);
--- 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;