2004-05-21 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / debug.h
1 /* debug.h - interface to debugging functions
2  *      Copyright (C) 2002 g10 Code GmbH
3  *
4  * This file is part of GPGME.
5  *
6  * GPGME is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * GPGME is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #ifndef DEBUG_H
22 #define DEBUG_H
23
24 /* Log the formatted string FORMAT at debug level LEVEL or higher.  */
25 void _gpgme_debug (int level, const char *format, ...);
26
27 /* Start a new debug line in *LINE, logged at level LEVEL or higher,
28    and starting with the formatted string FORMAT.  */
29 void _gpgme_debug_begin (void **helper, int level, const char *format, ...);
30
31 /* Add the formatted string FORMAT to the debug line *LINE.  */
32 void _gpgme_debug_add (void **helper, const char *format, ...);
33
34 /* Finish construction of *LINE and send it to the debug output
35    stream.  */
36 void _gpgme_debug_end (void **helper);
37
38 /* Indirect stringification, requires __STDC__ to work.  */
39 #define STRINGIFY(v) #v
40 #define XSTRINGIFY(v) STRINGIFY(v)
41
42 #if 0
43 /* Only works in GNU.  */
44 #define DEBUG(fmt, arg...) \
45   _gpgme_debug (1, "%s:%s: " fmt, __FILE__, XSTRINGIFY (__LINE__) , ##arg)
46 #define DEBUG_BEGIN(hlp, lvl, fmt, arg...) \
47   _gpgme_debug_begin (&(hlp), lvl, "%s:%s: " fmt, __FILE__, \
48                       XSTRINGIFY (__LINE__) , ##arg)
49 #define DEBUG_ADD(hlp, fmt, arg...) \
50   _gpgme_debug_add (&(hlp), fmt , ##arg)
51 #define DEBUG_END(hlp, fmt, arg...) \
52   _gpgme_debug_add (&(hlp), fmt , ##arg); \
53   _gpgme_debug_end (&(hlp))
54 #elif 0
55 /* Only works in C99.  */
56 #define DEBUG0(fmt) \
57   _gpgme_debug (1, "%s:%s: " fmt, __FILE__, XSTRINGIFY (__LINE__))
58 #define DEBUG(fmt, ...) \
59   _gpgme_debug (1, "%s:%s: " fmt, __FILE__, XSTRINGIFY (__LINE__), __VA_ARGS__)
60 #define DEBUG_BEGIN(hlp, lvl, fmt) \
61   _gpgme_debug_begin (&(hlp), lvl, "%s:%s: " fmt, __FILE__, \
62                       XSTRINGIFY (__LINE__))
63 #define DEBUG_BEGINX(hlp, lvl, fmt, ...) \
64   _gpgme_debug_begin (&(hlp), lvl, "%s:%s: " fmt, __FILE__, \
65                       XSTRINGIFY (__LINE__), __VA_ARGS__)
66 #define DEBUG_ADD0(hlp, fmt) \
67   _gpgme_debug_add (&(hlp), fmt)
68 #define DEBUG_ADD(hlp, fmt, ...) \
69   _gpgme_debug_add (&(hlp), fmt, __VA_ARGS__)
70 #define DEBUG_END(hlp, fmt) \
71   _gpgme_debug_add (&(hlp), fmt); \
72   _gpgme_debug_end (&(hlp))
73 #define DEBUG_ENDX(hlp, fmt, ...) \
74   _gpgme_debug_add (&(hlp), fmt, __VA_ARGS__); \
75   _gpgme_debug_end (&(hlp))
76 #else
77 /* This finally works everywhere, horror.  */
78 #define DEBUG0(fmt) \
79   _gpgme_debug (1, "%s:%s: " fmt, __FILE__, XSTRINGIFY (__LINE__))
80 #define DEBUG1(fmt,a) \
81   _gpgme_debug (1, "%s:%s: " fmt, __FILE__, XSTRINGIFY (__LINE__), (a))
82 #define DEBUG2(fmt,a,b) \
83   _gpgme_debug (1, "%s:%s: " fmt, __FILE__, XSTRINGIFY (__LINE__), (a), (b))
84 #define DEBUG3(fmt,a,b,c) \
85   _gpgme_debug (1, "%s:%s: " fmt, __FILE__, XSTRINGIFY (__LINE__), (a), (b), \
86                 (c))
87 #define DEBUG4(fmt,a,b,c,d) \
88   _gpgme_debug (1, "%s:%s: " fmt, __FILE__, XSTRINGIFY (__LINE__), (a), (b), \
89                 (c), (d))
90 #define DEBUG5(fmt,a,b,c,d,e) \
91   _gpgme_debug (1, "%s:%s: " fmt, __FILE__, XSTRINGIFY (__LINE__), (a), (b), \
92                 (c), (d), (e))
93 #define DEBUG_BEGIN(hlp,lvl,fmt) \
94   _gpgme_debug_begin (&(hlp), lvl, "%s:%s: " fmt, __FILE__, XSTRINGIFY (__LINE__))
95 #define DEBUG_ADD0(hlp,fmt) \
96   _gpgme_debug_add (&(hlp), fmt)
97 #define DEBUG_ADD1(hlp,fmt,a) \
98   _gpgme_debug_add (&(hlp), fmt, (a))
99 #define DEBUG_ADD2(hlp,fmt,a,b) \
100   _gpgme_debug_add (&(hlp), fmt, (a), (b))
101 #define DEBUG_ADD3(hlp,fmt,a,b,c) \
102   _gpgme_debug_add (&(hlp), fmt, (a), (b), (c))
103 #define DEBUG_END(hlp,fmt) \
104   _gpgme_debug_add (&(hlp), fmt); \
105   _gpgme_debug_end (&(hlp))
106 #endif
107
108 #define DEBUG_ENABLED(hlp) (!!(hlp))
109
110 #endif  /* DEBUG_H */