39 #define TDS_GET_A1LE(ptr)  (((uint8_t *)(ptr))[0]) 
   40 #define TDS_GET_A1BE(ptr)  TDS_GET_A1LE(ptr) 
   41 #define TDS_GET_UA1LE(ptr) TDS_GET_A1LE(ptr) 
   42 #define TDS_GET_UA1BE(ptr) TDS_GET_A1LE(ptr) 
   44 #define TDS_PUT_A1LE(ptr,val)  do { ((uint8_t *)(ptr))[0] = (val); } while(0) 
   45 #define TDS_PUT_A1BE(ptr,val)  TDS_PUT_A1LE(ptr,val) 
   46 #define TDS_PUT_UA1LE(ptr,val) TDS_PUT_A1LE(ptr,val) 
   47 #define TDS_PUT_UA1BE(ptr,val) TDS_PUT_A1LE(ptr,val) 
   50 #define TDS_GET_UA2LE(ptr) (((uint8_t *)(ptr))[1] * 0x100u + ((uint8_t *)(ptr))[0]) 
   51 #define TDS_GET_UA2BE(ptr) (((uint8_t *)(ptr))[0] * 0x100u + ((uint8_t *)(ptr))[1]) 
   52 #define TDS_GET_A2LE(ptr) TDS_GET_UA2LE(ptr) 
   53 #define TDS_GET_A2BE(ptr) TDS_GET_UA2BE(ptr) 
   55 #define TDS_PUT_UA2LE(ptr,val) do {\ 
   56  ((uint8_t *)(ptr))[1] = (uint8_t)((val)>>8); ((uint8_t *)(ptr))[0] = (uint8_t)(val); } while(0) 
   57 #define TDS_PUT_UA2BE(ptr,val) do {\ 
   58  ((uint8_t *)(ptr))[0] = (uint8_t)((val)>>8); ((uint8_t *)(ptr))[1] = (uint8_t)(val); } while(0) 
   59 #define TDS_PUT_A2LE(ptr,val) TDS_PUT_UA2LE(ptr,val) 
   60 #define TDS_PUT_A2BE(ptr,val) TDS_PUT_UA2BE(ptr,val) 
   63 #define TDS_GET_UA4LE(ptr) \ 
   64     (((uint8_t *)(ptr))[3] * 0x1000000u + ((uint8_t *)(ptr))[2] * 0x10000u +\ 
   65      ((uint8_t *)(ptr))[1] * 0x100u + ((uint8_t *)(ptr))[0]) 
   66 #define TDS_GET_UA4BE(ptr) \ 
   67     (((uint8_t *)(ptr))[0] * 0x1000000u + ((uint8_t *)(ptr))[1] * 0x10000u +\ 
   68      ((uint8_t *)(ptr))[2] * 0x100u + ((uint8_t *)(ptr))[3]) 
   69 #define TDS_GET_A4LE(ptr) TDS_GET_UA4LE(ptr) 
   70 #define TDS_GET_A4BE(ptr) TDS_GET_UA4BE(ptr) 
   72 #define TDS_PUT_UA4LE(ptr,val) do {\ 
   73  ((uint8_t *)(ptr))[3] = (uint8_t)((val)>>24); ((uint8_t *)(ptr))[2] = (uint8_t)((val)>>16);\ 
   74  ((uint8_t *)(ptr))[1] = (uint8_t)((val)>>8); ((uint8_t *)(ptr))[0] = (uint8_t)(val); } while(0) 
   75 #define TDS_PUT_UA4BE(ptr,val) do {\ 
   76  ((uint8_t *)(ptr))[0] = (uint8_t)((val)>>24); ((uint8_t *)(ptr))[1] = (uint8_t)((val)>>16);\ 
   77  ((uint8_t *)(ptr))[2] = (uint8_t)((val)>>8); ((uint8_t *)(ptr))[3] = (uint8_t)(val); } while(0) 
   78 #define TDS_PUT_A4LE(ptr,val) TDS_PUT_UA4LE(ptr,val) 
   79 #define TDS_PUT_A4BE(ptr,val) TDS_PUT_UA4BE(ptr,val) 
   82 #  define TDS_MAY_ALIAS __attribute__((__may_alias__)) 
   84 #  define TDS_MAY_ALIAS 
   99 #ifdef WORDS_BIGENDIAN 
  100 # define TDS_GET_A1(ptr)  TDS_GET_A1BE(ptr) 
  101 # define TDS_GET_UA1(ptr) TDS_GET_UA1BE(ptr) 
  102 # define TDS_GET_A2(ptr)  TDS_GET_A2BE(ptr) 
  103 # define TDS_GET_UA2(ptr) TDS_GET_UA2BE(ptr) 
  104 # define TDS_GET_A4(ptr)  TDS_GET_A4BE(ptr) 
  105 # define TDS_GET_UA4(ptr) TDS_GET_UA4BE(ptr) 
  108 # define TDS_GET_A2BE(ptr) (((TDS_BYTE_CONVERT2*)(ptr))->usi) 
  109 # define TDS_GET_A4BE(ptr) (((TDS_BYTE_CONVERT4*)(ptr))->ui) 
  111 # define TDS_PUT_A1(ptr,val)  TDS_PUT_A1BE(ptr,val) 
  112 # define TDS_PUT_UA1(ptr,val) TDS_PUT_UA1BE(ptr,val) 
  113 # define TDS_PUT_A2(ptr,val)  TDS_PUT_A2BE(ptr,val) 
  114 # define TDS_PUT_UA2(ptr,val) TDS_PUT_UA2BE(ptr,val) 
  115 # define TDS_PUT_A4(ptr,val)  TDS_PUT_A4BE(ptr,val) 
  116 # define TDS_PUT_UA4(ptr,val) TDS_PUT_UA4BE(ptr,val) 
  119 # define TDS_PUT_A2BE(ptr,val) (((TDS_BYTE_CONVERT2*)(ptr))->usi = (val)) 
  120 # define TDS_PUT_A4BE(ptr,val) (((TDS_BYTE_CONVERT4*)(ptr))->ui = (val)) 
  121 # define TDS_HOST2LE(val) TDS_BYTE_SWAP16(val) 
  122 # define TDS_HOST4LE(val) TDS_BYTE_SWAP32(val) 
  123 # define TDS_HOST2BE(val) (val) 
  124 # define TDS_HOST4BE(val) (val) 
  126 # define TDS_GET_A1(ptr)  TDS_GET_A1LE(ptr) 
  127 # define TDS_GET_UA1(ptr) TDS_GET_UA1LE(ptr) 
  128 # define TDS_GET_A2(ptr)  TDS_GET_A2LE(ptr) 
  129 # define TDS_GET_UA2(ptr) TDS_GET_UA2LE(ptr) 
  130 # define TDS_GET_A4(ptr)  TDS_GET_A4LE(ptr) 
  131 # define TDS_GET_UA4(ptr) TDS_GET_UA4LE(ptr) 
  134 # define TDS_GET_A2LE(ptr) (((TDS_BYTE_CONVERT2*)(ptr))->usi) 
  135 # define TDS_GET_A4LE(ptr) (((TDS_BYTE_CONVERT4*)(ptr))->ui) 
  137 # define TDS_PUT_A1(ptr,val)  TDS_PUT_A1LE(ptr,val) 
  138 # define TDS_PUT_UA1(ptr,val) TDS_PUT_UA1LE(ptr,val) 
  139 # define TDS_PUT_A2(ptr,val)  TDS_PUT_A2LE(ptr,val) 
  140 # define TDS_PUT_UA2(ptr,val) TDS_PUT_UA2LE(ptr,val) 
  141 # define TDS_PUT_A4(ptr,val)  TDS_PUT_A4LE(ptr,val) 
  142 # define TDS_PUT_UA4(ptr,val) TDS_PUT_UA4LE(ptr,val) 
  145 # define TDS_PUT_A2LE(ptr,val) (((TDS_BYTE_CONVERT2*)(ptr))->usi = (val)) 
  146 # define TDS_PUT_A4LE(ptr,val) (((TDS_BYTE_CONVERT4*)(ptr))->ui = (val)) 
  147 # define TDS_HOST2LE(val) (val) 
  148 # define TDS_HOST4LE(val) (val) 
  149 # define TDS_HOST2BE(val) TDS_BYTE_SWAP16(val) 
  150 # define TDS_HOST4BE(val) TDS_BYTE_SWAP32(val) 
  155 #if defined(__i386__) || defined(__amd64__) || defined(__CRIS__) ||\ 
  156   defined(__powerpc__) || defined(__powerpc64__) || defined(__ppc__) || defined(__ppc64__) ||\ 
  157   defined(__s390__) || defined(__s390x__) || defined(__m68k__) ||\ 
  158   (defined(_MSC_VER) && (defined(_M_AMD64) || defined(_M_IX86) || defined(_M_X64))) ||\ 
  159   defined(__ARM_FEATURE_UNALIGNED) ||\ 
  160   defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_8__) ||\ 
  161   (defined(_M_ARM) && (_M_ARM >= 7)) 
  162 # ifdef WORDS_BIGENDIAN 
  163 #  undef TDS_GET_UA2BE 
  164 #  undef TDS_GET_UA4BE 
  165 #  define TDS_GET_UA2BE(ptr) TDS_GET_A2BE(ptr) 
  166 #  define TDS_GET_UA4BE(ptr) TDS_GET_A4BE(ptr) 
  168 #  undef TDS_PUT_UA2BE 
  169 #  undef TDS_PUT_UA4BE 
  170 #  define TDS_PUT_UA2BE(ptr,val) TDS_PUT_A2BE(ptr,val) 
  171 #  define TDS_PUT_UA4BE(ptr,val) TDS_PUT_A4BE(ptr,val) 
  173 #  undef TDS_GET_UA2LE 
  174 #  undef TDS_GET_UA4LE 
  175 #  define TDS_GET_UA2LE(ptr) TDS_GET_A2LE(ptr) 
  176 #  define TDS_GET_UA4LE(ptr) TDS_GET_A4LE(ptr) 
  178 #  undef TDS_PUT_UA2LE 
  179 #  undef TDS_PUT_UA4LE 
  180 #  define TDS_PUT_UA2LE(ptr,val) TDS_PUT_A2LE(ptr,val) 
  181 #  define TDS_PUT_UA4LE(ptr,val) TDS_PUT_A4LE(ptr,val) 
  187 #if defined (__GNUC__) && (__GNUC__ >= 4) && defined (__OPTIMIZE__) 
  188 # define TDS_BSWAP16(val) __builtin_bswap16(val) 
  189 # define TDS_BSWAP32(val) __builtin_bswap32(val) 
  190 #elif defined(_MSC_VER) 
  191 # define TDS_BSWAP16(val) _byteswap_ushort(val) 
  192 # define TDS_BSWAP32(val) _byteswap_ulong(val) 
  195 #if defined(TDS_BSWAP16) && !defined(WORDS_BIGENDIAN) 
  196 # undef TDS_GET_UA2BE 
  197 # undef TDS_GET_UA4BE 
  198 # define TDS_GET_UA2BE(ptr) TDS_BSWAP16(TDS_GET_UA2LE(ptr)) 
  199 # define TDS_GET_UA4BE(ptr) TDS_BSWAP32(TDS_GET_UA4LE(ptr)) 
  201 # undef TDS_PUT_UA2BE 
  202 # undef TDS_PUT_UA4BE 
  203 # define TDS_PUT_UA2BE(ptr,val) do {\ 
  204    uint16_t _tds_si = TDS_BSWAP16(val); TDS_PUT_UA2LE(ptr,_tds_si); } while(0) 
  205 # define TDS_PUT_UA4BE(ptr,val) do {\ 
  206    uint32_t _tds_i = TDS_BSWAP32(val); TDS_PUT_UA4LE(ptr,_tds_i); } while(0) 
  207 #elif defined(TDS_BSWAP16) && defined(WORDS_BIGENDIAN) 
  208 # undef TDS_GET_UA2LE 
  209 # undef TDS_GET_UA4LE 
  210 # define TDS_GET_UA2LE(ptr) TDS_BSWAP16(TDS_GET_UA2BE(ptr)) 
  211 # define TDS_GET_UA4LE(ptr) TDS_BSWAP32(TDS_GET_UA4BE(ptr)) 
  213 # undef TDS_PUT_UA2LE 
  214 # undef TDS_PUT_UA4LE 
  215 # define TDS_PUT_UA2LE(ptr,val) do {\ 
  216    uint16_t _tds_si = TDS_BSWAP16(val); TDS_PUT_UA2BE(ptr,_tds_si); } while(0) 
  217 # define TDS_PUT_UA4LE(ptr,val) do {\ 
  218    uint32_t _tds_i = TDS_BSWAP32(val); TDS_PUT_UA4BE(ptr,_tds_i); } while(0) 
  221 #if defined(__GNUC__) && defined(__powerpc__) && defined(WORDS_BIGENDIAN) 
  222 # undef TDS_GET_UA2LE 
  223 # undef TDS_GET_UA4LE 
  224 static inline uint16_t
 
  225 TDS_GET_UA2LE(
void *ptr)
 
  228     __asm__ (
"lhbrx %0,0,%1\n" : 
"=r" (res) : 
"r" (ptr), 
"m"(*(uint16_t *)ptr));
 
  229     return (uint16_t) res;
 
  231 static inline uint32_t
 
  232 TDS_GET_UA4LE(
void *ptr)
 
  235     __asm__ (
"lwbrx %0,0,%1\n" : 
"=r" (res) : 
"r" (ptr), 
"m"(*(uint32_t *)ptr));
 
  236     return (uint32_t) res;
 
  239 # undef TDS_PUT_UA2LE 
  240 # undef TDS_PUT_UA4LE 
  242 TDS_PUT_UA2LE(
void *ptr, 
unsigned data)
 
  244     __asm__ (
"sthbrx %1,0,%2\n" : 
"=m" (*(uint16_t *)ptr) : 
"r" (data), 
"r" (ptr));
 
  247 TDS_PUT_UA4LE(
void *ptr, 
unsigned data)
 
  249     __asm__ (
"stwbrx %1,0,%2\n" : 
"=m" (*(uint32_t *)ptr) : 
"r" (data), 
"r" (ptr));