+ len = vsnprintf(buf->data + buf->len, buf->size - buf->len, fmt, args);
+ if (len < 0)
+ return len;
+ if (len >= buf->size - buf->len) {
+ buffer_ensure(buf, len);
+ vsnprintf(buf->data + buf->len, buf->size - buf->len, fmt, ap);
+ }
+ buf->len += len;
+ buf->data[buf->len] = '\0';