From: david Date: Tue, 26 Nov 2013 13:07:37 +0000 (+2000) Subject: [PATCH] util: detect byte order X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=33951c202e7609fb25ce30600c14082c1d9b6da3;p=notmuch-archives.git [PATCH] util: detect byte order --- diff --git a/9a/12608fc04c03bfe3b2974eae07e2eae5f34cdd b/9a/12608fc04c03bfe3b2974eae07e2eae5f34cdd new file mode 100644 index 000000000..3207ed88c --- /dev/null +++ b/9a/12608fc04c03bfe3b2974eae07e2eae5f34cdd @@ -0,0 +1,211 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by olra.theworths.org (Postfix) with ESMTP id 27627431FBF + for ; Tue, 26 Nov 2013 05:08:04 -0800 (PST) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: 0 +X-Spam-Level: +X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[none] + autolearn=disabled +Received: from olra.theworths.org ([127.0.0.1]) + by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id KfU3jAf6E6Ep for ; + Tue, 26 Nov 2013 05:07:56 -0800 (PST) +Received: from yantan.tethera.net (yantan.tethera.net [199.188.72.155]) + (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) + (No client certificate requested) + by olra.theworths.org (Postfix) with ESMTPS id 33642431FB6 + for ; Tue, 26 Nov 2013 05:07:56 -0800 (PST) +Received: from remotemail by yantan.tethera.net with local (Exim 4.80) + (envelope-from ) + id 1VlIMq-0008Tq-Kw; Tue, 26 Nov 2013 09:07:52 -0400 +Received: (nullmailer pid 31884 invoked by uid 1000); Tue, 26 Nov 2013 + 13:07:48 -0000 +From: david@tethera.net +To: notmuch@notmuchmail.org +Subject: [PATCH] util: detect byte order +Date: Tue, 26 Nov 2013 09:07:37 -0400 +Message-Id: <1385471257-31835-1-git-send-email-david@tethera.net> +X-Mailer: git-send-email 1.8.4.2 +In-Reply-To: <1385328583-24602-2-git-send-email-david@tethera.net> +References: <1385328583-24602-2-git-send-email-david@tethera.net> +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.13 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Tue, 26 Nov 2013 13:08:04 -0000 + +From: David Bremner + +Unfortunately old versions of GCC and clang do not provide byte order +macros, so we re-invent them. + +If UTIL_BYTE_ORDER is not defined, we fall back to macros supported by +recent versions of GCC and clang +--- + +I pushed the series +id:1385328583-24602-1-git-send-email-david@tethera.net; unfortunately +that broke compilation on old versions of GCC, in particular on our +buildbot. Here is a proposed fix for the fix. + + configure | 26 ++++++++++++++++++++++++-- + lib/libsha1.c | 19 +++++-------------- + util/endian-util.h | 39 +++++++++++++++++++++++++++++++++++++++ + 3 files changed, 68 insertions(+), 16 deletions(-) + create mode 100644 util/endian-util.h + +diff --git a/configure b/configure +index 1a8e939..02d6396 100755 +--- a/configure ++++ b/configure +@@ -441,6 +441,21 @@ else + EOF + fi + ++printf "Checking byte order... " ++cat> _byteorder.c < ++#include ++#include ++uint32_t test = 0x31323334; ++char buf[5]; ++int main() { memcpy(buf, &test, 4); buf[4] = '\0'; printf("%s\n", buf); return 0; } ++EOF ++${CC} ${CFLAGS} _byteorder.c -o _byteorder > /dev/null 2>&1 ++util_byte_order=$(./_byteorder) ++echo $util_byte_order ++ ++#rm -f _byteorder _byteorder.c ++ + if [ $errors -gt 0 ]; then + cat < /* for memcpy() etc. */ +- ++#include "endian-util.h" + #include "libsha1.h" + + #if defined(__cplusplus) +@@ -49,20 +49,11 @@ extern "C" + + #define bswap_32(x) ((rotr32((x), 24) & 0x00ff00ff) | (rotr32((x), 8) & 0xff00ff00)) + +-/* The macros __BYTE_ORDER__ and __ORDER_*_ENDIAN__ are GNU C +- * extensions. They are also supported by clang as of v3.2 */ +- +-#ifdef __BYTE_ORDER__ +-# if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +-# define bsw_32(p,n) \ +- { int _i = (n); while(_i--) ((uint32_t*)p)[_i] = bswap_32(((uint32_t*)p)[_i]); } +-# elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +-# define bsw_32(p,n) +-# else +-# error "unknown byte order" +-# endif ++#if (UTIL_BYTE_ORDER == UTIL_ORDER_LITTLE_ENDIAN) ++# define bsw_32(p,n) \ ++ { int _i = (n); while(_i--) ((uint32_t*)p)[_i] = bswap_32(((uint32_t*)p)[_i]); } + #else +-# error "macro __BYTE_ORDER__ is not defined" ++# define bsw_32(p,n) + #endif + + #define SHA1_MASK (SHA1_BLOCK_SIZE - 1) +diff --git a/util/endian-util.h b/util/endian-util.h +new file mode 100644 +index 0000000..cbecf66 +--- /dev/null ++++ b/util/endian-util.h +@@ -0,0 +1,39 @@ ++/* this file mimics the macros present in recent GCC and CLANG */ ++ ++#ifndef _ENDIAN_UTIL_H ++#define _ENDIAN_UTIL_H ++ ++/* This are prefixed with UTIL to avoid collisions ++ * ++ * You can use something like the following to define UTIL_BYTE_ORDER ++ * in a configure script. ++ */ ++#if 0 ++#include ++#include ++#include ++uint32_t test = 0x31323334; ++char buf[5]; ++int main() { memcpy(buf, &test, 4); buf[4] = '\0'; printf("%s\n", buf); return 0; } ++#endif ++ ++#define UTIL_ORDER_LITTLE_ENDIAN 4321 ++#define UTIL_ORDER_BIG_ENDIAN 1234 ++ ++ ++#if !defined(UTIL_BYTE_ORDER) || ((UTIL_BYTE_ORDER != UTIL_ORDER_LITTLE_ENDIAN) && \ ++ (UTIL_BYTE_ORDER != UTIL_ORDER_LITTLE_ENDIAN)) ++#ifdef __BYTE_ORDER__ ++# if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) ++# define UTIL_BYTE_ORDER UTIL_ORDER_LITTLE_ENDIAN ++# elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) ++# define UTIL_BYTE_ORDER UTIL_ORDER_BIG_ENDIAN ++# else ++# error "Unsupported __BYTE_ORDER__" ++# endif ++#else ++# error "UTIL_BYTE_ORDER not correctly defined and __BYTE_ORDER__ not defined." ++#endif ++#endif ++ ++#endif +-- +1.8.4.2 +