41 #define TDS_GET_A1LE(ptr) (((uint8_t *)(ptr))[0]) 42 #define TDS_GET_A1BE(ptr) TDS_GET_A1LE(ptr) 43 #define TDS_GET_UA1LE(ptr) TDS_GET_A1LE(ptr) 44 #define TDS_GET_UA1BE(ptr) TDS_GET_A1LE(ptr) 46 #define TDS_PUT_A1LE(ptr,val) do { ((uint8_t *)(ptr))[0] = (val); } while(0) 47 #define TDS_PUT_A1BE(ptr,val) TDS_PUT_A1LE(ptr,val) 48 #define TDS_PUT_UA1LE(ptr,val) TDS_PUT_A1LE(ptr,val) 49 #define TDS_PUT_UA1BE(ptr,val) TDS_PUT_A1LE(ptr,val) 52 #define TDS_GET_UA2LE(ptr) (((uint8_t *)(ptr))[1] * 0x100u + ((uint8_t *)(ptr))[0]) 53 #define TDS_GET_UA2BE(ptr) (((uint8_t *)(ptr))[0] * 0x100u + ((uint8_t *)(ptr))[1]) 54 #define TDS_GET_A2LE(ptr) TDS_GET_UA2LE(ptr) 55 #define TDS_GET_A2BE(ptr) TDS_GET_UA2BE(ptr) 57 #define TDS_PUT_UA2LE(ptr,val) do {\ 58 ((uint8_t *)(ptr))[1] = (uint8_t)((val)>>8); ((uint8_t *)(ptr))[0] = (uint8_t)(val); } while(0) 59 #define TDS_PUT_UA2BE(ptr,val) do {\ 60 ((uint8_t *)(ptr))[0] = (uint8_t)((val)>>8); ((uint8_t *)(ptr))[1] = (uint8_t)(val); } while(0) 61 #define TDS_PUT_A2LE(ptr,val) TDS_PUT_UA2LE(ptr,val) 62 #define TDS_PUT_A2BE(ptr,val) TDS_PUT_UA2BE(ptr,val) 65 #define TDS_GET_UA4LE(ptr) \ 66 (((uint8_t *)(ptr))[3] * 0x1000000u + ((uint8_t *)(ptr))[2] * 0x10000u +\ 67 ((uint8_t *)(ptr))[1] * 0x100u + ((uint8_t *)(ptr))[0]) 68 #define TDS_GET_UA4BE(ptr) \ 69 (((uint8_t *)(ptr))[0] * 0x1000000u + ((uint8_t *)(ptr))[1] * 0x10000u +\ 70 ((uint8_t *)(ptr))[2] * 0x100u + ((uint8_t *)(ptr))[3]) 71 #define TDS_GET_A4LE(ptr) TDS_GET_UA4LE(ptr) 72 #define TDS_GET_A4BE(ptr) TDS_GET_UA4BE(ptr) 74 #define TDS_PUT_UA4LE(ptr,val) do {\ 75 ((uint8_t *)(ptr))[3] = (uint8_t)((val)>>24); ((uint8_t *)(ptr))[2] = (uint8_t)((val)>>16);\ 76 ((uint8_t *)(ptr))[1] = (uint8_t)((val)>>8); ((uint8_t *)(ptr))[0] = (uint8_t)(val); } while(0) 77 #define TDS_PUT_UA4BE(ptr,val) do {\ 78 ((uint8_t *)(ptr))[0] = (uint8_t)((val)>>24); ((uint8_t *)(ptr))[1] = (uint8_t)((val)>>16);\ 79 ((uint8_t *)(ptr))[2] = (uint8_t)((val)>>8); ((uint8_t *)(ptr))[3] = (uint8_t)(val); } while(0) 80 #define TDS_PUT_A4LE(ptr,val) TDS_PUT_UA4LE(ptr,val) 81 #define TDS_PUT_A4BE(ptr,val) TDS_PUT_UA4BE(ptr,val) 84 # define TDS_MAY_ALIAS __attribute__((__may_alias__)) 86 # define TDS_MAY_ALIAS 101 #ifdef WORDS_BIGENDIAN 102 # define TDS_GET_A1(ptr) TDS_GET_A1BE(ptr) 103 # define TDS_GET_UA1(ptr) TDS_GET_UA1BE(ptr) 104 # define TDS_GET_A2(ptr) TDS_GET_A2BE(ptr) 105 # define TDS_GET_UA2(ptr) TDS_GET_UA2BE(ptr) 106 # define TDS_GET_A4(ptr) TDS_GET_A4BE(ptr) 107 # define TDS_GET_UA4(ptr) TDS_GET_UA4BE(ptr) 110 # define TDS_GET_A2BE(ptr) (((TDS_BYTE_CONVERT2*)(ptr))->usi) 111 # define TDS_GET_A4BE(ptr) (((TDS_BYTE_CONVERT4*)(ptr))->ui) 113 # define TDS_PUT_A1(ptr,val) TDS_PUT_A1BE(ptr,val) 114 # define TDS_PUT_UA1(ptr,val) TDS_PUT_UA1BE(ptr,val) 115 # define TDS_PUT_A2(ptr,val) TDS_PUT_A2BE(ptr,val) 116 # define TDS_PUT_UA2(ptr,val) TDS_PUT_UA2BE(ptr,val) 117 # define TDS_PUT_A4(ptr,val) TDS_PUT_A4BE(ptr,val) 118 # define TDS_PUT_UA4(ptr,val) TDS_PUT_UA4BE(ptr,val) 121 # define TDS_PUT_A2BE(ptr,val) (((TDS_BYTE_CONVERT2*)(ptr))->usi = (val)) 122 # define TDS_PUT_A4BE(ptr,val) (((TDS_BYTE_CONVERT4*)(ptr))->ui = (val)) 123 # define TDS_HOST2LE(val) TDS_BYTE_SWAP16(val) 124 # define TDS_HOST4LE(val) TDS_BYTE_SWAP32(val) 125 # define TDS_HOST2BE(val) (val) 126 # define TDS_HOST4BE(val) (val) 128 # define TDS_GET_A1(ptr) TDS_GET_A1LE(ptr) 129 # define TDS_GET_UA1(ptr) TDS_GET_UA1LE(ptr) 130 # define TDS_GET_A2(ptr) TDS_GET_A2LE(ptr) 131 # define TDS_GET_UA2(ptr) TDS_GET_UA2LE(ptr) 132 # define TDS_GET_A4(ptr) TDS_GET_A4LE(ptr) 133 # define TDS_GET_UA4(ptr) TDS_GET_UA4LE(ptr) 136 # define TDS_GET_A2LE(ptr) (((TDS_BYTE_CONVERT2*)(ptr))->usi) 137 # define TDS_GET_A4LE(ptr) (((TDS_BYTE_CONVERT4*)(ptr))->ui) 139 # define TDS_PUT_A1(ptr,val) TDS_PUT_A1LE(ptr,val) 140 # define TDS_PUT_UA1(ptr,val) TDS_PUT_UA1LE(ptr,val) 141 # define TDS_PUT_A2(ptr,val) TDS_PUT_A2LE(ptr,val) 142 # define TDS_PUT_UA2(ptr,val) TDS_PUT_UA2LE(ptr,val) 143 # define TDS_PUT_A4(ptr,val) TDS_PUT_A4LE(ptr,val) 144 # define TDS_PUT_UA4(ptr,val) TDS_PUT_UA4LE(ptr,val) 147 # define TDS_PUT_A2LE(ptr,val) (((TDS_BYTE_CONVERT2*)(ptr))->usi = (val)) 148 # define TDS_PUT_A4LE(ptr,val) (((TDS_BYTE_CONVERT4*)(ptr))->ui = (val)) 149 # define TDS_HOST2LE(val) (val) 150 # define TDS_HOST4LE(val) (val) 151 # define TDS_HOST2BE(val) TDS_BYTE_SWAP16(val) 152 # define TDS_HOST4BE(val) TDS_BYTE_SWAP32(val) 157 #if defined(__i386__) || defined(__amd64__) || defined(__CRIS__) ||\ 158 defined(__powerpc__) || defined(__powerpc64__) || defined(__ppc__) || defined(__ppc64__) ||\ 159 defined(__s390__) || defined(__s390x__) || defined(__m68k__) ||\ 160 (defined(_MSC_VER) && (defined(_M_AMD64) || defined(_M_IX86) || defined(_M_X64))) ||\ 161 defined(__ARM_FEATURE_UNALIGNED) ||\ 162 defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_8__) ||\ 163 (defined(_M_ARM) && (_M_ARM >= 7)) 164 # ifdef WORDS_BIGENDIAN 165 # undef TDS_GET_UA2BE 166 # undef TDS_GET_UA4BE 167 # define TDS_GET_UA2BE(ptr) TDS_GET_A2BE(ptr) 168 # define TDS_GET_UA4BE(ptr) TDS_GET_A4BE(ptr) 170 # undef TDS_PUT_UA2BE 171 # undef TDS_PUT_UA4BE 172 # define TDS_PUT_UA2BE(ptr,val) TDS_PUT_A2BE(ptr,val) 173 # define TDS_PUT_UA4BE(ptr,val) TDS_PUT_A4BE(ptr,val) 175 # undef TDS_GET_UA2LE 176 # undef TDS_GET_UA4LE 177 # define TDS_GET_UA2LE(ptr) TDS_GET_A2LE(ptr) 178 # define TDS_GET_UA4LE(ptr) TDS_GET_A4LE(ptr) 180 # undef TDS_PUT_UA2LE 181 # undef TDS_PUT_UA4LE 182 # define TDS_PUT_UA2LE(ptr,val) TDS_PUT_A2LE(ptr,val) 183 # define TDS_PUT_UA4LE(ptr,val) TDS_PUT_A4LE(ptr,val) 187 #if defined(__linux__) && defined(__GNUC__) && (defined(__i386__) || defined(__amd64__)) 188 # include <byteswap.h> 189 # undef TDS_GET_UA2BE 190 # undef TDS_GET_UA4BE 191 # define TDS_GET_UA2BE(ptr) ({ uint16_t _tds_si = TDS_GET_UA2LE(ptr); bswap_16(_tds_si); }) 192 # define TDS_GET_UA4BE(ptr) ({ uint32_t _tds_i = TDS_GET_UA4LE(ptr); bswap_32(_tds_i); }) 194 # undef TDS_PUT_UA2BE 195 # undef TDS_PUT_UA4BE 196 # define TDS_PUT_UA2BE(ptr,val) do {\ 197 uint16_t _tds_si = bswap_16(val); TDS_PUT_UA2LE(ptr,_tds_si); } while(0) 198 # define TDS_PUT_UA4BE(ptr,val) do {\ 199 uint32_t _tds_i = bswap_32(val); TDS_PUT_UA4LE(ptr,_tds_i); } while(0) 202 #if defined(__GNUC__) && defined(__powerpc__) && defined(WORDS_BIGENDIAN) 203 # undef TDS_GET_UA2LE 204 # undef TDS_GET_UA4LE 205 static inline uint16_t
206 TDS_GET_UA2LE(
void *ptr)
209 __asm__ (
"lhbrx %0,0,%1\n" :
"=r" (res) :
"r" (ptr),
"m"(*(uint16_t *)ptr));
210 return (uint16_t) res;
212 static inline uint32_t
213 TDS_GET_UA4LE(
void *ptr)
216 __asm__ (
"lwbrx %0,0,%1\n" :
"=r" (res) :
"r" (ptr),
"m"(*(uint32_t *)ptr));
217 return (uint32_t) res;
220 # undef TDS_PUT_UA2LE 221 # undef TDS_PUT_UA4LE 223 TDS_PUT_UA2LE(
void *ptr,
unsigned data)
225 __asm__ (
"sthbrx %1,0,%2\n" :
"=m" (*(uint16_t *)ptr) :
"r" (data),
"r" (ptr));
228 TDS_PUT_UA4LE(
void *ptr,
unsigned data)
230 __asm__ (
"stwbrx %1,0,%2\n" :
"=m" (*(uint32_t *)ptr) :
"r" (data),
"r" (ptr));