| endian.h - blind - suckless command-line video editing utility | |
| git clone git://git.suckless.org/blind | |
| Log | |
| Files | |
| Refs | |
| README | |
| 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 |