From 20a736e41510ea3deb00e93541490a94d23cdb6c Mon Sep 17 00:00:00 2001 From: Martin Ebourne Date: Fri, 3 Feb 2006 00:44:12 +0000 Subject: Beef up configure checks for 64 bit endian swapping function. NOTE: Needs testing on other platforms, especially BSD. --- configure.ac | 6 +++-- infrastructure/m4/ax_bswap64.m4 | 52 +++++++++++++++++++++++++++++++++++++++++ infrastructure/makebuildenv.pl | 4 ++-- lib/common/Box.h | 20 +++++++--------- 4 files changed, 67 insertions(+), 15 deletions(-) create mode 100644 infrastructure/m4/ax_bswap64.m4 diff --git a/configure.ac b/configure.ac index a9b820c2..4f2c7ea5 100644 --- a/configure.ac +++ b/configure.ac @@ -77,9 +77,8 @@ AC_HEADER_DIRENT AC_HEADER_STDC AC_HEADER_SYS_WAIT AC_CHECK_HEADERS([execinfo.h regex.h signal.h syslog.h time.h]) -AC_CHECK_HEADERS([asm/byteorder.h]) AC_CHECK_HEADERS([netinet/in.h]) -AC_CHECK_HEADERS([sys/endian.h sys/param.h sys/types.h sys/wait.h sys/xattr.h sys/time.h]) +AC_CHECK_HEADERS([sys/param.h sys/types.h sys/wait.h sys/xattr.h sys/time.h]) ### Checks for typedefs, structures, and compiler characteristics. @@ -109,6 +108,9 @@ AX_CHECK_DIRENT_D_TYPE AC_SYS_LARGEFILE AX_CHECK_LLONG_MINMAX AX_CHECK_DEFINE_PRAGMA +if test "x$ac_cv_c_bigendian" != "xyes"; then + AX_BSWAP64 +fi if test "$target_os" != "mingw32"; then AX_RANDOM_DEVICE fi diff --git a/infrastructure/m4/ax_bswap64.m4 b/infrastructure/m4/ax_bswap64.m4 new file mode 100644 index 00000000..9bfc84fc --- /dev/null +++ b/infrastructure/m4/ax_bswap64.m4 @@ -0,0 +1,52 @@ +dnl @synopsis AX_BSWAP64 +dnl +dnl This macro will check for a built in way of endian reversing an int64_t. +dnl If one is found then HAVE_BSWAP64 is set to 1 and BSWAP64 will be defined +dnl to the name of the endian swap function. +dnl +dnl @category C +dnl @author Martin Ebourne +dnl @version 2006/02/02 +dnl @license AllPermissive + +AC_DEFUN([AX_BSWAP64], [ + bswap64_function="" + AC_CHECK_HEADERS([sys/endian.h asm/byteorder.h]) + if test "x$ac_cv_header_sys_endian_h" = "xyes"; then + AC_CACHE_CHECK([for htobe64], [have_htobe64], + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + $ac_includes_default + #include + ]], [[ + htobe64(0); + return 1; + ]])], + [have_htobe64=yes], [have_htobe64=no] + )]) + if test "x$have_htobe64" = "xyes"; then + bswap64_function=htobe64 + fi + fi + if test "x$bswap64_function" = "x" && \ + test "x$ac_cv_header_asm_byteorder_h" = "xyes"; then + AC_CACHE_CHECK([for __cpu_to_be64], [have___cpu_to_be64], + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + $ac_includes_default + #include + ]], [[ + __cpu_to_be64(0); + return 1; + ]])], + [have___cpu_to_be64=yes], [have___cpu_to_be64=no] + )]) + if test "x$have___cpu_to_be64" = "xyes"; then + bswap64_function=__cpu_to_be64 + fi + fi + + if test "x$bswap64_function" != "x"; then + AC_DEFINE([HAVE_BSWAP64], 1, + [Define to 1 if BSWAP64 is defined to the name of a valid 64 bit endian swapping function]) + AC_DEFINE_UNQUOTED([BSWAP64], [$bswap64_function], [Name of the 64 bit endian swapping function]) + fi + ])dnl diff --git a/infrastructure/makebuildenv.pl b/infrastructure/makebuildenv.pl index 2cecc00d..7ce2e138 100755 --- a/infrastructure/makebuildenv.pl +++ b/infrastructure/makebuildenv.pl @@ -350,8 +350,8 @@ for my $mod (@modules, $implicit_dep) { opendir DIR,$mod; for my $h (grep /\.h\Z/i, readdir DIR) - { - next if /\A\._/; # Temp Mac OS Resource hack + { + next if $h =~ /\A\./; # Ignore Mac resource forks, autosaves, etc open FL,"$mod/$h" or die "can't open $mod/$h"; my $f; diff --git a/lib/common/Box.h b/lib/common/Box.h index c988e296..eb33673c 100644 --- a/lib/common/Box.h +++ b/lib/common/Box.h @@ -134,21 +134,19 @@ inline uint64_t box_swap64(uint64_t x) #ifdef WORDS_BIGENDIAN #define box_hton64(x) (x) #define box_ntoh64(x) (x) -#else +#elif defined(HAVE_BSWAP64) #ifdef HAVE_SYS_ENDIAN_H #include - // betoh64 (OpenBSD) is sometimes called be64toh (FreeBSD, NetBSD). - // Rather than check for it just reuse htobe64 since they are symmetrical - #define box_hton64(x) htobe64(x) - #define box_ntoh64(x) htobe64(x) - #elif HAVE_ASM_BYTEORDER_H + #endif + #ifdef HAVE_ASM_BYTEORDER_H #include - #define box_hton64(x) __cpu_to_be64(x) - #define box_ntoh64(x) __be64_to_cpu(x) - #else - #define box_hton64(x) box_swap64(x) - #define box_ntoh64(x) box_swap64(x) #endif + + #define box_hton64(x) BSWAP64(x) + #define box_ntoh64(x) BSWAP64(x) +#else + #define box_hton64(x) box_swap64(x) + #define box_ntoh64(x) box_swap64(x) #endif #endif // BOX__H -- cgit v1.2.3