static int custom_print(FILE *stream, const struct printf_info *info,
const void *const *args)
{
- int written;
- char buf[PRINTF_BUF_LEN];
printf_hook_spec_t spec;
printf_hook_handler_t *handler = printf_hooks[SPEC_TO_INDEX(info->spec)];
printf_hook_data_t data = {
- .buf = buf,
- .buflen = sizeof(buf),
+ .stream = stream,
};
spec.hash = info->alt;
spec.minus = info->left;
spec.width = info->width;
- written = handler->hook(&data, &spec, args);
- if (written > 0)
- {
- ignore_result(fwrite(buf, 1, written, stream));
- }
- return written;
+ return handler->hook(&data, &spec, args);
}
/**
PRINTF_HOOK_ARGTYPE_POINTER = PA_POINTER,
};
+/**
+ * Data to pass to a printf hook.
+ */
+struct printf_hook_data_t {
+
+ /**
+ * Output FILE stream
+ */
+ FILE *stream;;
+};
+
+/**
+ * Helper macro to be used in printf hook callbacks.
+ */
+#define print_in_hook(data, fmt, ...) ({\
+ int _written = fprintf(data->stream, fmt, ##__VA_ARGS__);\
+ if (_written < 0)\
+ {\
+ _written = 0;\
+ }\
+ _written;\
+})
+
#else
#include <vstr.h>
#define vsnprintf vstr_wrapper_vsnprintf
#define vasprintf vstr_wrapper_vasprintf
-#endif
-
/**
- * Callback function type for printf hooks.
- *
- * @param data hook data, to pass to print_in_hook()
- * @param spec format specifier
- * @param args arguments array
- * @return number of characters written
+ * Data to pass to a printf hook.
*/
-typedef int (*printf_hook_function_t)(printf_hook_data_t *data,
- printf_hook_spec_t *spec,
- const void *const *args);
+struct printf_hook_data_t {
+
+ /**
+ * Buffer to write to
+ */
+ char *buf;
+
+ /**
+ * Size of the buffer
+ */
+ size_t buflen;
+};
/**
* Helper macro to be used in printf hook callbacks.
- * buf and buflen get modified.
*/
#define print_in_hook(data, fmt, ...) ({\
int _written = snprintf(data->buf, data->buflen, fmt, ##__VA_ARGS__);\
_written;\
})
+#endif
+
/**
- * Data to pass to a printf hook.
+ * Callback function type for printf hooks.
+ *
+ * @param data hook data, to pass to print_in_hook()
+ * @param spec format specifier
+ * @param args arguments array
+ * @return number of characters written
*/
-struct printf_hook_data_t {
-
- /**
- * Buffer to write to
- */
- char *buf;
-
- /**
- * Size of the buffer
- */
- size_t buflen;
-};
+typedef int (*printf_hook_function_t)(printf_hook_data_t *data,
+ printf_hook_spec_t *spec,
+ const void *const *args);
/**
* Properties of the format specifier