From 4ac1bf2d472a41726e75c49f79bfb6321e09c63c Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Fri, 16 Mar 2018 23:02:07 +0100 Subject: [PATCH] clean up byte order detection Check for existence of the expected functions and macros and error out if nothing appropriate can be found. --- nominatim/CMakeLists.txt | 18 +++++++++--------- nominatim/postgresql.h | 26 +++++++++++++++++++------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/nominatim/CMakeLists.txt b/nominatim/CMakeLists.txt index 726ec4cc..b391a342 100644 --- a/nominatim/CMakeLists.txt +++ b/nominatim/CMakeLists.txt @@ -1,12 +1,12 @@ add_executable(nominatim export.c geometry.cpp import.c index.c input.c nominatim.c postgresql.c sprompt.c) -include(CheckIncludeFile) -CHECK_INCLUDE_FILE(byteswap.h HAVE_BYTESWAP_H) -CHECK_INCLUDE_FILE(sys/endian.h HAVE_SYS_ENDIAN_H) -if(HAVE_BYTESWAP_H) - target_compile_definitions(nominatim PRIVATE HAVE_BYTESWAP_H) -endif(HAVE_BYTESWAP_H) -if(HAVE_SYS_ENDIAN_H) - target_compile_definitions(nominatim PRIVATE HAVE_SYS_ENDIAN_H) -endif(HAVE_SYS_ENDIAN_H) + +CHECK_SYMBOL_EXISTS(bswap_32 "byteswap.h" HAVE_BYTESWAP) +CHECK_SYMBOL_EXISTS(bswap32 "sys/endian.h" HAVE_SYS_ENDIAN) + +target_compile_definitions(nominatim + PRIVATE HAVE_BYTESWAP=$ + PRIVATE HAVE_SYS_ENDIAN=$ +) + target_link_libraries(nominatim ${LIBXML2_LIBRARIES} ${ZLIB_LIBRARIES} ${BZIP2_LIBRARIES} ${PostgreSQL_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) diff --git a/nominatim/postgresql.h b/nominatim/postgresql.h index 7050fca4..f30e7308 100644 --- a/nominatim/postgresql.h +++ b/nominatim/postgresql.h @@ -7,20 +7,32 @@ #define PG_OID_INT8 20 #define PG_OID_INT4 23 -#if defined(HAVE_BYTESWAP_H) +#if HAVE_BYTESWAP #include -#elif defined(HAVE_SYS_ENDIAN_H) +#define PG_BSWAP32(x) bswap_32(x) +#define PG_BSWAP64(x) bswap_64(x) +#elif HAVE_SYS_ENDIAN #include +#define PG_BSWAP32(x) bswap32(x) +#define PG_BSWAP64(x) bswap64(x) +#else +#error "No appropriate byteswap found for your system." #endif -#if __BYTE_ORDER == __BIG_ENDIAN -#define PGint16(x) (x) +#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +#define PGint32(x) (x) +#define PGint64(x) (x) +#elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +#define PGint32(x) PG_BSWAP32(x) +#define PGint64(x) PG_BSWAP64(x) +#elif defined(_BYTE_ORDER) && (_BYTE_ORDER == _BIG_ENDIAN) #define PGint32(x) (x) #define PGint64(x) (x) +#elif defined(_BYTE_ORDER) && (_BYTE_ORDER == _LITTLE_ENDIAN) +#define PGint32(x) PG_BSWAP32(x) +#define PGint64(x) PG_BSWAP64(x) #else -#define PGint16(x) __bswap_16 (x) -#define PGint32(x) __bswap_32 (x) -#define PGint64(x) __bswap_64 (x) +#error "Cannot determine byte order." #endif const char *build_conninfo(const char *db, const char *username, const char *password, const char *host, const char *port); -- 2.39.5