1*735d6239SKiyoung Kimdnl AC_NEED_BYTEORDER_H ( HEADER-TO-GENERATE ) 2*735d6239SKiyoung Kimdnl Copyright 2001-2002 by Dan Fandrich <[email protected]> 3*735d6239SKiyoung Kimdnl This file may be copied and used freely without restrictions. No warranty 4*735d6239SKiyoung Kimdnl is expressed or implied. 5*735d6239SKiyoung Kimdnl 6*735d6239SKiyoung Kimdnl Create a header file that guarantees that byte swapping macros of the 7*735d6239SKiyoung Kimdnl ntohl variety as well as the extended types included in OpenBSD and 8*735d6239SKiyoung Kimdnl NetBSD such as le32toh are defined. If possible, the standard ntohl 9*735d6239SKiyoung Kimdnl are overloaded as they are optimized for the given platform, but when 10*735d6239SKiyoung Kimdnl this is not possible (e.g. on a big-endian machine) they are defined 11*735d6239SKiyoung Kimdnl in this file. 12*735d6239SKiyoung Kim 13*735d6239SKiyoung Kimdnl Look for a symbol in a header file 14*735d6239SKiyoung Kimdnl AC_HAVE_SYMBOL ( IDENTIFIER, HEADER-FILE, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND ) 15*735d6239SKiyoung KimAC_DEFUN([AC_HAVE_SYMBOL], 16*735d6239SKiyoung Kim[ 17*735d6239SKiyoung KimAC_MSG_CHECKING(for $1 in $2) 18*735d6239SKiyoung KimAC_EGREP_CPP([symbol is present|\<$1\>],[ 19*735d6239SKiyoung Kim#include <$2> 20*735d6239SKiyoung Kim#ifdef $1 21*735d6239SKiyoung Kim symbol is present 22*735d6239SKiyoung Kim#endif 23*735d6239SKiyoung Kim ], 24*735d6239SKiyoung Kim[AC_MSG_RESULT(yes) 25*735d6239SKiyoung Kim$3 26*735d6239SKiyoung Kim], 27*735d6239SKiyoung Kim[AC_MSG_RESULT(no) 28*735d6239SKiyoung Kim$4 29*735d6239SKiyoung Kim])]) 30*735d6239SKiyoung Kim 31*735d6239SKiyoung Kim 32*735d6239SKiyoung Kimdnl Create a header file that defines extended byte swapping macros 33*735d6239SKiyoung KimAC_DEFUN([AC_NEED_BYTEORDER_H], 34*735d6239SKiyoung Kim[ 35*735d6239SKiyoung Kimchangequote(, )dnl 36*735d6239SKiyoung Kimac_dir=`echo $1|sed 's%/[^/][^/]*$%%'` 37*735d6239SKiyoung Kimchangequote([, ])dnl 38*735d6239SKiyoung Kimif test "$ac_dir" != "$1" && test "$ac_dir" != .; then 39*735d6239SKiyoung Kim # The file is in a subdirectory. 40*735d6239SKiyoung Kim test ! -d "$ac_dir" && mkdir "$ac_dir" 41*735d6239SKiyoung Kimfi 42*735d6239SKiyoung Kim 43*735d6239SKiyoung Kim# We're only interested in the target CPU, but it's not always set 44*735d6239SKiyoung Kimeffective_target="$target" 45*735d6239SKiyoung Kimif test "x$effective_target" = xNONE -o "x$effective_target" = x ; then 46*735d6239SKiyoung Kim effective_target="$host" 47*735d6239SKiyoung Kimfi 48*735d6239SKiyoung KimAC_SUBST(effective_target) 49*735d6239SKiyoung Kim 50*735d6239SKiyoung Kimcat > "$1" << EOF 51*735d6239SKiyoung Kim/* This file is generated automatically by configure */ 52*735d6239SKiyoung Kim/* It is valid only for the system type ${effective_target} */ 53*735d6239SKiyoung Kim 54*735d6239SKiyoung Kim#ifndef __BYTEORDER_H 55*735d6239SKiyoung Kim#define __BYTEORDER_H 56*735d6239SKiyoung Kim 57*735d6239SKiyoung KimEOF 58*735d6239SKiyoung Kim 59*735d6239SKiyoung Kimdnl First, do an endian check 60*735d6239SKiyoung KimAC_C_BIGENDIAN 61*735d6239SKiyoung Kim 62*735d6239SKiyoung Kimdnl Look for NetBSD-style extended byte swapping macros 63*735d6239SKiyoung KimAC_HAVE_SYMBOL(le32toh,machine/endian.h, 64*735d6239SKiyoung Kim [HAVE_LE32TOH=1 65*735d6239SKiyoung Kim cat >> "$1" << EOF 66*735d6239SKiyoung Kim/* extended byte swapping macros are already available */ 67*735d6239SKiyoung Kim#include <machine/endian.h> 68*735d6239SKiyoung Kim 69*735d6239SKiyoung KimEOF], 70*735d6239SKiyoung Kim 71*735d6239SKiyoung Kim[ 72*735d6239SKiyoung Kim 73*735d6239SKiyoung Kimdnl Look for standard byte swapping macros 74*735d6239SKiyoung KimAC_HAVE_SYMBOL(ntohl,arpa/inet.h, 75*735d6239SKiyoung Kim [cat >> "$1" << EOF 76*735d6239SKiyoung Kim/* ntohl and relatives live here */ 77*735d6239SKiyoung Kim#include <arpa/inet.h> 78*735d6239SKiyoung Kim 79*735d6239SKiyoung KimEOF], 80*735d6239SKiyoung Kim 81*735d6239SKiyoung Kim [AC_HAVE_SYMBOL(ntohl,netinet/in.h, 82*735d6239SKiyoung Kim [cat >> "$1" << EOF 83*735d6239SKiyoung Kim/* ntohl and relatives live here */ 84*735d6239SKiyoung Kim#include <netinet/in.h> 85*735d6239SKiyoung Kim 86*735d6239SKiyoung KimEOF],true)]) 87*735d6239SKiyoung Kim]) 88*735d6239SKiyoung Kim 89*735d6239SKiyoung Kimdnl Look for generic byte swapping macros 90*735d6239SKiyoung Kim 91*735d6239SKiyoung Kimdnl OpenBSD 92*735d6239SKiyoung KimAC_HAVE_SYMBOL(swap32,machine/endian.h, 93*735d6239SKiyoung Kim [cat >> "$1" << EOF 94*735d6239SKiyoung Kim/* swap32 and swap16 are defined in machine/endian.h */ 95*735d6239SKiyoung Kim 96*735d6239SKiyoung KimEOF], 97*735d6239SKiyoung Kim 98*735d6239SKiyoung Kim [ 99*735d6239SKiyoung Kimdnl Linux GLIBC 100*735d6239SKiyoung Kim AC_HAVE_SYMBOL(bswap_32,byteswap.h, 101*735d6239SKiyoung Kim [cat >> "$1" << EOF 102*735d6239SKiyoung Kim/* Define generic byte swapping functions */ 103*735d6239SKiyoung Kim#include <byteswap.h> 104*735d6239SKiyoung Kim#define swap16(x) bswap_16(x) 105*735d6239SKiyoung Kim#define swap32(x) bswap_32(x) 106*735d6239SKiyoung Kim#define swap64(x) bswap_64(x) 107*735d6239SKiyoung Kim 108*735d6239SKiyoung KimEOF], 109*735d6239SKiyoung Kim 110*735d6239SKiyoung Kim [ 111*735d6239SKiyoung Kimdnl NetBSD 112*735d6239SKiyoung Kim AC_HAVE_SYMBOL(bswap32,machine/endian.h, 113*735d6239SKiyoung Kim dnl We're already including machine/endian.h if this test succeeds 114*735d6239SKiyoung Kim [cat >> "$1" << EOF 115*735d6239SKiyoung Kim/* Define generic byte swapping functions */ 116*735d6239SKiyoung KimEOF 117*735d6239SKiyoung Kim if test "$HAVE_LE32TOH" != "1"; then 118*735d6239SKiyoung Kim echo '#include <machine/endian.h>'>> "$1" 119*735d6239SKiyoung Kim fi 120*735d6239SKiyoung Kimcat >> "$1" << EOF 121*735d6239SKiyoung Kim#define swap16(x) bswap16(x) 122*735d6239SKiyoung Kim#define swap32(x) bswap32(x) 123*735d6239SKiyoung Kim#define swap64(x) bswap64(x) 124*735d6239SKiyoung Kim 125*735d6239SKiyoung KimEOF], 126*735d6239SKiyoung Kim 127*735d6239SKiyoung Kim [ 128*735d6239SKiyoung Kimdnl FreeBSD 129*735d6239SKiyoung Kim AC_HAVE_SYMBOL(__byte_swap_long,sys/types.h, 130*735d6239SKiyoung Kim [cat >> "$1" << EOF 131*735d6239SKiyoung Kim/* Define generic byte swapping functions */ 132*735d6239SKiyoung Kim#include <sys/types.h> 133*735d6239SKiyoung Kim#define swap16(x) __byte_swap_word(x) 134*735d6239SKiyoung Kim#define swap32(x) __byte_swap_long(x) 135*735d6239SKiyoung Kim/* No optimized 64 bit byte swapping macro is available */ 136*735d6239SKiyoung Kim#define swap64(x) ((uint64_t)(((uint64_t)(x) << 56) & 0xff00000000000000ULL | \\ 137*735d6239SKiyoung Kim ((uint64_t)(x) << 40) & 0x00ff000000000000ULL | \\ 138*735d6239SKiyoung Kim ((uint64_t)(x) << 24) & 0x0000ff0000000000ULL | \\ 139*735d6239SKiyoung Kim ((uint64_t)(x) << 8) & 0x000000ff00000000ULL | \\ 140*735d6239SKiyoung Kim ((x) >> 8) & 0x00000000ff000000ULL | \\ 141*735d6239SKiyoung Kim ((x) >> 24) & 0x0000000000ff0000ULL | \\ 142*735d6239SKiyoung Kim ((x) >> 40) & 0x000000000000ff00ULL | \\ 143*735d6239SKiyoung Kim ((x) >> 56) & 0x00000000000000ffULL)) 144*735d6239SKiyoung Kim 145*735d6239SKiyoung KimEOF], 146*735d6239SKiyoung Kim 147*735d6239SKiyoung Kim [ 148*735d6239SKiyoung Kimdnl OS X 149*735d6239SKiyoung Kim AC_HAVE_SYMBOL(NXSwapLong,machine/byte_order.h, 150*735d6239SKiyoung Kim [cat >> "$1" << EOF 151*735d6239SKiyoung Kim/* Define generic byte swapping functions */ 152*735d6239SKiyoung Kim#include <machine/byte_order.h> 153*735d6239SKiyoung Kim#define swap16(x) NXSwapShort(x) 154*735d6239SKiyoung Kim#define swap32(x) NXSwapLong(x) 155*735d6239SKiyoung Kim#define swap64(x) NXSwapLongLong(x) 156*735d6239SKiyoung Kim 157*735d6239SKiyoung KimEOF], 158*735d6239SKiyoung Kim [ 159*735d6239SKiyoung Kim if test $ac_cv_c_bigendian = yes; then 160*735d6239SKiyoung Kim cat >> "$1" << EOF 161*735d6239SKiyoung Kim/* No other byte swapping functions are available on this big-endian system */ 162*735d6239SKiyoung Kim#define swap16(x) ((uint16_t)(((x) << 8) | ((uint16_t)(x) >> 8))) 163*735d6239SKiyoung Kim#define swap32(x) ((uint32_t)(((uint32_t)(x) << 24) & 0xff000000UL | \\ 164*735d6239SKiyoung Kim ((uint32_t)(x) << 8) & 0x00ff0000UL | \\ 165*735d6239SKiyoung Kim ((x) >> 8) & 0x0000ff00UL | \\ 166*735d6239SKiyoung Kim ((x) >> 24) & 0x000000ffUL)) 167*735d6239SKiyoung Kim#define swap64(x) ((uint64_t)(((uint64_t)(x) << 56) & 0xff00000000000000ULL | \\ 168*735d6239SKiyoung Kim ((uint64_t)(x) << 40) & 0x00ff000000000000ULL | \\ 169*735d6239SKiyoung Kim ((uint64_t)(x) << 24) & 0x0000ff0000000000ULL | \\ 170*735d6239SKiyoung Kim ((uint64_t)(x) << 8) & 0x000000ff00000000ULL | \\ 171*735d6239SKiyoung Kim ((x) >> 8) & 0x00000000ff000000ULL | \\ 172*735d6239SKiyoung Kim ((x) >> 24) & 0x0000000000ff0000ULL | \\ 173*735d6239SKiyoung Kim ((x) >> 40) & 0x000000000000ff00ULL | \\ 174*735d6239SKiyoung Kim ((x) >> 56) & 0x00000000000000ffULL)) 175*735d6239SKiyoung Kim 176*735d6239SKiyoung KimEOF 177*735d6239SKiyoung Kim else 178*735d6239SKiyoung Kim cat >> "$1" << EOF 179*735d6239SKiyoung Kim/* Use these as generic byteswapping macros on this little endian system */ 180*735d6239SKiyoung Kim#define swap16(x) ntohs(x) 181*735d6239SKiyoung Kim#define swap32(x) ntohl(x) 182*735d6239SKiyoung Kim/* No optimized 64 bit byte swapping macro is available */ 183*735d6239SKiyoung Kim#define swap64(x) ((uint64_t)(((uint64_t)(x) << 56) & 0xff00000000000000ULL | \\ 184*735d6239SKiyoung Kim ((uint64_t)(x) << 40) & 0x00ff000000000000ULL | \\ 185*735d6239SKiyoung Kim ((uint64_t)(x) << 24) & 0x0000ff0000000000ULL | \\ 186*735d6239SKiyoung Kim ((uint64_t)(x) << 8) & 0x000000ff00000000ULL | \\ 187*735d6239SKiyoung Kim ((x) >> 8) & 0x00000000ff000000ULL | \\ 188*735d6239SKiyoung Kim ((x) >> 24) & 0x0000000000ff0000ULL | \\ 189*735d6239SKiyoung Kim ((x) >> 40) & 0x000000000000ff00ULL | \\ 190*735d6239SKiyoung Kim ((x) >> 56) & 0x00000000000000ffULL)) 191*735d6239SKiyoung Kim 192*735d6239SKiyoung KimEOF 193*735d6239SKiyoung Kim fi 194*735d6239SKiyoung Kim]) 195*735d6239SKiyoung Kim ]) 196*735d6239SKiyoung Kim ]) 197*735d6239SKiyoung Kim ]) 198*735d6239SKiyoung Kim]) 199*735d6239SKiyoung Kim 200*735d6239SKiyoung Kim 201*735d6239SKiyoung Kim[ 202*735d6239SKiyoung Kimif test "$HAVE_LE32TOH" != "1"; then 203*735d6239SKiyoung Kim cat >> "$1" << EOF 204*735d6239SKiyoung Kim/* The byte swapping macros have the form: */ 205*735d6239SKiyoung Kim/* EENN[a]toh or htoEENN[a] where EE is be (big endian) or */ 206*735d6239SKiyoung Kim/* le (little-endian), NN is 16 or 32 (number of bits) and a, */ 207*735d6239SKiyoung Kim/* if present, indicates that the endian side is a pointer to an */ 208*735d6239SKiyoung Kim/* array of uint8_t bytes instead of an integer of the specified length. */ 209*735d6239SKiyoung Kim/* h refers to the host's ordering method. */ 210*735d6239SKiyoung Kim 211*735d6239SKiyoung Kim/* So, to convert a 32-bit integer stored in a buffer in little-endian */ 212*735d6239SKiyoung Kim/* format into a uint32_t usable on this machine, you could use: */ 213*735d6239SKiyoung Kim/* uint32_t value = le32atoh(&buf[3]); */ 214*735d6239SKiyoung Kim/* To put that value back into the buffer, you could use: */ 215*735d6239SKiyoung Kim/* htole32a(&buf[3], value); */ 216*735d6239SKiyoung Kim 217*735d6239SKiyoung Kim/* Define aliases for the standard byte swapping macros */ 218*735d6239SKiyoung Kim/* Arguments to these macros must be properly aligned on natural word */ 219*735d6239SKiyoung Kim/* boundaries in order to work properly on all architectures */ 220*735d6239SKiyoung Kim#define htobe16(x) htons(x) 221*735d6239SKiyoung Kim#define htobe32(x) htonl(x) 222*735d6239SKiyoung Kim#define be16toh(x) ntohs(x) 223*735d6239SKiyoung Kim#define be32toh(x) ntohl(x) 224*735d6239SKiyoung Kim 225*735d6239SKiyoung Kim#define HTOBE16(x) (x) = htobe16(x) 226*735d6239SKiyoung Kim#define HTOBE32(x) (x) = htobe32(x) 227*735d6239SKiyoung Kim#define BE32TOH(x) (x) = be32toh(x) 228*735d6239SKiyoung Kim#define BE16TOH(x) (x) = be16toh(x) 229*735d6239SKiyoung Kim 230*735d6239SKiyoung KimEOF 231*735d6239SKiyoung Kim 232*735d6239SKiyoung Kim if test $ac_cv_c_bigendian = yes; then 233*735d6239SKiyoung Kim cat >> "$1" << EOF 234*735d6239SKiyoung Kim/* Define our own extended byte swapping macros for big-endian machines */ 235*735d6239SKiyoung Kim#define htole16(x) swap16(x) 236*735d6239SKiyoung Kim#define htole32(x) swap32(x) 237*735d6239SKiyoung Kim#define le16toh(x) swap16(x) 238*735d6239SKiyoung Kim#define le32toh(x) swap32(x) 239*735d6239SKiyoung Kim 240*735d6239SKiyoung Kim#define htobe64(x) (x) 241*735d6239SKiyoung Kim#define be64toh(x) (x) 242*735d6239SKiyoung Kim 243*735d6239SKiyoung Kim#define HTOLE16(x) (x) = htole16(x) 244*735d6239SKiyoung Kim#define HTOLE32(x) (x) = htole32(x) 245*735d6239SKiyoung Kim#define LE16TOH(x) (x) = le16toh(x) 246*735d6239SKiyoung Kim#define LE32TOH(x) (x) = le32toh(x) 247*735d6239SKiyoung Kim 248*735d6239SKiyoung Kim#define HTOBE64(x) (void) (x) 249*735d6239SKiyoung Kim#define BE64TOH(x) (void) (x) 250*735d6239SKiyoung Kim 251*735d6239SKiyoung KimEOF 252*735d6239SKiyoung Kim else 253*735d6239SKiyoung Kim cat >> "$1" << EOF 254*735d6239SKiyoung Kim/* On little endian machines, these macros are null */ 255*735d6239SKiyoung Kim#define htole16(x) (x) 256*735d6239SKiyoung Kim#define htole32(x) (x) 257*735d6239SKiyoung Kim#define htole64(x) (x) 258*735d6239SKiyoung Kim#define le16toh(x) (x) 259*735d6239SKiyoung Kim#define le32toh(x) (x) 260*735d6239SKiyoung Kim#define le64toh(x) (x) 261*735d6239SKiyoung Kim 262*735d6239SKiyoung Kim#define HTOLE16(x) (void) (x) 263*735d6239SKiyoung Kim#define HTOLE32(x) (void) (x) 264*735d6239SKiyoung Kim#define HTOLE64(x) (void) (x) 265*735d6239SKiyoung Kim#define LE16TOH(x) (void) (x) 266*735d6239SKiyoung Kim#define LE32TOH(x) (void) (x) 267*735d6239SKiyoung Kim#define LE64TOH(x) (void) (x) 268*735d6239SKiyoung Kim 269*735d6239SKiyoung Kim/* These don't have standard aliases */ 270*735d6239SKiyoung Kim#define htobe64(x) swap64(x) 271*735d6239SKiyoung Kim#define be64toh(x) swap64(x) 272*735d6239SKiyoung Kim 273*735d6239SKiyoung Kim#define HTOBE64(x) (x) = htobe64(x) 274*735d6239SKiyoung Kim#define BE64TOH(x) (x) = be64toh(x) 275*735d6239SKiyoung Kim 276*735d6239SKiyoung KimEOF 277*735d6239SKiyoung Kim fi 278*735d6239SKiyoung Kimfi 279*735d6239SKiyoung Kim 280*735d6239SKiyoung Kimcat >> "$1" << EOF 281*735d6239SKiyoung Kim/* Define the C99 standard length-specific integer types */ 282*735d6239SKiyoung Kim#include <_stdint.h> 283*735d6239SKiyoung Kim 284*735d6239SKiyoung KimEOF 285*735d6239SKiyoung Kim 286*735d6239SKiyoung Kimcase "${effective_target}" in 287*735d6239SKiyoung Kim i[3456]86-*) 288*735d6239SKiyoung Kim cat >> "$1" << EOF 289*735d6239SKiyoung Kim/* Here are some macros to create integers from a byte array */ 290*735d6239SKiyoung Kim/* These are used to get and put integers from/into a uint8_t array */ 291*735d6239SKiyoung Kim/* with a specific endianness. This is the most portable way to generate */ 292*735d6239SKiyoung Kim/* and read messages to a network or serial device. Each member of a */ 293*735d6239SKiyoung Kim/* packet structure must be handled separately. */ 294*735d6239SKiyoung Kim 295*735d6239SKiyoung Kim/* The i386 and compatibles can handle unaligned memory access, */ 296*735d6239SKiyoung Kim/* so use the optimized macros above to do this job */ 297*735d6239SKiyoung Kim#define be16atoh(x) be16toh(*(uint16_t*)(x)) 298*735d6239SKiyoung Kim#define be32atoh(x) be32toh(*(uint32_t*)(x)) 299*735d6239SKiyoung Kim#define be64atoh(x) be64toh(*(uint64_t*)(x)) 300*735d6239SKiyoung Kim#define le16atoh(x) le16toh(*(uint16_t*)(x)) 301*735d6239SKiyoung Kim#define le32atoh(x) le32toh(*(uint32_t*)(x)) 302*735d6239SKiyoung Kim#define le64atoh(x) le64toh(*(uint64_t*)(x)) 303*735d6239SKiyoung Kim 304*735d6239SKiyoung Kim#define htobe16a(a,x) *(uint16_t*)(a) = htobe16(x) 305*735d6239SKiyoung Kim#define htobe32a(a,x) *(uint32_t*)(a) = htobe32(x) 306*735d6239SKiyoung Kim#define htobe64a(a,x) *(uint64_t*)(a) = htobe64(x) 307*735d6239SKiyoung Kim#define htole16a(a,x) *(uint16_t*)(a) = htole16(x) 308*735d6239SKiyoung Kim#define htole32a(a,x) *(uint32_t*)(a) = htole32(x) 309*735d6239SKiyoung Kim#define htole64a(a,x) *(uint64_t*)(a) = htole64(x) 310*735d6239SKiyoung Kim 311*735d6239SKiyoung KimEOF 312*735d6239SKiyoung Kim ;; 313*735d6239SKiyoung Kim 314*735d6239SKiyoung Kim *) 315*735d6239SKiyoung Kim cat >> "$1" << EOF 316*735d6239SKiyoung Kim/* Here are some macros to create integers from a byte array */ 317*735d6239SKiyoung Kim/* These are used to get and put integers from/into a uint8_t array */ 318*735d6239SKiyoung Kim/* with a specific endianness. This is the most portable way to generate */ 319*735d6239SKiyoung Kim/* and read messages to a network or serial device. Each member of a */ 320*735d6239SKiyoung Kim/* packet structure must be handled separately. */ 321*735d6239SKiyoung Kim 322*735d6239SKiyoung Kim/* Non-optimized but portable macros */ 323*735d6239SKiyoung Kim#define be16atoh(x) ((uint16_t)(((x)[0]<<8)|(x)[1])) 324*735d6239SKiyoung Kim#define be32atoh(x) ((uint32_t)(((x)[0]<<24)|((x)[1]<<16)|((x)[2]<<8)|(x)[3])) 325*735d6239SKiyoung Kim#define be64atoh(x) ((uint64_t)(((x)[0]<<56)|((x)[1]<<48)|((x)[2]<<40)| \\ 326*735d6239SKiyoung Kim ((x)[3]<<32)|((x)[4]<<24)|((x)[5]<<16)|((x)[6]<<8)|(x)[7])) 327*735d6239SKiyoung Kim#define le16atoh(x) ((uint16_t)(((x)[1]<<8)|(x)[0])) 328*735d6239SKiyoung Kim#define le32atoh(x) ((uint32_t)(((x)[3]<<24)|((x)[2]<<16)|((x)[1]<<8)|(x)[0])) 329*735d6239SKiyoung Kim#define le64atoh(x) ((uint64_t)(((x)[7]<<56)|((x)[6]<<48)|((x)[5]<<40)| \\ 330*735d6239SKiyoung Kim ((x)[4]<<32)|((x)[3]<<24)|((x)[2]<<16)|((x)[1]<<8)|(x)[0])) 331*735d6239SKiyoung Kim 332*735d6239SKiyoung Kim#define htobe16a(a,x) (a)[0]=(uint8_t)((x)>>8), (a)[1]=(uint8_t)(x) 333*735d6239SKiyoung Kim#define htobe32a(a,x) (a)[0]=(uint8_t)((x)>>24), (a)[1]=(uint8_t)((x)>>16), \\ 334*735d6239SKiyoung Kim (a)[2]=(uint8_t)((x)>>8), (a)[3]=(uint8_t)(x) 335*735d6239SKiyoung Kim#define htobe64a(a,x) (a)[0]=(uint8_t)((x)>>56), (a)[1]=(uint8_t)((x)>>48), \\ 336*735d6239SKiyoung Kim (a)[2]=(uint8_t)((x)>>40), (a)[3]=(uint8_t)((x)>>32), \\ 337*735d6239SKiyoung Kim (a)[4]=(uint8_t)((x)>>24), (a)[5]=(uint8_t)((x)>>16), \\ 338*735d6239SKiyoung Kim (a)[6]=(uint8_t)((x)>>8), (a)[7]=(uint8_t)(x) 339*735d6239SKiyoung Kim#define htole16a(a,x) (a)[1]=(uint8_t)((x)>>8), (a)[0]=(uint8_t)(x) 340*735d6239SKiyoung Kim#define htole32a(a,x) (a)[3]=(uint8_t)((x)>>24), (a)[2]=(uint8_t)((x)>>16), \\ 341*735d6239SKiyoung Kim (a)[1]=(uint8_t)((x)>>8), (a)[0]=(uint8_t)(x) 342*735d6239SKiyoung Kim#define htole64a(a,x) (a)[7]=(uint8_t)((x)>>56), (a)[6]=(uint8_t)((x)>>48), \\ 343*735d6239SKiyoung Kim (a)[5]=(uint8_t)((x)>>40), (a)[4]=(uint8_t)((x)>>32), \\ 344*735d6239SKiyoung Kim (a)[3]=(uint8_t)((x)>>24), (a)[2]=(uint8_t)((x)>>16), \\ 345*735d6239SKiyoung Kim (a)[1]=(uint8_t)((x)>>8), (a)[0]=(uint8_t)(x) 346*735d6239SKiyoung Kim 347*735d6239SKiyoung KimEOF 348*735d6239SKiyoung Kim ;; 349*735d6239SKiyoung Kimesac 350*735d6239SKiyoung Kim] 351*735d6239SKiyoung Kim 352*735d6239SKiyoung Kimcat >> "$1" << EOF 353*735d6239SKiyoung Kim#endif /*__BYTEORDER_H*/ 354*735d6239SKiyoung KimEOF]) 355