00001 #ifndef ROSE_ENDIANWRAPPERS_H
00002 #define ROSE_ENDIANWRAPPERS_H
00003
00004 #include <stdint.h>
00005
00006
00007
00008
00009 #ifdef HAVE_BYTESWAP_H
00010 #include <byteswap.h>
00011
00012 static inline uint16_t roseBswap16(uint16_t x) {
00013 return bswap_16(x);
00014 }
00015
00016 static inline uint32_t roseBswap32(uint32_t x) {
00017 return bswap_32(x);
00018 }
00019
00020 static inline uint64_t roseBswap64(uint64_t x) {
00021 return bswap_64(x);
00022 }
00023 #else
00024
00025 #ifdef HAVE_MACHINE_ENDIAN_H
00026 #include <machine/endian.h>
00027 static inline uint16_t roseBswap16(uint16_t x) {
00028 return _OSSwapInt16(x);
00029 }
00030
00031 static inline uint32_t roseBswap32(uint32_t x) {
00032 return _OSSwapInt32(x);
00033 }
00034
00035 static inline uint64_t roseBswap64(uint64_t x) {
00036 return _OSSwapInt64(x);
00037 }
00038
00039 #else
00040 #ifdef _MSC_VER
00041
00042
00043
00044 #include <sys/types.h>
00045
00046 #else
00047 #error "Could not find endian swapping code"
00048 #endif
00049 #endif
00050 #endif
00051
00052 #ifndef _MSC_VER
00053 #ifdef WORDS_BIGENDIAN
00054 static inline uint16_t getLittleEndian16(uint16_t x) {return roseBswap16(x);}
00055 static inline uint32_t getLittleEndian32(uint32_t x) {return roseBswap32(x);}
00056 static inline uint64_t getLittleEndian64(uint64_t x) {return roseBswap64(x);}
00057 static inline uint16_t getBigEndian16(uint16_t x) {return x;}
00058 static inline uint32_t getBigEndian32(uint32_t x) {return x;}
00059 static inline uint64_t getBigEndian64(uint64_t x) {return x;}
00060 #else
00061 static inline uint16_t getLittleEndian16(uint16_t x) {return x;}
00062 static inline uint32_t getLittleEndian32(uint32_t x) {return x;}
00063 static inline uint64_t getLittleEndian64(uint64_t x) {return x;}
00064 static inline uint16_t getBigEndian16(uint16_t x) {return roseBswap16(x);}
00065 static inline uint32_t getBigEndian32(uint32_t x) {return roseBswap32(x);}
00066 static inline uint64_t getBigEndian64(uint64_t x) {return roseBswap64(x);}
00067 #endif
00068
00069 static inline uint16_t getSwitchedEndian16(bool isBigEndian, uint16_t x) {
00070 return isBigEndian ? getBigEndian16(x) : getLittleEndian16(x);
00071 }
00072
00073 static inline uint32_t getSwitchedEndian32(bool isBigEndian, uint32_t x) {
00074 return isBigEndian ? getBigEndian32(x) : getLittleEndian32(x);
00075 }
00076
00077 static inline uint64_t getSwitchedEndian64(bool isBigEndian, uint64_t x) {
00078 return isBigEndian ? getBigEndian64(x) : getLittleEndian64(x);
00079 }
00080
00081 #endif
00082 #endif // ROSE_ENDIANWRAPPERS_H