endianWrappers.h

Go to the documentation of this file.
00001 #ifndef ROSE_ENDIANWRAPPERS_H
00002 #define ROSE_ENDIANWRAPPERS_H
00003 
00004 #include <stdint.h>
00005 
00006 // We don't just implement these ourselves because some processors have special
00007 // instructions for endian swapping
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 // DQ (11/28/2009): Since it seems we can compile everything, let this be something we 
00042 // fix if we have probelems linking. Remove the warning for now to focus on a clean compile.
00043 // #pragma message ("WARNING EndianWrappers.h: MS: Could not find endian swapping code" )
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

Generated on Fri Oct 15 21:51:32 2010 for ROSE by  doxygen 1.4.7