X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=mware%2Fbyteorder.h;h=befc15664fbf49647461d9b994dccac43b2399e4;hb=4bf15025c3fe95a226686b793e39a44f5f08d7da;hp=4730eb5bca9bd566b81ef2083031b650bc30b35b;hpb=277b540c0764dd376dcf583acdc97a2b2fd3d8e6;p=bertos.git diff --git a/mware/byteorder.h b/mware/byteorder.h index 4730eb5b..befc1566 100755 --- a/mware/byteorder.h +++ b/mware/byteorder.h @@ -1,8 +1,8 @@ -/*! +/** * \file * * * \brief Functions to convert integers to/from host byte-order. @@ -15,6 +15,21 @@ /*#* *#* $Log$ + *#* Revision 1.10 2006/06/10 05:37:03 bernie + *#* Convert to new Doxygen comments. + *#* + *#* Revision 1.9 2005/11/04 16:20:02 bernie + *#* Fix reference to README.devlib in header. + *#* + *#* Revision 1.8 2005/06/14 06:16:03 bernie + *#* Add all missing functions. + *#* + *#* Revision 1.7 2005/04/12 04:08:49 bernie + *#* host_to_net(16|32)(), net_to_host(16|32)(): New functions. + *#* + *#* Revision 1.6 2005/04/11 19:10:28 bernie + *#* Include top-level headers from cfg/ subdir. + *#* *#* Revision 1.5 2004/08/25 14:12:09 rasky *#* Aggiornato il comment block dei log RCS *#* @@ -35,11 +50,11 @@ #ifndef MWARE_BYTEORDER_H #define MWARE_BYTEORDER_H -#include -#include +#include +#include -/*! - * \brief Swap upper and lower bytes in a 16-bit value. +/** + * Swap upper and lower bytes in a 16-bit value. */ INLINE uint16_t swab16(uint16_t x) { @@ -47,8 +62,8 @@ INLINE uint16_t swab16(uint16_t x) | ((x & (uint16_t)0xFF00U) >> 8); } -/*! - * \brief Reverse bytes in a 32-bit value (e.g.: 0x12345678 -> 0x78563412). +/** + * Reverse bytes in a 32-bit value (e.g.: 0x12345678 -> 0x78563412). */ INLINE uint32_t swab32(uint32_t x) { @@ -58,6 +73,21 @@ INLINE uint32_t swab32(uint32_t x) | ((x & (uint32_t)0xFF000000UL) >> 24); } +/** + * Reverse bytes in a float value. + */ +INLINE float swab_float(float x) +{ + /* Avoid breaking strict aliasing rules. */ + char *cx = (char *)(&x); + STATIC_ASSERT(sizeof(float) == 4); + #define BYTEORDER_SWAP(a, b) ((a) ^= (b) ^= (a) ^= (b)) + BYTEORDER_SWAP(cx[0], cx[3]); + BYTEORDER_SWAP(cx[1], cx[2]); + #undef BYTEORDER_SWAP + return x; +} + INLINE uint16_t cpu_to_be16(uint16_t x) { return (CPU_BYTE_ORDER == CPU_LITTLE_ENDIAN) ? swab16(x) : x; @@ -78,4 +108,130 @@ INLINE uint32_t cpu_to_le32(uint32_t x) return (CPU_BYTE_ORDER == CPU_BIG_ENDIAN) ? swab32(x) : x; } +INLINE float cpu_to_be_float(float x) +{ + return (CPU_BYTE_ORDER == CPU_LITTLE_ENDIAN) ? swab_float(x) : x; +} + +INLINE float cpu_to_le_float(float x) +{ + return (CPU_BYTE_ORDER == CPU_BIG_ENDIAN) ? swab_float(x) : x; +} + +INLINE uint16_t be16_to_cpu(uint16_t x) +{ + return cpu_to_be16(x); +} + +INLINE uint16_t le16_to_cpu(uint16_t x) +{ + return cpu_to_le16(x); +} + +INLINE uint32_t be32_to_cpu(uint32_t x) +{ + return cpu_to_be32(x); +} + +INLINE uint32_t le32_to_cpu(uint32_t x) +{ + return cpu_to_le32(x); +} + +INLINE float be_float_to_cpu(float x) +{ + return cpu_to_be_float(x); +} + +INLINE float le_float_to_cpu(float x) +{ + return cpu_to_le_float(x); +} + +INLINE uint16_t host_to_net16(uint16_t x) +{ + return cpu_to_be16(x); +} + +INLINE uint16_t net_to_host16(uint16_t x) +{ + return be16_to_cpu(x); +} + +INLINE uint32_t host_to_net32(uint32_t x) +{ + return cpu_to_be32(x); +} + +INLINE uint32_t net_to_host32(uint32_t x) +{ + return be32_to_cpu(x); +} + +INLINE float host_to_net_float(float x) +{ + return cpu_to_be_float(x); +} + +INLINE float net_to_host_float(float x) +{ + return be_float_to_cpu(x); +} + +#ifdef __cplusplus + +/// Type generic byte swapping. +template +INLINE T swab(T x); + +template<> INLINE uint16_t swab(uint16_t x) { return swab16(x); } +template<> INLINE uint32_t swab(uint32_t x) { return swab32(x); } +template<> INLINE int16_t swab(int16_t x) { return static_cast(swab16(static_cast(x))); } +template<> INLINE int32_t swab(int32_t x) { return static_cast(swab32(static_cast(x))); } +template<> INLINE float swab(float x) { return swab_float(x); } + +/// Type generic conversion from CPU byte order to big-endian byte order. +template +INLINE T cpu_to_be(T x) +{ + return (CPU_BYTE_ORDER == CPU_LITTLE_ENDIAN) ? swab(x) : x; +} + +/// Type generic conversion from CPU byte-order to little-endian. +template +INLINE T cpu_to_le(T x) +{ + return (CPU_BYTE_ORDER == CPU_BIG_ENDIAN) ? swab(x) : x; +} + +/// Type generic conversion from big endian byte-order to CPU byte order. +template +INLINE T be_to_cpu(T x) +{ + return cpu_to_be(x); +} + +/// Type generic conversion from little-endian byte order to CPU byte order. +template +INLINE T le_to_cpu(T x) +{ + return cpu_to_le(x); +} + +/// Type generic conversion from network byte order to host byte order. +template +INLINE T net_to_host(T x) +{ + return be_to_cpu(x); +} + +/// Type generic conversion from host byte order to network byte order. +template +INLINE T host_to_net(T x) +{ + return net_to_host(x); +} + +#endif /* __cplusplus */ + #endif /* MWARE_BYTEORDER_H */