* directive we don't know about, we should panic and die rather
* than run any risk.
*/
-static char *dupvprintf_inner(char *buf, int oldlen, int oldsize,
+static char *dupvprintf_inner(char *buf, int oldlen, int *oldsize,
const char *fmt, va_list ap)
{
- int len, size;
+ int len, size, newsize;
- size = oldsize - oldlen;
+ assert(*oldsize >= oldlen);
+ size = *oldsize - oldlen;
if (size == 0) {
size = 512;
- buf = sresize(buf, oldlen + size, char);
+ newsize = oldlen + size;
+ buf = sresize(buf, newsize, char);
+ } else {
+ newsize = *oldsize;
}
while (1) {
if (len >= 0 && len < size) {
/* This is the C99-specified criterion for snprintf to have
* been completely successful. */
+ *oldsize = newsize;
return buf;
} else if (len > 0) {
/* This is the C99 error condition: the returned length is
* buffer wasn't big enough, so we enlarge it a bit and hope. */
size += 512;
}
- buf = sresize(buf, oldlen + size, char);
+ newsize = oldlen + size;
+ buf = sresize(buf, newsize, char);
}
}
char *dupvprintf(const char *fmt, va_list ap)
{
- return dupvprintf_inner(NULL, 0, 0, fmt, ap);
+ int size = 0;
+ return dupvprintf_inner(NULL, 0, &size, fmt, ap);
}
char *dupprintf(const char *fmt, ...)
{
}
void strbuf_catfv(strbuf *buf, const char *fmt, va_list ap)
{
- buf->s = dupvprintf_inner(buf->s, buf->len, buf->size, fmt, ap);
+ buf->s = dupvprintf_inner(buf->s, buf->len, &buf->size, fmt, ap);
buf->len += strlen(buf->s + buf->len);
}
void strbuf_catf(strbuf *buf, const char *fmt, ...)