// conversion functions static void cvt_s(int code, va_list *app, int put(int c, void *c1), void *c1, unsigned char flags[], int width, int precision){ char *str = va_arg(*app, char *); assert(str); Fmt_puts(str, strlen(str), put, c1, flags, width, precision); }
void Text_fmt(int code, va_list *app, int put(int c, void *cl), void *cl, unsigned char flags[], int width, int precision) { T *s; assert(app && flags); s = va_arg(*app, T*); assert(s && s->len >= 0 && s->str); Fmt_puts(s->str, s->len, put, cl, flags, width, precision); }
void Str_fmt(int code, va_list *app, int put(int c, void *cl), void *cl, unsigned char flags[], int width, int precision) { char *s; int i, j; assert(app && flags); s = va_arg(*app, char *); i = va_arg(*app, int); j = va_arg(*app, int); convert(s, i, j); Fmt_puts(s + i, j - i, put, cl, flags, width, precision); }