1 #ifndef __BFT_PRINTF_H__
2 #define __BFT_PRINTF_H__
3 
4 /*============================================================================
5  * Base user-definable printf() wrapper or replacement
6  *============================================================================*/
7 
8 /*
9   This file is part of Code_Saturne, a general-purpose CFD tool.
10 
11   Copyright (C) 1998-2021 EDF S.A.
12 
13   This program is free software; you can redistribute it and/or modify it under
14   the terms of the GNU General Public License as published by the Free Software
15   Foundation; either version 2 of the License, or (at your option) any later
16   version.
17 
18   This program is distributed in the hope that it will be useful, but WITHOUT
19   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
20   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
21   details.
22 
23   You should have received a copy of the GNU General Public License along with
24   this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
25   Street, Fifth Floor, Boston, MA 02110-1301, USA.
26 */
27 
28 /*----------------------------------------------------------------------------*/
29 
30 #include "cs_defs.h"
31 
32 /*----------------------------------------------------------------------------*/
33 
34 /*----------------------------------------------------------------------------
35  * Standard C library headers
36  *----------------------------------------------------------------------------*/
37 
38 #include <stdarg.h>
39 
40 /*----------------------------------------------------------------------------
41  * Local headers
42  *----------------------------------------------------------------------------*/
43 
44 /*-----------------------------------------------------------------------------*/
45 
46 BEGIN_C_DECLS
47 
48 /*============================================================================
49  * Public types
50  *============================================================================*/
51 
52 /* Function pointers for printf() and fflush(stdout) type functions */
53 
54 typedef int (bft_printf_proxy_t) (const char     *const format,
55                                   va_list               arg_ptr);
56 
57 typedef int (bft_printf_flush_proxy_t) (void);
58 
59 /*============================================================================
60  * Public function prototypes
61  *============================================================================*/
62 
63 /*
64  * Replacement for printf() with modifiable behavior.
65  *
66  * This function calls vprintf() by default, or a function with similar
67  * arguments indicated by bft_printf_proxy_set().
68  *
69  * parameters:
70  *   format: <-- format string, as printf() and family.
71  *   ... :   <-- variable arguments based on format string.
72  *
73  * returns:
74  *   number of characters printed, not counting the trailing '\0' used
75  *   to end output strings
76  */
77 
78 #if defined(__GNUC__)
79 
80 int
81 bft_printf(const char  *const format,
82            ...)
83   __attribute__((format(printf, 1, 2)));
84 
85 #else
86 
87 int
88 bft_printf(const char  *const format,
89            ...);
90 
91 #endif
92 
93 /*
94  * Flush for output of bft_printf() with modifiable behavior.
95  *
96  * This function calls fflush(stdout) if bft_printf()'s default behavior is
97  * used. If bft_printf's behavior is modified with bft_printf_proxy_set(),
98  * bft_printf_flush()'s behavior may have to be also adjusted with
99  * bft_printf_flush_proxy_set().
100  *
101  * returns:
102  *   using the default behavior, the return value is that of
103  *   fflush(stdout): O upon successful completion, EOF otherwise
104  *   (with errno set to indicate the error).
105  */
106 
107 int
108 bft_printf_flush(void);
109 
110 /*
111  * Returns function associated with the bft_printf() function.
112  *
113  * returns:
114  *   pointer to the vprintf() or replacement function.
115  */
116 
117 bft_printf_proxy_t *
118 bft_printf_proxy_get(void);
119 
120 /*
121  * Associates a vprintf() type function with the bft_printf() function.
122  *
123  * parameters:
124  *   fct: <-- pointer to a vprintf() type function.
125  */
126 
127 void
128 bft_printf_proxy_set(bft_printf_proxy_t  *const fct);
129 
130 /*
131  * Returns function associated with bft_printf_flush().
132  *
133  * returns:
134  *   pointer to the bft_printf_flush() proxy.
135  */
136 
137 bft_printf_flush_proxy_t *
138 bft_printf_flush_proxy_get(void);
139 
140 /*
141  * Associates a proxy function with bft_printf_flush().
142  *
143  * warning:
144  *   bft_printf() is called by the default bft_error() error handler
145  *   (so as to ensure that the error text appears at the end of the
146  *   program output), so a bft_print_flush replacement must not itself
147  *   call (directly or indirectly) bft_error() if the default error
148  *   handler is used.
149  *
150  * parameter:
151  *   fct <-- pointer to a function similar to {return fflush(stdout)}.
152  */
153 
154 void
155 bft_printf_flush_proxy_set(bft_printf_flush_proxy_t  *const fct);
156 
157 /*----------------------------------------------------------------------------*/
158 
159 END_C_DECLS
160 
161 #endif /* __BFT_PRINTF_H__ */
162