summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2009-02-09 22:51:27 +0000
committerMike Frysinger <vapier@gentoo.org>2009-02-09 22:51:27 +0000
commit14fd4a3a31fc736f125c8cfd7fa827a310712135 (patch)
treede6fcd07e83b1301bb5bce9b04f88a026b458354 /utils
parent32242e7e10276157533def1c92c4c720945510fc (diff)
unify byte order cruft in bswap.h and porting.h and add a bswap_64() replacement
Diffstat (limited to 'utils')
-rw-r--r--utils/bswap.h52
-rw-r--r--utils/porting.h20
2 files changed, 33 insertions, 39 deletions
diff --git a/utils/bswap.h b/utils/bswap.h
index 666b80a73..0047e4e98 100644
--- a/utils/bswap.h
+++ b/utils/bswap.h
@@ -6,40 +6,6 @@
#ifndef _BSWAP_H
#define _BSWAP_H 1
-#if !defined(__BYTE_ORDER) && defined(BYTE_ORDER)
-# define __BYTE_ORDER BYTE_ORDER
-# if !defined(__BIG_ENDIAN) && defined(BIG_ENDIAN)
-# define __BIG_ENDIAN BIG_ENDIAN
-# endif
-# if !defined(__LITTLE_ENDIAN) && defined(LITTLE_ENDIAN)
-# define __LITTLE_ENDIAN LITTLE_ENDIAN
-# endif
-#endif
-
-#ifndef __BYTE_ORDER
-# ifdef __linux__
-# include <endian.h>
-# else
-# define __LITTLE_ENDIAN 1234 /* least-significant byte first (vax, pc) */
-# define __BIG_ENDIAN 4321 /* most-significant byte first (IBM, net) */
-# define __PDP_ENDIAN 3412 /* LSB first in word, MSW first in long (pdp) */
-
-# if defined(sun386) || defined(i386) || defined(__LITTLE_ENDIAN__)
-# define __BYTE_ORDER __LITTLE_ENDIAN
-# endif
-
-# if defined(sparc) || defined(__BIG_ENDIAN__)
-# define __BYTE_ORDER __BIG_ENDIAN
-# endif
-
-# endif /* __linux__ */
-#endif /* __BYTE_ORDER */
-
-
-#ifndef __BYTE_ORDER
-# error "Undefined __BYTE_ORDER"
-#endif
-
#ifdef __linux__
# include <byteswap.h>
#else
@@ -56,6 +22,24 @@ static __inline__ uint32_t bswap_32(uint32_t x)
(((x) & 0x0000ff00) << 8) | \
(((x) & 0x000000ff) << 24));
}
+static __inline__ uint64_t bswap_64(uint64_t x)
+{
+#define _uswap_64(x, sfx) \
+ return ((((x) & 0xff00000000000000##sfx) >> 56) | \
+ (((x) & 0x00ff000000000000##sfx) >> 40) | \
+ (((x) & 0x0000ff0000000000##sfx) >> 24) | \
+ (((x) & 0x000000ff00000000##sfx) >> 8) | \
+ (((x) & 0x00000000ff000000##sfx) << 8) | \
+ (((x) & 0x0000000000ff0000##sfx) << 24) | \
+ (((x) & 0x000000000000ff00##sfx) << 40) | \
+ (((x) & 0x00000000000000ff##sfx) << 56));
+#if defined(__GNUC__)
+ _uswap_64(x, ull)
+#else
+ _uswap_64(x, )
+#endif
+#undef _uswap_64
+}
#endif
#endif
diff --git a/utils/porting.h b/utils/porting.h
index 9a47851d4..becd7acaa 100644
--- a/utils/porting.h
+++ b/utils/porting.h
@@ -44,13 +44,23 @@
# define UCLIBC_RUNTIME_PREFIX "/"
#endif
+#undef UCLIBC_ENDIAN_HOST
#define UCLIBC_ENDIAN_LITTLE 1234
#define UCLIBC_ENDIAN_BIG 4321
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-# define UCLIBC_ENDIAN_HOST UCLIBC_ENDIAN_LITTLE
-#elif __BYTE_ORDER == __BIG_ENDIAN
-# define UCLIBC_ENDIAN_HOST UCLIBC_ENDIAN_BIG
-#else
+#if defined(BYTE_ORDER)
+# if BYTE_ORDER == LITTLE_ENDIAN
+# define UCLIBC_ENDIAN_HOST UCLIBC_ENDIAN_LITTLE
+# elif BYTE_ORDER == BIG_ENDIAN
+# define UCLIBC_ENDIAN_HOST UCLIBC_ENDIAN_BIG
+# endif
+#elif defined(__BYTE_ORDER)
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+# define UCLIBC_ENDIAN_HOST UCLIBC_ENDIAN_LITTLE
+# elif __BYTE_ORDER == __BIG_ENDIAN
+# define UCLIBC_ENDIAN_HOST UCLIBC_ENDIAN_BIG
+# endif
+#endif
+#if !defined(UCLIBC_ENDIAN_HOST)
# error "Unknown host byte order!"
#endif