Return to printf_hook.h CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / strongswan / src / libstrongswan / utils / printf_hook |
1.1 misho 1: /* 2: * Copyright (C) 2009 Tobias Brunner 3: * Copyright (C) 2006-2008 Martin Willi 4: * HSR Hochschule fuer Technik Rapperswil 5: * 6: * This program is free software; you can redistribute it and/or modify it 7: * under the terms of the GNU General Public License as published by the 8: * Free Software Foundation; either version 2 of the License, or (at your 9: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. 10: * 11: * This program is distributed in the hope that it will be useful, but 12: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 13: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14: * for more details. 15: */ 16: 17: /** 18: * @defgroup printf_hook printf_hook 19: * @{ @ingroup utils 20: */ 21: 22: #ifndef PRINTF_HOOK_H_ 23: #define PRINTF_HOOK_H_ 24: 25: #include <stdlib.h> 26: 27: typedef struct printf_hook_t printf_hook_t; 28: typedef struct printf_hook_spec_t printf_hook_spec_t; 29: typedef struct printf_hook_data_t printf_hook_data_t; 30: typedef enum printf_hook_argtype_t printf_hook_argtype_t; 31: 32: #if defined(USE_VSTR) 33: # include "printf_hook_vstr.h" 34: #elif defined(USE_BUILTIN_PRINTF) 35: # include "printf_hook_builtin.h" 36: #endif 37: 38: /** 39: * Argument types to pass to printf hook. 40: */ 41: enum printf_hook_argtype_t { 42: PRINTF_HOOK_ARGTYPE_END, 43: PRINTF_HOOK_ARGTYPE_INT, 44: PRINTF_HOOK_ARGTYPE_POINTER, 45: }; 46: 47: /** 48: * Callback function type for printf hooks. 49: * 50: * @param data hook data, to pass to print_in_hook() 51: * @param spec format specifier 52: * @param args arguments array 53: * @return number of characters written 54: */ 55: typedef int (*printf_hook_function_t)(printf_hook_data_t *data, 56: printf_hook_spec_t *spec, 57: const void *const *args); 58: 59: /** 60: * Properties of the format specifier 61: */ 62: struct printf_hook_spec_t { 63: 64: /** 65: * TRUE if a '#' was used in the format specifier 66: */ 67: int hash; 68: 69: /** 70: * TRUE if a '-' was used in the format specifier 71: */ 72: int minus; 73: 74: /** 75: * TRUE if a '+' was used in the format specifier 76: */ 77: int plus; 78: 79: /** 80: * The width as given in the format specifier. 81: */ 82: int width; 83: }; 84: 85: /** 86: * Printf handler management. 87: */ 88: struct printf_hook_t { 89: 90: /** 91: * Register a printf handler. 92: * 93: * @param spec printf hook format character 94: * @param hook hook function 95: * @param ... list of PRINTF_HOOK_ARGTYPE_*, MUST end with PRINTF_HOOK_ARGTYPE_END 96: */ 97: void (*add_handler)(printf_hook_t *this, char spec, 98: printf_hook_function_t hook, ...); 99: 100: /** 101: * Destroy a printf_hook instance. 102: */ 103: void (*destroy)(printf_hook_t *this); 104: }; 105: 106: /** 107: * Create a printf_hook instance. 108: */ 109: printf_hook_t *printf_hook_create(); 110: 111: /** 112: * Print with format string within a printf hook. 113: * 114: * @param data hook data, as passed to printf hook 115: * @param fmt printf format string 116: * @param ... arguments to format string 117: * @return number of characters written 118: */ 119: size_t print_in_hook(printf_hook_data_t *data, char *fmt, ...); 120: 121: #endif /** PRINTF_HOOK_H_ @}*/