1
0
Fork 0

feat(printf): add user pointer to fctprintf()

Arbitrary user data can be passed to output function
development
Sebastian Goll 7 years ago
parent 0116b74916
commit d40951182f

@ -52,7 +52,7 @@ int snprintf(char* buffer, size_t count, const char* format, ...);
int vsnprintf(char* buffer, size_t count, const char* format, va_list va); int vsnprintf(char* buffer, size_t count, const char* format, va_list va);
// call output function (instead of buffer) // call output function (instead of buffer)
int fctprintf(void (*out)(char character), const char* format, ...); int fctprintf(void (*out)(char character, void* user), void* user, const char* format, ...);
``` ```

@ -77,6 +77,13 @@
typedef void (*out_fct_type)(char character, char* buffer, size_t idx, size_t maxlen); 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 // internal buffer output
static inline void _out_buffer(char character, char* buffer, size_t idx, size_t maxlen) 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) static inline void _out_fct(char character, char* buffer, size_t idx, size_t maxlen)
{ {
(void)idx; (void)maxlen; (void)idx; (void)maxlen;
typedef struct tag_out_fct_wrap_type { // buffer is the output fct pointer
void (*fct)(char character); ((out_fct_wrap_type*)buffer)->fct(character, ((out_fct_wrap_type*)buffer)->user);
} out_fct_wrap_type;
((out_fct_wrap_type*)buffer)->fct(character); // buffer is the output fct pointer
} }
@ -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_list va;
va_start(va, format); va_start(va, format);
const struct tag_out_fct_wrap { const out_fct_wrap_type out_fct_wrap = { out, user };
void (*fct)(char character);
} out_fct_wrap = { out };
const int ret = _vsnprintf(_out_fct, (char*)&out_fct_wrap, (size_t)-1, format, va); const int ret = _vsnprintf(_out_fct, (char*)&out_fct_wrap, (size_t)-1, format, va);
va_end(va); va_end(va);
return ret; return ret;

@ -84,10 +84,11 @@ int vsnprintf(char* buffer, size_t count, const char* format, va_list va);
* printf with output function * printf with output function
* You may use this as dynamic alternative to printf() with its fixed _putchar() output * You may use this as dynamic alternative to printf() with its fixed _putchar() output
* \param out An output function which takes one character * \param out An output function which takes one character
* \param user A pointer to user data passed to output function
* \param format A string that specifies the format of the output * \param format A string that specifies the format of the output
* \return The number of characters that are sent to the output function, not counting the terminating null character * \return The number of characters that are sent to the output function, not counting the terminating null character
*/ */
int fctprintf(void (*out)(char character), const char* format, ...); int fctprintf(void (*out)(char character, void* user), void* user, const char* format, ...);
#ifdef __cplusplus #ifdef __cplusplus

Loading…
Cancel
Save