diff options
author | Mike Frysinger <vapier@gentoo.org> | 2009-02-09 22:51:27 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2009-02-09 22:51:27 +0000 |
commit | 14fd4a3a31fc736f125c8cfd7fa827a310712135 (patch) | |
tree | de6fcd07e83b1301bb5bce9b04f88a026b458354 | |
parent | 32242e7e10276157533def1c92c4c720945510fc (diff) |
unify byte order cruft in bswap.h and porting.h and add a bswap_64() replacement
-rw-r--r-- | utils/bswap.h | 52 | ||||
-rw-r--r-- | utils/porting.h | 20 |
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 |