From: bernie Date: Tue, 14 Jun 2005 06:16:03 +0000 (+0000) Subject: Add all missing functions. X-Git-Tag: 1.0.0~829 X-Git-Url: https://codewiz.org/gitweb?a=commitdiff_plain;h=13ec95fc46065b689287f537b61f2e6607be1653;p=bertos.git Add all missing functions. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@412 38d2e660-2303-0410-9eaa-f027e97ec537 --- diff --git a/mware/byteorder.h b/mware/byteorder.h index 10c8b6f4..65392535 100755 --- a/mware/byteorder.h +++ b/mware/byteorder.h @@ -15,6 +15,9 @@ /*#* *#* $Log$ + *#* 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. *#* @@ -45,7 +48,7 @@ #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) { @@ -54,7 +57,7 @@ INLINE uint16_t swab16(uint16_t x) } /*! - * \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) { @@ -64,6 +67,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; @@ -84,24 +102,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_BYTE_ORDER == CPU_BIG_ENDIAN) ? x : swab16(x); + return cpu_to_be16(x); } INLINE uint16_t net_to_host16(uint16_t x) { - return (CPU_BYTE_ORDER == CPU_BIG_ENDIAN) ? x : swab16(x); + return be16_to_cpu(x); } INLINE uint32_t host_to_net32(uint32_t x) { - return (CPU_BYTE_ORDER == CPU_BIG_ENDIAN) ? x : swab32(x); + return cpu_to_be32(x); } INLINE uint32_t net_to_host32(uint32_t x) { - return (CPU_BYTE_ORDER == CPU_BIG_ENDIAN) ? x : swab32(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 */