endian.h - blind - suckless command-line video editing utility
(HTM) git clone git://git.suckless.org/blind
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
endian.h (2965B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include <stdint.h>
3
4 #if defined(HAVE_ENDIAN_H)
5 # include <endian.h>
6 #elif defined(HAVE_SYS_ENDIAN_H)
7 # include <sys/endian.h>
8 #endif
9
10 #if !defined(HAVE_ENDIAN_H) && !defined(HAVE_SYS_ENDIAN_H)
11
12 # if defined(HOST_ENDIAN_IS_LITTLE_ENDIAN_16)
13 # if !defined(htole16)
14 # define htole16(x) (x)
15 # endif
16 # if !defined(htole16)
17 # define letoh16(x) (x)
18 # endif
19 # endif
20 # if defined(HOST_ENDIAN_IS_LITTLE_ENDIAN_32)
21 # if !defined(htole32)
22 # define htole32(x) (x)
23 # endif
24 # if !defined(htole32)
25 # define letoh32(x) (x)
26 # endif
27 # endif
28 # if defined(HOST_ENDIAN_IS_LITTLE_ENDIAN_64)
29 # if !defined(htole64)
30 # define htole16(x) (x)
31 # endif
32 # if !defined(htole64)
33 # define letoh16(x) (x)
34 # endif
35 # endif
36
37 # if !defined(htole16)
38 # define htole16 blind_htole16
39 static inline uint16_t
40 blind_htole16(uint16_t h)
41 {
42 union {
43 unsigned char bytes[2];
44 uint16_t value;
45 } d;
46 d.bytes[0] = h;
47 d.bytes[1] = h >> 8;
48 return d.value;
49 }
50 # endif
51
52 # if !defined(htole32)
53 # define htole32 blind_htole32
54 static inline uint32_t
55 blind_htole32(uint32_t h)
56 {
57 union {
58 unsigned char bytes[4];
59 uint32_t value;
60 } d;
61 d.bytes[0] = h;
62 d.bytes[1] = h >> 8;
63 d.bytes[2] = h >> 16;
64 d.bytes[3] = h >> 24;
65 return d.value;
66 }
67 # endif
68
69 # if !defined(htole64)
70 # define htole64 blind_htole64
71 static inline uint64_t
72 blind_htole64(uint64_t h)
73 {
74 union {
75 unsigned char bytes[8];
76 uint64_t value;
77 } d;
78 d.bytes[0] = h;
79 d.bytes[1] = h >> 8;
80 d.bytes[2] = h >> 16;
81 d.bytes[3] = h >> 24;
82 d.bytes[4] = h >> 32;
83 d.bytes[5] = h >> 40;
84 d.bytes[6] = h >> 48;
85 d.bytes[7] = h >> 56;
86 return d.value;
87 }
88 # endif
89
90 # if !defined(le16toh)
91 # if defined(letoh16)
92 # define le16toh letoh16
93 # else
94 # define le16toh blind_le16toh
95 static inline uint16_t
96 blind_le16toh(uint16_t le)
97 {
98 unsigned char *bytes = (unsigned char *)≤
99 return ((uint16_t)(bytes[1]) << 8) | (uint16_t)(bytes[0]);
100 }
101 # endif
102 # endif
103
104 # if !defined(le32toh)
105 # if defined(letoh32)
106 # define le32toh letoh32
107 # else
108 # define le32toh blind_le32toh
109 static inline uint32_t
110 blind_le32toh(uint32_t le)
111 {
112 unsigned char *bytes = (unsigned char *)≤
113 return ((uint32_t)(bytes[3]) << 24) |
114 ((uint32_t)(bytes[2]) << 16) |
115 ((uint32_t)(bytes[1]) << 8) |
116 (uint32_t)(bytes[0]);
117 }
118 # endif
119 # endif
120
121 # if !defined(le64toh)
122 # if defined(letoh64)
123 # define le64toh letoh64
124 # else
125 # define le64toh blind_le64toh
126 static inline uint64_t
127 blind_le64toh(uint64_t le)
128 {
129 unsigned char *bytes = (unsigned char *)≤
130 return ((uint64_t)(bytes[7]) << 56) |
131 ((uint64_t)(bytes[6]) << 48) |
132 ((uint64_t)(bytes[5]) << 40) |
133 ((uint64_t)(bytes[4]) << 32) |
134 ((uint64_t)(bytes[3]) << 24) |
135 ((uint64_t)(bytes[2]) << 16) |
136 ((uint64_t)(bytes[1]) << 8) |
137 (uint64_t)(bytes[0]);
138 }
139 # endif
140 # endif
141
142 #elif defined(HAVE_OPENBSD_ENDIAN)
143 # define le16toh letoh16
144 # define le32toh letoh32
145 # define le64toh letoh64
146 #endif