diff options
author | Ramsay Jones <ramsay@ramsay1.demon.co.uk> | 2010-10-12 22:11:51 +0400 |
---|---|---|
committer | Vicent Marti <tanoku@gmail.com> | 2010-10-27 01:59:05 +0400 |
commit | e30056275c2a6d857d004d850658ccf3490a7876 (patch) | |
tree | e96bc1f77a329e342eec430c0d8119ee314dc9b9 /src/bswap.h | |
parent | 0d95f32c55a18303a87147467ebd68ea24995753 (diff) |
bswap.h: Add ntohs() and htons() functions
Since commit 70aab459, the msvc and MinGW builds have relied on
the built-in implementation of ntohl() and htonl(), rather than
linking the wsock32 library. The new index manipulation code now
calls ntohs()/htons() in addition to ntohl()/htonl(), so we need
to provide a built-in implementation of the 16-bit functions.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Diffstat (limited to 'src/bswap.h')
-rw-r--r-- | src/bswap.h | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/src/bswap.h b/src/bswap.h index b3e8a0abb..b9211c3c8 100644 --- a/src/bswap.h +++ b/src/bswap.h @@ -21,7 +21,15 @@ GIT_INLINE(uint32_t) default_swab32(uint32_t val) #undef bswap32 -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) +GIT_INLINE(uint16_t) default_swab16(uint16_t val) +{ + return (((val & 0xff00) >> 8) | + ((val & 0x00ff) << 8)); +} + +#undef bswap16 + +#if defined(__GNUC__) && defined(__i386__) #define bswap32(x) ({ \ uint32_t __res; \ @@ -32,11 +40,41 @@ GIT_INLINE(uint32_t) default_swab32(uint32_t val) } \ __res; }) +#define bswap16(x) ({ \ + uint16_t __res; \ + if (__builtin_constant_p(x)) { \ + __res = default_swab16(x); \ + } else { \ + __asm__("xchgb %b0,%h0" : "=q" (__res) : "0" ((uint16_t)(x))); \ + } \ + __res; }) + +#elif defined(__GNUC__) && defined(__x86_64__) + +#define bswap32(x) ({ \ + uint32_t __res; \ + if (__builtin_constant_p(x)) { \ + __res = default_swab32(x); \ + } else { \ + __asm__("bswapl %0" : "=r" (__res) : "0" ((uint32_t)(x))); \ + } \ + __res; }) + +#define bswap16(x) ({ \ + uint16_t __res; \ + if (__builtin_constant_p(x)) { \ + __res = default_swab16(x); \ + } else { \ + __asm__("xchgb %b0,%h0" : "=Q" (__res) : "0" ((uint16_t)(x))); \ + } \ + __res; }) + #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) #include <stdlib.h> #define bswap32(x) _byteswap_ulong(x) +#define bswap16(x) _byteswap_ushort(x) #endif @@ -48,3 +86,12 @@ GIT_INLINE(uint32_t) default_swab32(uint32_t val) #define htonl(x) bswap32(x) #endif + +#ifdef bswap16 + +#undef ntohs +#undef htons +#define ntohs(x) bswap16(x) +#define htons(x) bswap16(x) + +#endif |