xref: /aosp_15_r20/external/libexif/m4m/gp-byteorder.m4 (revision 735d6239c16e246968a03ef6e2db00d67bad6cdc)
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