aboutsummaryrefslogtreecommitdiffstats
path: root/man3/printf.3
diff options
context:
space:
mode:
Diffstat (limited to 'man3/printf.3')
-rw-r--r--man3/printf.311
1 files changed, 9 insertions, 2 deletions
diff --git a/man3/printf.3 b/man3/printf.3
index fc9456c166..720a8fff5c 100644
--- a/man3/printf.3
+++ b/man3/printf.3
@@ -1035,8 +1035,8 @@ To allocate a sufficiently large string and print into it
char *
make_message(const char *fmt, ...)
{
- /* Guess we need no more than 100 bytes. */
- int n, size = 100;
+ int n;
+ int size = 100; /* Guess we need no more than 100 bytes. */
char *p, *np;
va_list ap;
@@ -1044,18 +1044,25 @@ make_message(const char *fmt, ...)
return NULL;
while (1) {
+
/* Try to print in the allocated space. */
+
va_start(ap, fmt);
n = vsnprintf(p, size, fmt, ap);
va_end(ap);
+
/* If that worked, return the string. */
+
if (n > \-1 && n < size)
return p;
+
/* Else try again with more space. */
+
if (n > \-1) /* glibc 2.1 */
size = n+1; /* precisely what is needed */
else /* glibc 2.0 */
size *= 2; /* twice the old size */
+
if ((np = realloc (p, size)) == NULL) {
free(p);
return NULL;