char *fmt_vstring(const char *fmt, va_list ap){ struct buf cl; assert(fmt); cl.size = 256; cl.buf = cl.bp = ALLOC(cl.size); fmt_vfmt(append, &cl, fmt, ap); append(0, &cl); return RESIZE(cl.buf, cl.bp-cl.buf); }
int fmt_vnprint(char *buf, int size, const char *fmt, va_list ap){ struct buf cl; assert(buf); assert(size > 0); assert(fmt); cl.buf = cl.bp = buf; cl.size = size; fmt_vfmt(insert, &cl, fmt, ap); insert(0, &cl); return cl.bp-cl.buf-1; }
void fmt_print(const char *fmt, ...) { va_list ap; va_start(ap, fmt); fmt_vfmt(outc, stdout, fmt, ap); va_end(ap); return; }
void fmt_fmt(putfunc_t put, void *cl, const char *fmt, ...) { va_list ap; va_start(ap, fmt); fmt_vfmt(put, cl, fmt, ap); va_end(ap); return; }
void fmt_fprint(FILE *fp, const char *fmt, ...) { va_list ap; assert(fp); va_start(ap, fmt); fmt_vfmt(outc, fp, fmt, ap); va_end(ap); return; }
void fmt_eprint(const char *fmt, ...) { va_list ap; va_start(ap, fmt); fmt_vfmt(outc, stderr, fmt, ap); va_end(ap); fflush(stderr); return; }
void fmt_vfprint(FILE *fp, const char *fmt, va_list ap) { assert(fp); fmt_vfmt(outc, fp, fmt, ap); }
void fmt_fprint(FILE *stream, const char *fmt, ...){ va_list ap; va_start(ap, fmt); fmt_vfmt(outc, stdout, fmt, ap); va_end(ap); }
void fmt_fmt(int put(int c, void *), void *cl, const char *fmt, ...){ va_list ap; va_start(ap, fmt); fmt_vfmt(put, cl, fmt, ap); va_end(ap); }