You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2017/01/25 00:03:38 UTC
[2/4] incubator-mynewt-core git commit: Add support for endianness
convertion function in endian.h
Add support for endianness convertion function in endian.h
Those macros implement interfaces to convert values between host and
big-/little-endian byte order as defined in standard endian.h header.
Also make exisiting hton* and ntoh* macros use same helpers as above
funtions.
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/c78ed8a3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/c78ed8a3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/c78ed8a3
Branch: refs/heads/develop
Commit: c78ed8a3f43119eff3d488ed44af544d8735c1ec
Parents: 31f894b
Author: Szymon Janc <sz...@codecoup.pl>
Authored: Fri Jan 20 19:36:55 2017 +0100
Committer: Christopher Collins <cc...@apache.org>
Committed: Tue Jan 24 16:03:30 2017 -0800
----------------------------------------------------------------------
kernel/os/include/os/endian.h | 143 ++++++++++++++++++++++++++++++++-----
1 file changed, 126 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/c78ed8a3/kernel/os/include/os/endian.h
----------------------------------------------------------------------
diff --git a/kernel/os/include/os/endian.h b/kernel/os/include/os/endian.h
index 959d74c..8786f40 100644
--- a/kernel/os/include/os/endian.h
+++ b/kernel/os/include/os/endian.h
@@ -26,6 +26,33 @@
extern "C" {
#endif
+/* Internal helpers */
+#ifndef __bswap_64
+#define __bswap_64(x) ((uint64_t) \
+ ((((x) & 0xff00000000000000ull) >> 56) | \
+ (((x) & 0x00ff000000000000ull) >> 40) | \
+ (((x) & 0x0000ff0000000000ull) >> 24) | \
+ (((x) & 0x000000ff00000000ull) >> 8) | \
+ (((x) & 0x00000000ff000000ull) << 8) | \
+ (((x) & 0x0000000000ff0000ull) << 24) | \
+ (((x) & 0x000000000000ff00ull) << 40) | \
+ (((x) & 0x00000000000000ffull) << 56)))
+#endif
+
+#ifndef __bswap_32
+#define __bswap_32(x) ((uint32_t) \
+ ((((x) & 0xff000000) >> 24) | \
+ (((x) & 0x00ff0000) >> 8) | \
+ (((x) & 0x0000ff00) << 8) | \
+ (((x) & 0x000000ff) << 24)))
+#endif
+
+#ifndef __bswap_16
+#define __bswap_16(x) ((uint16_t) \
+ ((((x) & 0xff00) >> 8) | \
+ (((x) & 0x00ff) << 8)))
+#endif
+
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
#ifndef ntohll
@@ -52,18 +79,58 @@ extern "C" {
#define htons(x) ((uint16_t)(x))
#endif
+#ifndef htobe16
+#define htobe16(x) ((uint16_t)(x))
+#endif
+
+#ifndef htole16
+#define htole16(x) __bswap_16 (x)
+#endif
+
+#ifndef be16toh
+#define be16toh(x) ((uint16_t)(x))
+#endif
+
+#ifndef le16toh
+#define le16toh(x) __bswap_16 (x)
+#endif
+
+#ifndef htobe32
+#define htobe32(x) ((uint32_t)(x))
+#endif
+
+#ifndef htole32
+#define htole32(x) __bswap_32 (x)
+#endif
+
+#ifndef be32toh
+#define be32toh(x) ((uint32_t)(x))
+#endif
+
+#ifndef le32toh
+#define le32toh(x) __bswap_32 (x)
+#endif
+
+#ifndef htobe64
+#define htobe64(x) ((uint64_t)(x))
+#endif
+
+#ifndef htole64
+#define htole64(x) __bswap_64 (x)
+#endif
+
+#ifndef be64toh
+#define be64toh(x) ((uint64_t)(x))
+#endif
+
+#ifndef le64toh
+#define le64toh(x) __bswap_64 (x)
+#endif
+
#else
#ifndef ntohll
-#define ntohll(x) ((uint64_t) \
- ((((x) & 0xff00000000000000ull) >> 56) | \
- (((x) & 0x00ff000000000000ull) >> 40) | \
- (((x) & 0x0000ff0000000000ull) >> 24) | \
- (((x) & 0x000000ff00000000ull) >> 8) | \
- (((x) & 0x00000000ff000000ull) << 8) | \
- (((x) & 0x0000000000ff0000ull) << 24) | \
- (((x) & 0x000000000000ff00ull) << 40) | \
- (((x) & 0x00000000000000ffull) << 56)))
+#define ntohll(x) __bswap_64(x)
#endif
#ifndef htonll
@@ -71,11 +138,7 @@ extern "C" {
#endif
#ifndef ntohl
-#define ntohl(x) ((uint32_t) \
- ((((x) & 0xff000000) >> 24) | \
- (((x) & 0x00ff0000) >> 8) | \
- (((x) & 0x0000ff00) << 8) | \
- (((x) & 0x000000ff) << 24)))
+#define ntohl(x) __bswap_32(x)
#endif
#ifndef htonl
@@ -83,15 +146,61 @@ extern "C" {
#endif
#ifndef htons
-#define htons(x) ((uint16_t) \
- ((((x) & 0xff00) >> 8) | \
- (((x) & 0x00ff) << 8)))
+#define htons(x) __bswap_16(x)
#endif
#ifndef ntohs
#define ntohs htons
#endif
+#ifndef htobe16
+#define htobe16(x) __bswap_16(x)
+#endif
+
+#ifndef htole16
+#define htole16(x) ((uint16_t)(x))
+#endif
+
+#ifndef be16toh
+#define be16toh(x) __bswap_16(x)
+#endif
+
+#ifndef le16toh
+#define le16toh(x) ((uint16_t)(x))
+#endif
+
+#ifndef htobe32
+#define htobe32(x) __bswap_32(x)
+#endif
+
+#ifndef htole32
+#define htole32(x) ((uint32_t)(x))
+#endif
+
+#ifndef be32toh
+#define be32toh(x) __bswap_32(x)
+#endif
+
+#ifndef le32toh
+#define le32toh(x) ((uint32_t)(x))
+#endif
+
+#ifndef htobe64
+#define htobe64(x) __builtin_bswap64(x)
+#endif
+
+#ifndef htole64
+#define htole64(x) ((uint64_t)(x))
+#endif
+
+#ifndef be64toh
+#define be64toh(x) __builtin_bswap64(x)
+#endif
+
+#ifndef le64toh
+#define le64toh(x) ((uint64_t)(x))
+#endif
+
#endif
#ifdef __cplusplus
}