2005-09-12 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / debug.h
1 /* debug.h - interface to debugging functions
2    Copyright (C) 2002, 2004 g10 Code GmbH
3  
4    This file is part of GPGME.
5
6    GPGME is free software; you can redistribute it and/or modify it
7    under the terms of the GNU Lesser General Public License as
8    published by the Free Software Foundation; either version 2.1 of
9    the License, or (at your option) any later version.
10    
11    GPGME is distributed in the hope that it will be useful, but
12    WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15    
16    You should have received a copy of the GNU Lesser General Public
17    License along with this program; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19    02111-1307, USA.  */
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 */