nuclear@7: #include "endian.h" nuclear@7: nuclear@7: #ifdef NO_INET nuclear@7: static uint32_t init_once32(uint32_t x); nuclear@7: static uint16_t init_once16(uint16_t x); nuclear@7: nuclear@7: static uint16_t swap16(uint16_t x); nuclear@7: static uint32_t swap32(uint32_t x); nuclear@7: static uint16_t nop16(uint16_t x); nuclear@7: static uint32_t nop32(uint32_t x); nuclear@7: nuclear@7: uint16_t (*ntohs)(uint16_t) = init_once16; nuclear@7: uint16_t (*htons)(uint16_t) = init_once16; nuclear@7: uint32_t (*ntohl)(uint32_t) = init_once32; nuclear@7: uint32_t (*htonl)(uint32_t) = init_once32; nuclear@7: nuclear@7: static uint16_t init_once16(uint16_t x) nuclear@7: { nuclear@7: int be = bigendian(); nuclear@7: ntohs = be ? nop16 : swap16; nuclear@7: htons = be ? nop16 : swap16; nuclear@7: return ntohs(x); nuclear@7: } nuclear@7: nuclear@7: static uint32_t init_once32(uint32_t x) nuclear@7: { nuclear@7: int be = bigendian(); nuclear@7: ntohl = be ? nop32 : swap32; nuclear@7: htonl = be ? nop32 : swap32; nuclear@7: return ntohl(x); nuclear@7: } nuclear@7: nuclear@7: static uint16_t swap16(uint16_t x) nuclear@7: { nuclear@7: return (x << 8) | (x >> 8); nuclear@7: } nuclear@7: nuclear@7: static uint32_t swap32(uint32_t x) nuclear@7: { nuclear@7: return (x << 24) | (x >> 24) | ((x << 16) & 0xff0000) | ((x >> 16) & 0xff00); nuclear@7: } nuclear@7: nuclear@7: static uint16_t nop16(uint16_t x) nuclear@7: { nuclear@7: return x; nuclear@7: } nuclear@7: nuclear@7: static uint32_t nop32(uint32_t x) nuclear@7: { nuclear@7: return x; nuclear@7: } nuclear@7: #endif nuclear@7: nuclear@7: int bigendian(void) nuclear@7: { nuclear@7: static const uint16_t x = 0xaabb; nuclear@7: return *(unsigned char*)&x == 0xaa; nuclear@7: }