diff options
Diffstat (limited to 'man3/printf.3')
| -rw-r--r-- | man3/printf.3 | 11 |
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; |
