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
This commit is contained in:
Nick Mathewson 2006-03-13 00:25:36 +00:00
parent bd8ffccae7
commit 0c132ee2a1
4 changed files with 73 additions and 19 deletions

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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