diff options
author | Werner Koch <[email protected]> | 2018-11-16 15:25:49 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2018-11-16 15:25:49 +0000 |
commit | 5857491a2aa7d4975100d90f1ad62c08aa345e3e (patch) | |
tree | c433d2da27e7b9f98ca783e15b00087f2ce3d6cd /src/debug.c | |
parent | Add SPDX identifiers to most source files (diff) | |
download | gpgme-5857491a2aa7d4975100d90f1ad62c08aa345e3e.tar.gz gpgme-5857491a2aa7d4975100d90f1ad62c08aa345e3e.zip |
core: Simplify the trace maros by using variadics.
* src/debug.h (TRACE_BEG, TRACE_LOG, TRACE_SUC): Use variadic macros
and remove the TRACE_BEG1 et al. Change all users to always pass a
format string.
(TRACE): Ditto.
* src/debug.c (_gpgme_debugf): New.
* configure.ac <GCC>: Add -Wno-format-zero-length.
--
This makes it easier for use to enable format checks. The zero-length
format is required to allow for an empty format due to the comman
problematic of __VA_ARGS__.
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to '')
-rw-r--r-- | src/debug.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/debug.c b/src/debug.c index 364a5767..a2f0e694 100644 --- a/src/debug.c +++ b/src/debug.c @@ -282,6 +282,91 @@ _gpgme_debug (int level, const char *format, ...) return 0; } +/* Log the formatted string FORMAT prefixed with additional info + * depending on MODE: + * + * -1 = Do not print any additional args. + * 0 = standalone (used by macro TRACE) + * 1 = enter a function (used by macro TRACE_BEG) + * 2 = debug a function (used by macro TRACE_LOG) + * 3 = leave a function (used by macro TRACE_SUC) + * + * Returns: 0 + * + * Note that we always return 0 because the old TRACE macro evaluated + * to 0 which issues a warning with newer gcc version about an unused + * values. By using a return value of this function this can be + * avoided. Fixme: It might be useful to check whether the return + * value from the TRACE macros are actually used somewhere. + */ +int +_gpgme_debugf (int level, int mode, const char *func, const char *tagname, + const char *tagvalue, const char *format, ...) +{ + va_list arg_ptr; + int saved_errno; + + saved_errno = errno; + if (debug_level < level) + return 0; + + va_start (arg_ptr, format); + LOCK (debug_lock); + { + struct tm *tp; + time_t atime = time (NULL); + + tp = localtime (&atime); + fprintf (errfp, "GPGME %04d-%02d-%02d %02d:%02d:%02d <0x%04llx> ", + 1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday, + tp->tm_hour, tp->tm_min, tp->tm_sec, + (unsigned long long) ath_self ()); + } +#ifdef FRAME_NR + { + int indent; + + indent = frame_nr > 0? (2 * (frame_nr - 1)):0; + fprintf (errfp, "%*s", indent < 40? indent : 40, ""); + } +#endif + + switch (mode) + { + case -1: /* Do nothing. */ + break; + case 0: + fprintf (errfp, "%s: call: %s=%p ", func, tagname, tagvalue); + break; + case 1: + fprintf (errfp, "%s: enter: %s=%p ", func, tagname, tagvalue); + break; + case 2: + fprintf (errfp, "%s: check: %s=%p ", func, tagname, tagvalue); + break; + case 3: + if (tagname) + fprintf (errfp, "%s: leave: %s=%p ", func, tagname, tagvalue); + else + fprintf (errfp, "%s: leave: ", func); + break; + default: + fprintf (errfp, "%s: m=%d: %s=%p ", func, mode, tagname, tagvalue); + break; + } + + vfprintf (errfp, format, arg_ptr); + va_end (arg_ptr); + if(format && *format && format[strlen (format) - 1] != '\n') + putc ('\n', errfp); + UNLOCK (debug_lock); + fflush (errfp); + + gpg_err_set_errno (saved_errno); + return 0; +} + + /* Start a new debug line in *LINE, logged at level LEVEL or higher, and starting with the formatted string FORMAT. */ |