From d40951182f051899acf66f11d55c526003b266c8 Mon Sep 17 00:00:00 2001 From: Sebastian Goll Date: Sat, 2 Jun 2018 00:53:13 +0200 Subject: feat(printf): add user pointer to fctprintf() Arbitrary user data can be passed to output function --- printf.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'printf.c') diff --git a/printf.c b/printf.c index aa34cbd..dec4555 100644 --- a/printf.c +++ b/printf.c @@ -77,6 +77,13 @@ typedef void (*out_fct_type)(char character, char* buffer, size_t idx, size_t maxlen); +// wrapper used as buffer +typedef struct { + void (*fct)(char character, void* user); + void* user; +} out_fct_wrap_type; + + // internal buffer output static inline void _out_buffer(char character, char* buffer, size_t idx, size_t maxlen) { @@ -105,10 +112,8 @@ static inline void _out_char(char character, char* buffer, size_t idx, size_t ma static inline void _out_fct(char character, char* buffer, size_t idx, size_t maxlen) { (void)idx; (void)maxlen; - typedef struct tag_out_fct_wrap_type { - void (*fct)(char character); - } out_fct_wrap_type; - ((out_fct_wrap_type*)buffer)->fct(character); // buffer is the output fct pointer + // buffer is the output fct pointer + ((out_fct_wrap_type*)buffer)->fct(character, ((out_fct_wrap_type*)buffer)->user); } @@ -691,13 +696,11 @@ int vsnprintf(char* buffer, size_t count, const char* format, va_list va) } -int fctprintf(void (*out)(char character), const char* format, ...) +int fctprintf(void (*out)(char character, void* user), void* user, const char* format, ...) { va_list va; va_start(va, format); - const struct tag_out_fct_wrap { - void (*fct)(char character); - } out_fct_wrap = { out }; + const out_fct_wrap_type out_fct_wrap = { out, user }; const int ret = _vsnprintf(_out_fct, (char*)&out_fct_wrap, (size_t)-1, format, va); va_end(va); return ret; -- cgit v1.2.3