/* * Copyright (C) 2009 Tobias Brunner * Copyright (C) 2006-2008 Martin Willi * HSR Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. See . * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ /** * @defgroup printf_hook printf_hook * @{ @ingroup utils */ #ifndef PRINTF_HOOK_H_ #define PRINTF_HOOK_H_ #include typedef struct printf_hook_t printf_hook_t; typedef struct printf_hook_spec_t printf_hook_spec_t; typedef struct printf_hook_data_t printf_hook_data_t; typedef enum printf_hook_argtype_t printf_hook_argtype_t; #if defined(USE_VSTR) # include "printf_hook_vstr.h" #elif defined(USE_BUILTIN_PRINTF) # include "printf_hook_builtin.h" #endif /** * Argument types to pass to printf hook. */ enum printf_hook_argtype_t { PRINTF_HOOK_ARGTYPE_END, PRINTF_HOOK_ARGTYPE_INT, PRINTF_HOOK_ARGTYPE_POINTER, }; /** * 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 */ 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 */ struct printf_hook_spec_t { /** * TRUE if a '#' was used in the format specifier */ int hash; /** * TRUE if a '-' was used in the format specifier */ int minus; /** * TRUE if a '+' was used in the format specifier */ int plus; /** * The width as given in the format specifier. */ int width; }; /** * Printf handler management. */ struct printf_hook_t { /** * Register a printf handler. * * @param spec printf hook format character * @param hook hook function * @param ... list of PRINTF_HOOK_ARGTYPE_*, MUST end with PRINTF_HOOK_ARGTYPE_END */ void (*add_handler)(printf_hook_t *this, char spec, printf_hook_function_t hook, ...); /** * Destroy a printf_hook instance. */ void (*destroy)(printf_hook_t *this); }; /** * Create a printf_hook instance. */ printf_hook_t *printf_hook_create(); /** * Print with format string within a printf hook. * * @param data hook data, as passed to printf hook * @param fmt printf format string * @param ... arguments to format string * @return number of characters written */ size_t print_in_hook(printf_hook_data_t *data, char *fmt, ...); #endif /** PRINTF_HOOK_H_ @}*/