1 /********************************************************************\
2  Copyright (c) 2017 by Aleksey Cheusov
3 
4  See LICENSE file in the distribution.
5 \********************************************************************/
6 
7 #ifndef _MKC_BSWAP_H_
8 #define _MKC_BSWAP_H_
9 
10 #ifndef _MKC_CHECK_BSWAP
11 # error "Missing MKC_FEATURES += bswap"
12 #endif
13 
14 #if HAVE_FUNC1_BSWAP_16_BYTESWAP_H && \
15 	HAVE_FUNC1_BSWAP_32_BYTESWAP_H && \
16 	HAVE_FUNC1_BSWAP_64_BYTESWAP_H
17 #include <byteswap.h>
18 #define bswap16(v) bswap_16(v)
19 #define bswap32(v) bswap_32(v)
20 #define bswap64(v) bswap_64(v)
21 #elif HAVE_FUNC1_BSWAP16_SYS_ENDIAN_H && \
22 	HAVE_FUNC1_BSWAP32_SYS_ENDIAN_H && \
23 	HAVE_FUNC1_BSWAP64_SYS_ENDIAN_H
24 #include <sys/endian.h>
25 #else
26 
27 #include <stdint.h>
28 
29 #define bswap16(x) \
30     (uint16_t)( \
31     (((x) & 0xff00) >> 8) | \
32     (((x) & 0x00ff) << 8))
33 
34 #define bswap32(x) \
35     (uint32_t)( \
36     (((x) & 0xff000000) >> 24) | \
37     (((x) & 0x00ff0000) >> 8) | \
38     (((x) & 0x0000ff00) << 8) | \
39     (((x) & 0x000000ff) << 24))
40 
41 #define bswap64(x) \
42     (uint64_t)( \
43     (((x) & 0xff00000000000000ull) >> 56) | \
44     (((x) & 0x00ff000000000000ull) >> 40) | \
45     (((x) & 0x0000ff0000000000ull) >> 24) | \
46     (((x) & 0x000000ff00000000ull) >>  8) | \
47     (((x) & 0x00000000ff000000ull) <<  8) | \
48     (((x) & 0x0000000000ff0000ull) << 24) | \
49     (((x) & 0x000000000000ff00ull) << 40) | \
50     (((x) & 0x00000000000000ffull) << 56))
51 
52 #endif /**/
53 
54 #endif /* _MKC_BSWAP_H_ */
55