Browse Source

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

svn:r2894
Nick Mathewson 21 years ago
parent
commit
5b668d8557
2 changed files with 21 additions and 1 deletions
  1. 13 0
      src/common/log.c
  2. 8 1
      src/common/log.h

+ 13 - 0
src/common/log.c

@@ -203,7 +203,9 @@ void _log(int severity, const char *format, ...)
   va_end(ap);
   va_end(ap);
 }
 }
 
 
+
 /** Output a message to the log, prefixed with a function name <b>fn</b>. */
 /** 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, ...)
 void _log_fn(int severity, const char *fn, const char *format, ...)
 {
 {
   va_list ap;
   va_list ap;
@@ -211,6 +213,17 @@ void _log_fn(int severity, const char *fn, const char *format, ...)
   logv(severity, fn, format, ap);
   logv(severity, fn, format, ap);
   va_end(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. */
 /** Close all open log files. */
 void close_logs()
 void close_logs()

+ 8 - 1
src/common/log.h

@@ -81,7 +81,14 @@ void _log_fn(int severity, const char *funcname, const char *format, ...)
 #define log_fn(severity, args...) \
 #define log_fn(severity, args...) \
   _log_fn(severity, __PRETTY_FUNCTION__, args)
   _log_fn(severity, __PRETTY_FUNCTION__, args)
 #else
 #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
 #endif
 #define log _log /* hack it so we don't conflict with log() as much */
 #define log _log /* hack it so we don't conflict with log() as much */