diff --git a/README.md b/README.md index 5ae0d16..45066bd 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,6 @@ C library to implement - data structures like linked-lists, vector arrays, maps - bitmaps & bitwise operations +- architecture-dependent & hardware features +- byte-order endianness detection, byte-swapping - other stuff \ No newline at end of file diff --git a/endian.c b/endian.c index b9b011f..d86904c 100644 --- a/endian.c +++ b/endian.c @@ -18,7 +18,6 @@ static enum cu_endian_e endian_detect() return LittleEndian; else if (host_order.value == ORDER_BIG_ENDIAN) return BigEndian; - else return MiddleEndian; } static uint16_t sw_bswap16(uint16_t val) @@ -78,7 +77,71 @@ bswap32_t cu_bswap32 = sw_bswap32; bswap64_t cu_bswap64 = sw_bswap64; #endif +static uint16_t no_bswap16(uint16_t val) +{ + return val; +} + +static uint32_t no_bswap32(uint32_t val) +{ + return val; +} + +static uint64_t no_bswap64(uint64_t val) +{ + return val; +} + +bswap16_t h16tol16 = no_bswap16; +bswap32_t h32tol32 = no_bswap32; +bswap64_t h64tol64 = no_bswap64; +bswap16_t l16toh16 = no_bswap16; +bswap32_t l32toh32 = no_bswap32; +bswap64_t l64toh64 = no_bswap64; + +bswap16_t h16tob16 = no_bswap16; +bswap32_t h32tob32 = no_bswap32; +bswap64_t h64tob64 = no_bswap64; +bswap16_t b16toh16 = no_bswap16; +bswap32_t b32toh32 = no_bswap32; +bswap64_t b64toh64 = no_bswap64; + +bswap16_t h16ton16 = no_bswap16; +bswap32_t h32ton32 = no_bswap32; +bswap64_t h64ton64 = no_bswap64; +bswap16_t n16toh16 = no_bswap16; +bswap32_t n32toh32 = no_bswap32; +bswap64_t n64toh64 = no_bswap64; + void cu_endian_init() { cu_endian = endian_detect(); + if (cu_endian == LittleEndian) + { + h16tob16 = cu_bswap16; + h32tob32 = cu_bswap32; + h64tob64 = cu_bswap64; + b16toh16 = cu_bswap16; + b32toh32 = cu_bswap32; + b64toh64 = cu_bswap64; + } + else if (cu_endian == BigEndian) + { + h16tol16 = cu_bswap16; + h32tol32 = cu_bswap32; + h64tol64 = cu_bswap64; + l16toh16 = cu_bswap16; + l32toh32 = cu_bswap32; + l64toh64 = cu_bswap64; + } + + if (cu_endian != CU_NETWORK_ORDER) + { + h16ton16 = cu_bswap16; + h32ton32 = cu_bswap32; + h64ton64 = cu_bswap64; + n16toh16 = cu_bswap16; + n32toh32 = cu_bswap32; + n64toh64 = cu_bswap64; + } } diff --git a/endian.h b/endian.h index 9c5132b..4261f90 100644 --- a/endian.h +++ b/endian.h @@ -5,8 +5,7 @@ enum cu_endian_e { LittleEndian, - BigEndian, - MiddleEndian + BigEndian }; extern enum cu_endian_e cu_endian; @@ -19,6 +18,29 @@ extern bswap16_t cu_bswap16; extern bswap32_t cu_bswap32; extern bswap64_t cu_bswap64; +extern bswap16_t h16tol16; +extern bswap32_t h32tol32; +extern bswap64_t h64tol64; +extern bswap16_t l16toh16; +extern bswap32_t l32toh32; +extern bswap64_t l64toh64; + +extern bswap16_t h16tob16; +extern bswap32_t h32tob32; +extern bswap64_t h64tob64; +extern bswap16_t b16toh16; +extern bswap32_t b32toh32; +extern bswap64_t b64toh64; + +#define CU_NETWORK_ORDER BigEndian + +extern bswap16_t h16ton16; +extern bswap32_t h32ton32; +extern bswap64_t h64ton64; +extern bswap16_t n16toh16; +extern bswap32_t n32toh32; +extern bswap64_t n64toh64; + void cu_endian_init(); #endif \ No newline at end of file diff --git a/test.c b/test.c index 4047433..9af81c3 100644 --- a/test.c +++ b/test.c @@ -80,8 +80,8 @@ int main() printf("[endian]\n"); printf("cutil_endian\t%u\n", cu_endian); - printf("%x\t%x\n", 0x12345678, cu_bswap32(0x12345678)); - printf("%lx\t%lx\n", 0x12345678abcd8765, cu_bswap64(0x12345678abcd8765)); + printf("%x\t%x\n", 0x12345678, l32toh32(0x12345678)); + printf("%lx\t%lx\n", 0x12345678abcd8765, h64ton64(0x12345678abcd8765)); cutil_exit(); return 0;