printf-hook-builtin: Add a new "builtin" backend using its own printf() routines
[strongswan.git] / src / libstrongswan / utils / printf_hook / printf_hook.h
1 /*
2 * Copyright (C) 2009 Tobias Brunner
3 * Copyright (C) 2006-2008 Martin Willi
4 * 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_ @}*/