|
6 | 6 | * Macros for reversing the byte order of 32-bit and 64-bit unsigned integers. |
7 | 7 | * For example, 0xAABBCCDD becomes 0xDDCCBBAA. These are just wrappers for |
8 | 8 | * built-in functions provided by the compiler where support exists. |
| 9 | + * Elsewhere, beware of multiple evaluations of the arguments! |
9 | 10 | * |
10 | 11 | * Note that the GCC built-in functions __builtin_bswap32() and |
11 | 12 | * __builtin_bswap64() are documented as accepting single arguments of type |
|
24 | 25 | #ifdefHAVE__BUILTIN_BSWAP32 |
25 | 26 | #defineBSWAP32(x) __builtin_bswap32(x) |
26 | 27 | #else |
27 | | -#defineBSWAP32(x) (((x << 24) & 0xff000000) | \ |
28 | | -((x << 8) & 0x00ff0000) | \ |
29 | | -((x >> 8) & 0x0000ff00) | \ |
30 | | -((x >> 24) & 0x000000ff)) |
| 28 | +#defineBSWAP32(x) ((((x) << 24) & 0xff000000) | \ |
| 29 | +(((x) << 8) & 0x00ff0000) | \ |
| 30 | +(((x) >> 8) & 0x0000ff00) | \ |
| 31 | +(((x) >> 24) & 0x000000ff)) |
31 | 32 | #endif/* HAVE__BUILTIN_BSWAP32 */ |
32 | 33 |
|
33 | 34 | #ifdefHAVE__BUILTIN_BSWAP64 |
34 | 35 | #defineBSWAP64(x) __builtin_bswap64(x) |
35 | 36 | #else |
36 | | -#defineBSWAP64(x) (((x << 56) &0xff00000000000000UL) | \ |
37 | | -((x << 40) &0x00ff000000000000UL) | \ |
38 | | -((x << 24) &0x0000ff0000000000UL) | \ |
39 | | -((x << 8)& 0x000000ff00000000UL) | \ |
40 | | -((x >> 8)& 0x00000000ff000000UL) | \ |
41 | | -((x >> 24) &0x0000000000ff0000UL) | \ |
42 | | -((x >> 40) &0x000000000000ff00UL) | \ |
43 | | -((x >> 56) &0x00000000000000ffUL)) |
| 37 | +#defineBSWAP64(x) ((((x) << 56) &UINT64CONST(0xff00000000000000)) | \ |
| 38 | +(((x) << 40) &UINT64CONST(0x00ff000000000000)) | \ |
| 39 | +(((x) << 24) &UINT64CONST(0x0000ff0000000000)) | \ |
| 40 | +(((x) << 8) & UINT64CONST(0x000000ff00000000)) | \ |
| 41 | +(((x) >> 8) & UINT64CONST(0x00000000ff000000)) | \ |
| 42 | +(((x) >> 24) &UINT64CONST(0x0000000000ff0000)) | \ |
| 43 | +(((x) >> 40) &UINT64CONST(0x000000000000ff00)) | \ |
| 44 | +(((x) >> 56) &UINT64CONST(0x00000000000000ff))) |
44 | 45 | #endif/* HAVE__BUILTIN_BSWAP64 */ |
45 | 46 |
|
46 | 47 | /* |
|