void string_appendf(String *s, char *fmt, ...) { va_list args; for (;;) { int avail = s->nalloc - s->len; va_start(args, fmt); int written = vsnprintf(s->body + s->len, avail, fmt, args); va_end(args); if (avail <= written) { realloc_body(s); continue; } s->len += written; return; } }
void buf_printf(Buffer *b, char *fmt, ...) { va_list args; for (;;) { int avail = b->nalloc - b->len; va_start(args, fmt); int written = vsnprintf(b->body + b->len, avail, fmt, args); va_end(args); if (avail <= written) { realloc_body(b); continue; } b->len += written; return; } }
char *vformat(char *fmt, va_list ap) { Buffer *b = make_buffer(); va_list aq; for (;;) { int avail = b->nalloc - b->len; va_copy(aq, ap); int written = vsnprintf(b->body + b->len, avail, fmt, aq); va_end(aq); if (avail <= written) { realloc_body(b); continue; } b->len += written; return buf_body(b); } }
void string_append(String *s, char c) { if (s->nalloc == (s->len + 1)) realloc_body(s); s->body[s->len++] = c; s->body[s->len] = '\0'; }
void buf_write(Buffer *b, char c) { if (b->nalloc == (b->len + 1)) realloc_body(b); b->body[b->len++] = c; }