Line data Source code
1 : // Copyright (c) 2014-2018 The Bitcoin Core developers 2 : // Distributed under the MIT software license, see the accompanying 3 : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 : 5 : #ifndef BITCOIN_COMPAT_ENDIAN_H 6 : #define BITCOIN_COMPAT_ENDIAN_H 7 : 8 : #if defined(HAVE_CONFIG_H) 9 : #include <config/bitcoin-config.h> 10 : #endif 11 : 12 : #include <compat/byteswap.h> 13 : 14 : #include <stdint.h> 15 : 16 : #if defined(HAVE_ENDIAN_H) 17 : #include <endian.h> 18 : #elif defined(HAVE_SYS_ENDIAN_H) 19 : #include <sys/endian.h> 20 : #endif 21 : 22 : #ifndef HAVE_CONFIG_H 23 : // While not technically a supported configuration, defaulting to defining these 24 : // DECLs when we were compiled without autotools makes it easier for other build 25 : // systems to build things like libbitcoinconsensus for strange targets. 26 : #ifdef htobe16 27 : #define HAVE_DECL_HTOBE16 1 28 : #endif 29 : #ifdef htole16 30 : #define HAVE_DECL_HTOLE16 1 31 : #endif 32 : #ifdef be16toh 33 : #define HAVE_DECL_BE16TOH 1 34 : #endif 35 : #ifdef le16toh 36 : #define HAVE_DECL_LE16TOH 1 37 : #endif 38 : 39 : #ifdef htobe32 40 : #define HAVE_DECL_HTOBE32 1 41 : #endif 42 : #ifdef htole32 43 : #define HAVE_DECL_HTOLE32 1 44 : #endif 45 : #ifdef be32toh 46 : #define HAVE_DECL_BE32TOH 1 47 : #endif 48 : #ifdef le32toh 49 : #define HAVE_DECL_LE32TOH 1 50 : #endif 51 : 52 : #ifdef htobe64 53 : #define HAVE_DECL_HTOBE64 1 54 : #endif 55 : #ifdef htole64 56 : #define HAVE_DECL_HTOLE64 1 57 : #endif 58 : #ifdef be64toh 59 : #define HAVE_DECL_BE64TOH 1 60 : #endif 61 : #ifdef le64toh 62 : #define HAVE_DECL_LE64TOH 1 63 : #endif 64 : 65 : #endif // HAVE_CONFIG_H 66 : 67 : #if defined(WORDS_BIGENDIAN) 68 : 69 : #if HAVE_DECL_HTOBE16 == 0 70 : inline uint16_t htobe16(uint16_t host_16bits) 71 : { 72 : return host_16bits; 73 : } 74 : #endif // HAVE_DECL_HTOBE16 75 : 76 : #if HAVE_DECL_HTOLE16 == 0 77 : inline uint16_t htole16(uint16_t host_16bits) 78 : { 79 : return bswap_16(host_16bits); 80 : } 81 : #endif // HAVE_DECL_HTOLE16 82 : 83 : #if HAVE_DECL_BE16TOH == 0 84 : inline uint16_t be16toh(uint16_t big_endian_16bits) 85 : { 86 : return big_endian_16bits; 87 : } 88 : #endif // HAVE_DECL_BE16TOH 89 : 90 : #if HAVE_DECL_LE16TOH == 0 91 : inline uint16_t le16toh(uint16_t little_endian_16bits) 92 : { 93 : return bswap_16(little_endian_16bits); 94 : } 95 : #endif // HAVE_DECL_LE16TOH 96 : 97 : #if HAVE_DECL_HTOBE32 == 0 98 : inline uint32_t htobe32(uint32_t host_32bits) 99 : { 100 : return host_32bits; 101 : } 102 : #endif // HAVE_DECL_HTOBE32 103 : 104 : #if HAVE_DECL_HTOLE32 == 0 105 : inline uint32_t htole32(uint32_t host_32bits) 106 : { 107 : return bswap_32(host_32bits); 108 : } 109 : #endif // HAVE_DECL_HTOLE32 110 : 111 : #if HAVE_DECL_BE32TOH == 0 112 : inline uint32_t be32toh(uint32_t big_endian_32bits) 113 : { 114 : return big_endian_32bits; 115 : } 116 : #endif // HAVE_DECL_BE32TOH 117 : 118 : #if HAVE_DECL_LE32TOH == 0 119 : inline uint32_t le32toh(uint32_t little_endian_32bits) 120 : { 121 : return bswap_32(little_endian_32bits); 122 : } 123 : #endif // HAVE_DECL_LE32TOH 124 : 125 : #if HAVE_DECL_HTOBE64 == 0 126 : inline uint64_t htobe64(uint64_t host_64bits) 127 : { 128 : return host_64bits; 129 : } 130 : #endif // HAVE_DECL_HTOBE64 131 : 132 : #if HAVE_DECL_HTOLE64 == 0 133 : inline uint64_t htole64(uint64_t host_64bits) 134 : { 135 : return bswap_64(host_64bits); 136 : } 137 : #endif // HAVE_DECL_HTOLE64 138 : 139 : #if HAVE_DECL_BE64TOH == 0 140 : inline uint64_t be64toh(uint64_t big_endian_64bits) 141 : { 142 : return big_endian_64bits; 143 : } 144 : #endif // HAVE_DECL_BE64TOH 145 : 146 : #if HAVE_DECL_LE64TOH == 0 147 : inline uint64_t le64toh(uint64_t little_endian_64bits) 148 : { 149 : return bswap_64(little_endian_64bits); 150 : } 151 : #endif // HAVE_DECL_LE64TOH 152 : 153 : #else // WORDS_BIGENDIAN 154 : 155 : #if HAVE_DECL_HTOBE16 == 0 156 : inline uint16_t htobe16(uint16_t host_16bits) 157 : { 158 : return bswap_16(host_16bits); 159 : } 160 : #endif // HAVE_DECL_HTOBE16 161 : 162 : #if HAVE_DECL_HTOLE16 == 0 163 2904140 : inline uint16_t htole16(uint16_t host_16bits) 164 : { 165 2904140 : return host_16bits; 166 : } 167 : #endif // HAVE_DECL_HTOLE16 168 : 169 : #if HAVE_DECL_BE16TOH == 0 170 : inline uint16_t be16toh(uint16_t big_endian_16bits) 171 : { 172 : return bswap_16(big_endian_16bits); 173 : } 174 : #endif // HAVE_DECL_BE16TOH 175 : 176 : #if HAVE_DECL_LE16TOH == 0 177 904255 : inline uint16_t le16toh(uint16_t little_endian_16bits) 178 : { 179 904255 : return little_endian_16bits; 180 : } 181 : #endif // HAVE_DECL_LE16TOH 182 : 183 : #if HAVE_DECL_HTOBE32 == 0 184 181901453 : inline uint32_t htobe32(uint32_t host_32bits) 185 : { 186 181901453 : return bswap_32(host_32bits); 187 : } 188 : #endif // HAVE_DECL_HTOBE32 189 : 190 : #if HAVE_DECL_HTOLE32 == 0 191 156592642 : inline uint32_t htole32(uint32_t host_32bits) 192 : { 193 156592642 : return host_32bits; 194 : } 195 : #endif // HAVE_DECL_HTOLE32 196 : 197 : #if HAVE_DECL_BE32TOH == 0 198 20928462 : inline uint32_t be32toh(uint32_t big_endian_32bits) 199 : { 200 20928462 : return bswap_32(big_endian_32bits); 201 : } 202 : #endif // HAVE_DECL_BE32TOH 203 : 204 : #if HAVE_DECL_LE32TOH == 0 205 159751648 : inline uint32_t le32toh(uint32_t little_endian_32bits) 206 : { 207 159751648 : return little_endian_32bits; 208 : } 209 : #endif // HAVE_DECL_LE32TOH 210 : 211 : #if HAVE_DECL_HTOBE64 == 0 212 264569314 : inline uint64_t htobe64(uint64_t host_64bits) 213 : { 214 264569314 : return bswap_64(host_64bits); 215 : } 216 : #endif // HAVE_DECL_HTOBE64 217 : 218 : #if HAVE_DECL_HTOLE64 == 0 219 50906666 : inline uint64_t htole64(uint64_t host_64bits) 220 : { 221 50906666 : return host_64bits; 222 : } 223 : #endif // HAVE_DECL_HTOLE64 224 : 225 : #if HAVE_DECL_BE64TOH == 0 226 446711279 : inline uint64_t be64toh(uint64_t big_endian_64bits) 227 : { 228 446711279 : return bswap_64(big_endian_64bits); 229 : } 230 : #endif // HAVE_DECL_BE64TOH 231 : 232 : #if HAVE_DECL_LE64TOH == 0 233 31381580 : inline uint64_t le64toh(uint64_t little_endian_64bits) 234 : { 235 31381580 : return little_endian_64bits; 236 : } 237 : #endif // HAVE_DECL_LE64TOH 238 : 239 : #endif // WORDS_BIGENDIAN 240 : 241 : #endif // BITCOIN_COMPAT_ENDIAN_H