summaryrefslogtreecommitdiff
path: root/lib/snprintf.c
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2004-10-07 16:15:22 +0000
committerBruno Haible <bruno@clisp.org>2004-10-07 16:15:22 +0000
commitf5200a50fa42fdaed40ecc67b27f41be328a6a01 (patch)
treee5210de2a546aef174a23e1aedede165eb75a0df /lib/snprintf.c
parent68126b9700a6cefbfe0f578fa7dbe71829c52e8f (diff)
downloadgnulib-f5200a50fa42fdaed40ecc67b27f41be328a6a01.tar.gz
Avoid a memory allocation when possible.
Diffstat (limited to 'lib/snprintf.c')
-rw-r--r--lib/snprintf.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/lib/snprintf.c b/lib/snprintf.c
index 667ed94625..9a4edc1f5f 100644
--- a/lib/snprintf.c
+++ b/lib/snprintf.c
@@ -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;
}