diff options
Diffstat (limited to 'src/Util.c')
| -rw-r--r-- | src/Util.c | 323 |
1 files changed, 323 insertions, 0 deletions
diff --git a/src/Util.c b/src/Util.c new file mode 100644 index 0000000..110f1ae --- /dev/null +++ b/src/Util.c @@ -0,0 +1,323 @@ +#include <BH/Util.h> +#include <string.h> + + +union I16 +{ + uint16_t u; + int16_t s; +}; + + +union I32 +{ + uint32_t u; + int32_t s; +}; + + +union I64 +{ + uint64_t u; + int64_t s; +}; + + +uint16_t BH_Read16LEu(const char *buffer) +{ + union I16 tmp; + tmp.u = (uint16_t)((unsigned char)buffer[0]); + tmp.u |= (uint16_t)((unsigned char)buffer[1]) << 8; + return tmp.u; +} + + +int16_t BH_Read16LEs(const char *buffer) +{ + union I16 tmp; + tmp.u = (uint16_t)((unsigned char)buffer[0]); + tmp.u |= (uint16_t)((unsigned char)buffer[1]) << 8; + return tmp.s; +} + + +uint32_t BH_Read32LEu(const char *buffer) +{ + union I32 tmp; + tmp.u = (uint32_t)((unsigned char)buffer[0]); + tmp.u |= (uint32_t)((unsigned char)buffer[1]) << 8; + tmp.u |= (uint32_t)((unsigned char)buffer[2]) << 16; + tmp.u |= (uint32_t)((unsigned char)buffer[3]) << 24; + return tmp.u; +} + + +int32_t BH_Read32LEs(const char *buffer) +{ + union I32 tmp; + tmp.u = (uint32_t)((unsigned char)buffer[0]); + tmp.u |= (uint32_t)((unsigned char)buffer[1]) << 8; + tmp.u |= (uint32_t)((unsigned char)buffer[2]) << 16; + tmp.u |= (uint32_t)((unsigned char)buffer[3]) << 24; + return tmp.s; +} + + +uint64_t BH_Read64LEu(const char *buffer) +{ + union I64 tmp; + tmp.u = (uint64_t)((unsigned char)buffer[0]); + tmp.u |= (uint64_t)((unsigned char)buffer[1]) << 8; + tmp.u |= (uint64_t)((unsigned char)buffer[2]) << 16; + tmp.u |= (uint64_t)((unsigned char)buffer[3]) << 24; + tmp.u |= (uint64_t)((unsigned char)buffer[4]) << 32; + tmp.u |= (uint64_t)((unsigned char)buffer[5]) << 40; + tmp.u |= (uint64_t)((unsigned char)buffer[6]) << 48; + tmp.u |= (uint64_t)((unsigned char)buffer[7]) << 56; + return tmp.u; +} + + +int64_t BH_Read64LEs(const char *buffer) +{ + union I64 tmp; + tmp.u = (uint64_t)((unsigned char)buffer[0]); + tmp.u |= (uint64_t)((unsigned char)buffer[1]) << 8; + tmp.u |= (uint64_t)((unsigned char)buffer[2]) << 16; + tmp.u |= (uint64_t)((unsigned char)buffer[3]) << 24; + tmp.u |= (uint64_t)((unsigned char)buffer[4]) << 32; + tmp.u |= (uint64_t)((unsigned char)buffer[5]) << 40; + tmp.u |= (uint64_t)((unsigned char)buffer[6]) << 48; + tmp.u |= (uint64_t)((unsigned char)buffer[7]) << 56; + return tmp.s; +} + + +uint16_t BH_Read16BEu(const char *buffer) +{ + union I16 tmp; + tmp.u = (uint16_t)((unsigned char)buffer[0]) << 8; + tmp.u |= (uint16_t)((unsigned char)buffer[1]); + return tmp.u; +} + + +int16_t BH_Read16BEs(const char *buffer) +{ + union I16 tmp; + tmp.u = (uint16_t)((unsigned char)buffer[0]) << 8; + tmp.u |= (uint16_t)((unsigned char)buffer[1]); + return tmp.s; +} + +uint32_t BH_Read32BEu(const char *buffer) +{ + union I32 tmp; + tmp.u = (uint32_t)((unsigned char)buffer[0]) << 24; + tmp.u |= (uint32_t)((unsigned char)buffer[1]) << 16; + tmp.u |= (uint32_t)((unsigned char)buffer[2]) << 8; + tmp.u |= (uint32_t)((unsigned char)buffer[3]); + return tmp.u; +} + +int32_t BH_Read32BEs(const char *buffer) +{ + union I32 tmp; + tmp.u = (uint32_t)((unsigned char)buffer[0]) << 24; + tmp.u |= (uint32_t)((unsigned char)buffer[1]) << 16; + tmp.u |= (uint32_t)((unsigned char)buffer[2]) << 8; + tmp.u |= (uint32_t)((unsigned char)buffer[3]); + return tmp.s; +} + +uint64_t BH_Read64BEu(const char *buffer) +{ + union I64 tmp; + tmp.u = (uint64_t)((unsigned char)buffer[0]) << 56; + tmp.u |= (uint64_t)((unsigned char)buffer[1]) << 48; + tmp.u |= (uint64_t)((unsigned char)buffer[2]) << 40; + tmp.u |= (uint64_t)((unsigned char)buffer[3]) << 32; + tmp.u |= (uint64_t)((unsigned char)buffer[4]) << 24; + tmp.u |= (uint64_t)((unsigned char)buffer[5]) << 16; + tmp.u |= (uint64_t)((unsigned char)buffer[6]) << 8; + tmp.u |= (uint64_t)((unsigned char)buffer[7]); + return tmp.u; +} + +int64_t BH_Read64BEs(const char *buffer) +{ + union I64 tmp; + tmp.u = (uint64_t)((unsigned char)buffer[0]) << 56; + tmp.u |= (uint64_t)((unsigned char)buffer[1]) << 48; + tmp.u |= (uint64_t)((unsigned char)buffer[2]) << 40; + tmp.u |= (uint64_t)((unsigned char)buffer[3]) << 32; + tmp.u |= (uint64_t)((unsigned char)buffer[4]) << 24; + tmp.u |= (uint64_t)((unsigned char)buffer[5]) << 16; + tmp.u |= (uint64_t)((unsigned char)buffer[6]) << 8; + tmp.u |= (uint64_t)((unsigned char)buffer[7]); + return tmp.s; +} + + +void BH_Write16LEu(char *buffer, + uint16_t value) +{ + union I16 tmp; + tmp.u = value; + + ((unsigned char *)buffer)[0] = (tmp.u) & 0xFF; + ((unsigned char *)buffer)[1] = (tmp.u >> 8) & 0xFF; +} + + +void BH_Write16LEs(char *buffer, + int16_t value) +{ + union I16 tmp; + tmp.s = value; + + ((unsigned char *)buffer)[0] = (tmp.u) & 0xFF; + ((unsigned char *)buffer)[1] = (tmp.u >> 8) & 0xFF; +} + + +void BH_Write32LEu(char *buffer, + uint32_t value) +{ + union I32 tmp; + tmp.u = value; + + ((unsigned char *)buffer)[0] = (tmp.u) & 0xFF; + ((unsigned char *)buffer)[1] = (tmp.u >> 8) & 0xFF; + ((unsigned char *)buffer)[2] = (tmp.u >> 16) & 0xFF; + ((unsigned char *)buffer)[3] = (tmp.u >> 24) & 0xFF; +} + + +void BH_Write32LEs(char *buffer, + int32_t value) +{ + union I32 tmp; + tmp.s = value; + + ((unsigned char *)buffer)[0] = (tmp.u) & 0xFF; + ((unsigned char *)buffer)[1] = (tmp.u >> 8) & 0xFF; + ((unsigned char *)buffer)[2] = (tmp.u >> 16) & 0xFF; + ((unsigned char *)buffer)[3] = (tmp.u >> 24) & 0xFF; +} + + +void BH_Write64LEu(char *buffer, + uint64_t value) +{ + union I64 tmp; + tmp.u = value; + + ((unsigned char *)buffer)[0] = (tmp.u) & 0xFF; + ((unsigned char *)buffer)[1] = (tmp.u >> 8) & 0xFF; + ((unsigned char *)buffer)[2] = (tmp.u >> 16) & 0xFF; + ((unsigned char *)buffer)[3] = (tmp.u >> 24) & 0xFF; + ((unsigned char *)buffer)[4] = (tmp.u >> 32) & 0xFF; + ((unsigned char *)buffer)[5] = (tmp.u >> 40) & 0xFF; + ((unsigned char *)buffer)[6] = (tmp.u >> 48) & 0xFF; + ((unsigned char *)buffer)[7] = (tmp.u >> 56) & 0xFF; +} + + +void BH_Write64LEs(char *buffer, + int64_t value) +{ + union I64 tmp; + tmp.s = value; + + ((unsigned char *)buffer)[0] = (tmp.u) & 0xFF; + ((unsigned char *)buffer)[1] = (tmp.u >> 8) & 0xFF; + ((unsigned char *)buffer)[2] = (tmp.u >> 16) & 0xFF; + ((unsigned char *)buffer)[3] = (tmp.u >> 24) & 0xFF; + ((unsigned char *)buffer)[4] = (tmp.u >> 32) & 0xFF; + ((unsigned char *)buffer)[5] = (tmp.u >> 40) & 0xFF; + ((unsigned char *)buffer)[6] = (tmp.u >> 48) & 0xFF; + ((unsigned char *)buffer)[7] = (tmp.u >> 56) & 0xFF; +} + + +void BH_Write16BEu(char *buffer, + uint16_t value) +{ + union I16 tmp; + tmp.u = value; + + ((unsigned char *)buffer)[0] = (tmp.u >> 8) & 0xFF; + ((unsigned char *)buffer)[1] = (tmp.u) & 0xFF; +} + + +void BH_Write16BEs(char *buffer, + int16_t value) +{ + union I16 tmp; + tmp.s = value; + + ((unsigned char *)buffer)[0] = (tmp.u >> 8) & 0xFF; + ((unsigned char *)buffer)[1] = (tmp.u) & 0xFF; +} + + +void BH_Write32BEu(char *buffer, + uint32_t value) +{ + union I32 tmp; + tmp.u = value; + + ((unsigned char *)buffer)[0] = (tmp.u >> 24) & 0xFF; + ((unsigned char *)buffer)[1] = (tmp.u >> 16) & 0xFF; + ((unsigned char *)buffer)[2] = (tmp.u >> 8) & 0xFF; + ((unsigned char *)buffer)[3] = (tmp.u) & 0xFF; +} + + +void BH_Write32BEs(char *buffer, + int32_t value) +{ + union I32 tmp; + tmp.s = value; + + ((unsigned char *)buffer)[0] = (tmp.u >> 24) & 0xFF; + ((unsigned char *)buffer)[1] = (tmp.u >> 16) & 0xFF; + ((unsigned char *)buffer)[2] = (tmp.u >> 8) & 0xFF; + ((unsigned char *)buffer)[3] = (tmp.u) & 0xFF; +} + + +void BH_Write64BEu(char *buffer, + uint64_t value) +{ + union I64 tmp; + tmp.u = value; + + ((unsigned char *)buffer)[0] = (tmp.u >> 56) & 0xFF; + ((unsigned char *)buffer)[1] = (tmp.u >> 48) & 0xFF; + ((unsigned char *)buffer)[2] = (tmp.u >> 40) & 0xFF; + ((unsigned char *)buffer)[3] = (tmp.u >> 32) & 0xFF; + ((unsigned char *)buffer)[4] = (tmp.u >> 24) & 0xFF; + ((unsigned char *)buffer)[5] = (tmp.u >> 16) & 0xFF; + ((unsigned char *)buffer)[6] = (tmp.u >> 8) & 0xFF; + ((unsigned char *)buffer)[7] = (tmp.u) & 0xFF; +} + + +void BH_Write64BEs(char *buffer, + int64_t value) +{ + union I64 tmp; + tmp.s = value; + + ((unsigned char *)buffer)[0] = (tmp.u >> 56) & 0xFF; + ((unsigned char *)buffer)[1] = (tmp.u >> 48) & 0xFF; + ((unsigned char *)buffer)[2] = (tmp.u >> 40) & 0xFF; + ((unsigned char *)buffer)[3] = (tmp.u >> 32) & 0xFF; + ((unsigned char *)buffer)[4] = (tmp.u >> 24) & 0xFF; + ((unsigned char *)buffer)[5] = (tmp.u >> 16) & 0xFF; + ((unsigned char *)buffer)[6] = (tmp.u >> 8) & 0xFF; + ((unsigned char *)buffer)[7] = (tmp.u) & 0xFF; +} |
