Append directly to base string in vstr printf hooks

This commit is contained in:
Martin Willi
2012-07-13 13:23:29 +02:00
parent 4addc415a5
commit 060555f082
2 changed files with 10 additions and 20 deletions
+4 -9
View File
@@ -141,14 +141,13 @@ static int custom_arginfo(const struct printf_info *info, size_t n, int *argtype
*/ */
static int custom_fmt_cb(Vstr_base *base, size_t pos, Vstr_fmt_spec *fmt_spec) static int custom_fmt_cb(Vstr_base *base, size_t pos, Vstr_fmt_spec *fmt_spec)
{ {
int i, written; int i;
char buf[PRINTF_BUF_LEN];
const void *args[ARGS_MAX]; const void *args[ARGS_MAX];
printf_hook_spec_t spec; printf_hook_spec_t spec;
printf_hook_handler_t *handler = printf_hooks[SPEC_TO_INDEX(fmt_spec->name[0])]; printf_hook_handler_t *handler = printf_hooks[SPEC_TO_INDEX(fmt_spec->name[0])];
printf_hook_data_t data = { printf_hook_data_t data = {
.buf = buf, .base = base,
.buflen = sizeof(buf), .pos = pos,
}; };
for (i = 0; i < handler->numargs; i++) for (i = 0; i < handler->numargs; i++)
@@ -168,11 +167,7 @@ static int custom_fmt_cb(Vstr_base *base, size_t pos, Vstr_fmt_spec *fmt_spec)
spec.minus = fmt_spec->fmt_minus; spec.minus = fmt_spec->fmt_minus;
spec.width = fmt_spec->fmt_field_width; spec.width = fmt_spec->fmt_field_width;
written = handler->hook(&data, &spec, args); handler->hook(&data, &spec, args);
if (written > 0)
{
vstr_add_buf(base, pos, buf, written);
}
return 1; return 1;
} }
+6 -11
View File
@@ -115,27 +115,22 @@ int vstr_wrapper_vasprintf(char **str, const char *format, va_list ap);
struct printf_hook_data_t { struct printf_hook_data_t {
/** /**
* Buffer to write to * Base to append printf to
*/ */
char *buf; Vstr_base *base;
/** /**
* Size of the buffer * Position in base to write to
*/ */
size_t buflen; size_t pos;
}; };
/** /**
* Helper macro to be used in printf hook callbacks. * Helper macro to be used in printf hook callbacks.
*/ */
#define print_in_hook(data, fmt, ...) ({\ #define print_in_hook(data, fmt, ...) ({\
int _written = snprintf(data->buf, data->buflen, fmt, ##__VA_ARGS__);\ int _written = vstr_add_fmt(data->base, data->pos, fmt, ##__VA_ARGS__);\
if (_written < 0 || _written >= data->buflen)\ data->pos += _written;\
{\
_written = data->buflen - 1;\
}\
data->buf += _written;\
data->buflen -= _written;\
_written;\ _written;\
}) })