ugly macros to make log_fn play nice on non-GCC compilers.

svn:r2894
This commit is contained in:
Nick Mathewson 2004-11-15 21:18:07 +00:00
parent 7a8ac5dfef
commit 5b668d8557
2 changed files with 21 additions and 1 deletions

View File

@ -203,7 +203,9 @@ void _log(int severity, const char *format, ...)
va_end(ap);
}
/** Output a message to the log, prefixed with a function name <b>fn</b>. */
#ifdef __GNUC__
void _log_fn(int severity, const char *fn, const char *format, ...)
{
va_list ap;
@ -211,6 +213,17 @@ void _log_fn(int severity, const char *fn, const char *format, ...)
logv(severity, fn, format, ap);
va_end(ap);
}
#else
const char *_log_fn_function_name=NULL;
void _log_fn(int severity, const char *format, ...)
{
va_list ap;
va_start(ap,format);
logv(severity, _log_fn_function_name, format, ap);
va_end(ap);
_log_fn_function_name = NULL;
}
#endif
/** Close all open log files. */
void close_logs()

View File

@ -81,7 +81,14 @@ void _log_fn(int severity, const char *funcname, const char *format, ...)
#define log_fn(severity, args...) \
_log_fn(severity, __PRETTY_FUNCTION__, args)
#else
#define log_fn _log
/* We don't have GCC's varargs macros, so use a global variable to pass the
* function name to log_fn */
extern const char *_log_fn_function_name;
void _log_fn(int severity, const char *format, ...);
/* We abuse the comma operator here, since we can't use the standard
* do {...} while(0) trick to wrap this macro, since the macro can't take
* arguments. */
#define log_fn (_log_fn_function_name=__FUNCTION__),_log_fn
#endif
#define log _log /* hack it so we don't conflict with log() as much */