Avoid a memory allocation when possible.
authorBruno Haible <bruno@clisp.org>
Thu, 7 Oct 2004 16:15:22 +0000 (16:15 +0000)
committerBruno Haible <bruno@clisp.org>
Thu, 7 Oct 2004 16:15:22 +0000 (16:15 +0000)
lib/ChangeLog
lib/snprintf.c

index 1c3510d..08659a3 100644 (file)
@@ -1,3 +1,8 @@
+2004-10-07  Bruno Haible  <bruno@clisp.org>
+
+       * snprintf.c (snprintf): Avoid a memory allocation if the result fits
+       into the provided buffer.
+
 2004-10-06  Paul Eggert  <eggert@cs.ucla.edu>
 
        * diacrit.c, diacrit.h: Add GPL notice.
index 667ed94..9a4edc1 100644 (file)
@@ -42,19 +42,19 @@ snprintf (char *str, size_t size, const char *format, ...)
   va_list args;
 
   va_start (args, format);
-  output = vasnprintf (NULL, &len, format, args);
+  len = size;
+  output = vasnprintf (str, &len, format, args);
   va_end (args);
 
   if (!output)
     return -1;
 
-  if (str && size > 0)
-    {
-      memcpy (str, output, MIN (len + 1, size));
+  if (str != NULL)
+    if (len > size - 1) /* equivalent to: (size > 0 && len >= size) */
       str[size - 1] = '\0';
-    }
 
-  free (output);
+  if (output != str)
+    free (output);
 
   return len;
 }