Преглед изворни кода

Instead of listing a set of compilers that prefers __func__ to __FUNCTION__, use autoconf. Also, prefer __func__ in our own code: __func__ is a C99 standard, whereas __FUNCTION__ is not. [Fixes bug 254.]

svn:r6144
Nick Mathewson пре 18 година
родитељ
комит
0c132ee2a1
4 измењених фајлова са 73 додато и 19 уклоњено
  1. 39 0
      configure.in
  2. 20 5
      src/common/compat.h
  3. 12 12
      src/common/log.h
  4. 2 2
      src/common/util.h

+ 39 - 0
configure.in

@@ -491,6 +491,45 @@ AC_CHECK_FUNC(gethostbyname_r, [
  CFLAGS=$OLD_CFLAGS
 ])
 
+AC_CACHE_CHECK([whether the C compiler supports __func__],
+  ac_cv_have_func_macro,
+  AC_COMPILE_IFELSE([
+#include <stdio.h>
+int main(int c, char **v) { puts(__func__); }],
+  ac_cv_have_func_macro=yes,
+  ac_cv_have_func_macro=no))
+
+AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
+  ac_cv_have_FUNC_macro,
+  AC_COMPILE_IFELSE([
+#include <stdio.h>
+int main(int c, char **v) { puts(__FUNC__); }],
+  ac_cv_have_FUNC_macro=yes,
+  ac_cv_have_FUNC_macro=no))
+
+AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
+  ac_cv_have_FUNCTION_macro,
+  AC_COMPILE_IFELSE([
+#include <stdio.h>
+int main(int c, char **v) { puts(__FUNCTION__); }],
+  ac_cv_have_FUNCTION_macro=yes,
+  ac_cv_have_FUNCTION_macro=no))
+
+if test $ac_cv_have_func_macro = 'yes'; then
+  AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
+fi
+
+
+if test $ac_cv_have_FUNC_macro = 'yes'; then
+  AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
+fi
+
+if test $ac_cv_have_FUNCTION_macro = 'yes'; then
+  AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
+           [Defined if the compiler supports __FUNCTION__])
+fi
+
+
 # $prefix stores the value of the --prefix command line option, or
 # NONE if the option wasn't set.  In the case that it wasn't set, make
 # it be the default, so that we can use it to expand directories now.

+ 20 - 5
src/common/compat.h

@@ -52,14 +52,29 @@
 #define INLINE inline
 #endif
 
-/* Windows compilers before VC7 don't have __FUNCTION__. */
-#if defined(_MSC_VER) && _MSC_VER < 1300
-#define __FUNCTION__ "???"
+/* Try to get a reasonable __func__ substitute in place. */
+#if defined(_MSC_VER)
+/* MSVC compilers before VC7 don't have __func__ at all; later ones call it
+ * __FUNCTION__. */
+#if _MSC_VER < 1300
+#define __func__ "???"
+#else
+#define __func__ __FUNCTION__
 #endif
 
-#if defined(__sgi) && !defined(__GNUC__) && defined(__c99)
-#define __FUNCTION__ __func__
+#else
+/* For platforms where autoconf works, make sure __func__ is defined
+ * sanely. */
+#ifndef HAVE_MACRO__func__
+#ifdef HAVE_MACRO__FUNCTION__
+#define __func__ __FUNCTION__
+#elif HAVE_MACRO__FUNC__
+#define __func__ __FUNC__
+#else
+#define __func__ "???"
 #endif
+#endif /* ifndef MAVE_MACRO__func__ */
+#endif /* if(not windows) */
 
 /* ===== String compatibility */
 #ifdef MS_WINDOWS

+ 12 - 12
src/common/log.h

@@ -149,7 +149,7 @@ void _log_warn(uint32_t domain, const char *format, ...);
 void _log_err(uint32_t domain, const char *format, ...);
 
 #if defined(_MSC_VER) && _MSC_VER < 1300
-/* MSVC 6 and earlier don't have __FUNCTION__, or even __LINE__. */
+/* MSVC 6 and earlier don't have __func__, or even __LINE__. */
 #define log_fn _log_fn
 #define log_debug _log_debug
 #define log_info _log_info
@@ -170,18 +170,18 @@ extern const char *_log_fn_function_name;
 /* 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
-#define log_debug (_log_fn_function_name=__FUNCTION__),_log_debug
-#define log_info (_log_fn_function_name=__FUNCTION__),_log_info
-#define log_notice (_log_fn_function_name=__FUNCTION__),_log_notice
-#define log_warn (_log_fn_function_name=__FUNCTION__),_log_warn
-#define log_err (_log_fn_function_name=__FUNCTION__),_log_err
+#define log_fn (_log_fn_function_name=__func__),_log_fn
+#define log_debug (_log_fn_function_name=__func__),_log_debug
+#define log_info (_log_fn_function_name=__func__),_log_info
+#define log_notice (_log_fn_function_name=__func__),_log_notice
+#define log_warn (_log_fn_function_name=__func__),_log_warn
+#define log_err (_log_fn_function_name=__func__),_log_err
 /*
-#define debug (_log_fn_function_name=__FUNCTION__),_debug
-#define info (_log_fn_function_name=__FUNCTION__),_info
-#define notice (_log_fn_function_name=__FUNCTION__),_notice
-#define warn (_log_fn_function_name=__FUNCTION__),_warn
-#define err (_log_fn_function_name=__FUNCTION__),_err
+#define debug (_log_fn_function_name=__func__),_debug
+#define info (_log_fn_function_name=__func__),_info
+#define notice (_log_fn_function_name=__func__),_notice
+#define warn (_log_fn_function_name=__func__),_warn
+#define err (_log_fn_function_name=__func__),_err
 */
 #endif
 

+ 2 - 2
src/common/util.h

@@ -41,9 +41,9 @@
 #define tor_assert(expr) do {                                           \
     if (!(expr)) {                                                      \
       log(LOG_ERR, LD_BUG, "%s:%d: %s: Assertion %s failed; aborting.", \
-          _SHORT_FILE_, __LINE__, __FUNCTION__, #expr);                 \
+          _SHORT_FILE_, __LINE__, __func__, #expr);                 \
       fprintf(stderr,"%s:%d %s: Assertion %s failed; aborting.\n",      \
-              _SHORT_FILE_, __LINE__, __FUNCTION__, #expr);             \
+              _SHORT_FILE_, __LINE__, __func__, #expr);             \
       abort();                                                          \
     } } while (0)
 #endif