1 //
2 //  readstat_bits.c - Bit-twiddling utility functions
3 //
4 
5 #include <sys/types.h>
6 #include <stdint.h>
7 #include <string.h>
8 
9 #include "readstat_bits.h"
10 
machine_is_little_endian()11 int machine_is_little_endian() {
12     int test_byte_order = 1;
13     return ((char *)&test_byte_order)[0];
14 }
15 
ones_to_twos_complement1(char num)16 char ones_to_twos_complement1(char num) {
17     return num < 0 ? num+1 : num;
18 }
19 
ones_to_twos_complement2(int16_t num)20 int16_t ones_to_twos_complement2(int16_t num) {
21     return num < 0 ? num+1 : num;
22 }
23 
ones_to_twos_complement4(int32_t num)24 int32_t ones_to_twos_complement4(int32_t num) {
25     return num < 0 ? num+1 : num;
26 }
27 
twos_to_ones_complement1(char num)28 char twos_to_ones_complement1(char num) {
29     return num < 0 ? num-1 : num;
30 }
31 
twos_to_ones_complement2(int16_t num)32 int16_t twos_to_ones_complement2(int16_t num) {
33     return num < 0 ? num-1 : num;
34 }
35 
twos_to_ones_complement4(int32_t num)36 int32_t twos_to_ones_complement4(int32_t num) {
37     return num < 0 ? num-1 : num;
38 }
39 
byteswap2(uint16_t num)40 uint16_t byteswap2(uint16_t num) {
41     return ((num & 0xFF00) >> 8) | ((num & 0x00FF) << 8);
42 }
43 
byteswap4(uint32_t num)44 uint32_t byteswap4(uint32_t num) {
45     num = ((num & 0xFFFF0000) >> 16) | ((num & 0x0000FFFF) << 16);
46     return ((num & 0xFF00FF00) >> 8) | ((num & 0x00FF00FF) << 8);
47 }
48 
byteswap8(uint64_t num)49 uint64_t byteswap8(uint64_t num) {
50     num = ((num & 0xFFFFFFFF00000000) >> 32) | ((num & 0x00000000FFFFFFFF) << 32);
51     num = ((num & 0xFFFF0000FFFF0000) >> 16) | ((num & 0x0000FFFF0000FFFF) << 16);
52     return ((num & 0xFF00FF00FF00FF00) >> 8) | ((num & 0x00FF00FF00FF00FF) << 8);
53 }
54 
byteswap_float(float num)55 float byteswap_float(float num) {
56     uint32_t answer = 0;
57     memcpy(&answer, &num, 4);
58     answer = byteswap4(answer);
59     memcpy(&num, &answer, 4);
60     return num;
61 }
62 
byteswap_double(double num)63 double byteswap_double(double num) {
64     uint64_t answer = 0;
65     memcpy(&answer, &num, 8);
66     answer = byteswap8(answer);
67     memcpy(&num, &answer, 8);
68     return num;
69 }
70