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;