Make debug macros variadic to include category
[gpgol.git] / src / debug.h
1 #ifndef DEBUG_H
2 #define DEBUG_H
3 /* debug.h - Debugging / Log helpers for GpgOL
4  * Copyright (C) 2018 by by Intevation GmbH
5  *
6  * This file is part of GpgOL.
7  *
8  * GpgOL is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public License
10  * as published by the Free Software Foundation; either version 2.1
11  * of the License, or (at your option) any later version.
12  *
13  * GpgOL is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this program; if not, see <http://www.gnu.org/licenses/>.
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #ifdef __cplusplus
27 extern "C" {
28 #if 0
29 }
30 #endif
31 #endif
32
33 /* Bit values used for extra log file verbosity.  Value 1 is reserved
34    to enable debug menu options.
35
36    Note that the high values here are used for compatibility with
37    old howtos of how to enable debug flags. Based on the old
38    very split up logging categories.
39
40    Categories are meant to be:
41
42    DBG -> Generally useful information.
43    DBG_MEMORY -> Very verbose tracing of Releases / Allocs / Refs.
44    DBG_OOM -> Outlook Object Model events tracing.
45    DBG_DATA -> Including potentially private data and mime parser logging.
46
47    Common values are:
48    32 -> Only memory debugging.
49    544 -> OOM and Memory.
50    800 -> Full debugging.
51    */
52 #define DBG_MEMORY         (1<<5) // 32
53 #define DBG_MIME_PARSER    (1<<7) // 128 Unified as DBG_DATA
54 #define DBG_MIME_DATA      (1<<8) // 256 Unified as DBG_DATA
55 #define DBG_DATA           (DBG_MIME_PARSER | DBG_MIME_DATA)
56 #define DBG_OOM_VAL        (1<<9) // 512 Unified as DBG_OOM
57 #define DBG_OOM_EXTRA      (1<<10)// 1024 Unified as DBG_OOM
58 #define DBG_SUPERTRACE     (1<<11)// 2048 Very verbose tracing.
59 #define DBG_OOM            (DBG_OOM_VAL | DBG_OOM_EXTRA)
60
61 #define debug_oom        ((opt.enable_debug & DBG_OOM) || \
62                           (opt.enable_debug & DBG_OOM_EXTRA))
63 #define debug_oom_extra  (opt.enable_debug & DBG_OOM_EXTRA)
64 void log_debug (const char *fmt, ...) __attribute__ ((format (printf,1,2)));
65 void log_error (const char *fmt, ...) __attribute__ ((format (printf,1,2)));
66 void log_vdebug (const char *fmt, va_list a);
67 void log_debug_w32 (int w32err, const char *fmt,
68                     ...) __attribute__ ((format (printf,2,3)));
69 void log_error_w32 (int w32err, const char *fmt,
70                     ...) __attribute__ ((format (printf,2,3)));
71 void log_hexdump (const void *buf, size_t buflen, const char *fmt,
72                   ...)  __attribute__ ((format (printf,3,4)));
73
74 const char *anonstr (const char *data);
75 #define log_oom(format, ...) if ((opt.enable_debug & DBG_OOM)) \
76   log_debug("DBG_OOM/" format, ##__VA_ARGS__)
77
78 #define log_data(format, ...) if ((opt.enable_debug & DBG_DATA)) \
79   log_debug("DBG_DATA/" format, ##__VA_ARGS__)
80
81 #define log_memory(format, ...) if ((opt.enable_debug & DBG_MEMORY)) \
82   log_debug("DBG_MEM/" format, ##__VA_ARGS__)
83
84 #define gpgol_release(X) \
85 { \
86   if (X && opt.enable_debug & DBG_MEMORY) \
87     { \
88       log_memory ("%s:%s:%i: Object: %p released ref: %lu \n", \
89                   SRCNAME, __func__, __LINE__, X, X->Release()); \
90       memdbg_released (X); \
91     } \
92   else if (X) \
93     { \
94       X->Release(); \
95     } \
96 }
97
98 const char *log_srcname (const char *s);
99 #define SRCNAME log_srcname (__FILE__)
100
101 #define TRACEPOINT log_debug ("%s:%s:%d: tracepoint\n", \
102                               SRCNAME, __func__, __LINE__);
103 #define TSTART if (opt.enable_debug & DBG_SUPERTRACE) \
104                     log_debug ("%s:%s: enter\n", SRCNAME, __func__);
105 #define TRETURN(X) if (opt.enable_debug & DBG_SUPERTRACE) \
106                         log_debug ("%s:%s:%d: return\n", SRCNAME, __func__, \
107                                    __LINE__); \
108                    return X
109
110
111 const char *get_log_file (void);
112 void set_log_file (const char *name);
113
114 #ifdef _WIN64
115 #define SIZE_T_FORMAT "%I64u"
116 #else
117 # ifdef HAVE_W32_SYSTEM
118 #  define SIZE_T_FORMAT "%u"
119 # else
120 #  define SIZE_T_FORMAT "%lu"
121 # endif
122 #endif
123
124 #ifdef __cplusplus
125 }
126 #endif
127
128 #endif // DEBUG_H