]> granicus.if.org Git - mutt/commitdiff
add a malloc+sprintf combo function
authorMichael Elkins <me@sigpipe.org>
Sun, 8 Aug 2010 17:40:38 +0000 (10:40 -0700)
committerMichael Elkins <me@sigpipe.org>
Sun, 8 Aug 2010 17:40:38 +0000 (10:40 -0700)
lib.c
lib.h

diff --git a/lib.c b/lib.c
index 17cc5160babec5c80099694d430051a985bb82d7..0d8291549c117e456b7da68cad026d7a04380f80 100644 (file)
--- a/lib.c
+++ b/lib.c
@@ -1082,3 +1082,34 @@ int mutt_atol (const char *str, long *dst)
     return -1;
   return 0;
 }
+
+/* Allocate a C-string large enough to contain the formatted string.
+ * This is essentially malloc+sprintf in one.
+ */
+char *mutt_sprintf (const char *fmt, ...)
+{
+  size_t rlen = STRING;
+  char *r = safe_malloc (rlen);
+  for (;;)
+  {
+    va_list ap;
+    va_start (ap, fmt);
+    size_t n = vsnprintf (r, rlen, fmt, ap);
+    va_end (ap);
+    if (n < rlen)
+    {
+      /* reduce space to just that which was used.  note that 'n' does not
+       * include the terminal nul char.
+       */
+      if (n == 0) /* convention is to use NULL for zero-length strings. */
+       FREE (&r);
+      else if (n != rlen - 1)
+       safe_realloc (&r, n + 1);
+      return r;
+    }
+    /* increase size and try again */
+    rlen = n + 1;
+    safe_realloc(&r, rlen);
+  }
+  /* not reached */
+}
diff --git a/lib.h b/lib.h
index e13e1a246786de536b93181fe5e98cf8deea352e..b08f909dcced84718458bb7b5ae30cef1edabcb2 100644 (file)
--- a/lib.h
+++ b/lib.h
@@ -153,6 +153,7 @@ char *mutt_concatn_path (char *, size_t, const char *, size_t, const char *, siz
 char *mutt_concat_path (char *, const char *, const char *, size_t);
 char *mutt_read_line (char *, size_t *, FILE *, int *, int);
 char *mutt_skip_whitespace (char *);
+char *mutt_sprintf (const char *, ...);
 char *mutt_strlower (char *);
 char *mutt_substrcpy (char *, const char *, const char *, size_t);
 char *mutt_substrdup (const char *, const char *);