File: endian.h

package info (click to toggle)
amqp-cpp 4.3.27-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,384 kB
  • sloc: cpp: 10,021; ansic: 191; makefile: 95
file content (153 lines) | stat: -rw-r--r-- 3,758 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/**
 *  Endian.h
 *
 *  On Apple systems, there are no macro's to convert between little
 *  and big endian byte orders. This header file adds the missing macros
 *
 *  @author madmongo1 <https://github.com/madmongo1>
 *
 *  And we have also copied code from the "portable_endian.h" file by
 *  Mathias Panzenböck. His license:
 *
 *  "License": Public Domain
 *      I, Mathias Panzenböck, place this file hereby into the public
 *      domain. Use it at your own risk for whatever you like. In case
 *      there are jurisdictions that don't support putting things in the
 *      public domain you can also consider it to be "dual licensed"
 *      under the BSD, MIT and Apache licenses, if you want to. This
 *      code is trivial anyway. Consider it an example on how to get the
 *      endian conversion functions on different platforms.
 */

/**
 *  Include guard
 */
#pragma once

/**
 *  The contents of the file are only relevant for Apple
 */
#if defined(__APPLE__)

// dependencies
#include <machine/endian.h>
#include <libkern/OSByteOrder.h>

// define 16 bit macros
#define htobe16(x) OSSwapHostToBigInt16(x)
#define htole16(x) OSSwapHostToLittleInt16(x)
#define be16toh(x) OSSwapBigToHostInt16(x)
#define le16toh(x) OSSwapLittleToHostInt16(x)

// define 32 bit macros
#define htobe32(x) OSSwapHostToBigInt32(x)
#define htole32(x) OSSwapHostToLittleInt32(x)
#define be32toh(x) OSSwapBigToHostInt32(x)
#define le32toh(x) OSSwapLittleToHostInt32(x)

// define 64 but macros
#define htobe64(x) OSSwapHostToBigInt64(x)
#define htole64(x) OSSwapHostToLittleInt64(x)
#define be64toh(x) OSSwapBigToHostInt64(x)
#define le64toh(x) OSSwapLittleToHostInt64(x)

/**
 *  And on Windows systems weird things are going on as well
 */
#elif (defined(_WIN16) || defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__)) && !defined(__CYGWIN__)

#include <winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
//# include <sys/param.h>

#if BYTE_ORDER == LITTLE_ENDIAN

#define htobe16(x) htons(x)
#define htole16(x) (x)
#define be16toh(x) ntohs(x)
#define le16toh(x) (x)

#define htobe32(x) htonl(x)
#define htole32(x) (x)
#define be32toh(x) ntohl(x)
#define le32toh(x) (x)

#define htobe64(x) ((1==htonl(1)) ? (x) : ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
#define htole64(x) (x)
#define be64toh(x) ((1==ntohl(1)) ? (x) : ((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))
#define le64toh(x) (x)

#elif BYTE_ORDER == BIG_ENDIAN

/* that would be xbox 360 */
#define htobe16(x) (x)
#define htole16(x) __builtin_bswap16(x)
#define be16toh(x) (x)
#define le16toh(x) __builtin_bswap16(x)

#define htobe32(x) (x)
#define htole32(x) __builtin_bswap32(x)
#define be32toh(x) (x)
#define le32toh(x) __builtin_bswap32(x)

#define htobe64(x) (x)
#define htole64(x) __builtin_bswap64(x)
#define be64toh(x) (x)
#define le64toh(x) __builtin_bswap64(x)

#else

#error byte order not supported

#endif

#define __BYTE_ORDER    BYTE_ORDER
#define __BIG_ENDIAN    BIG_ENDIAN
#define __LITTLE_ENDIAN LITTLE_ENDIAN
#define __PDP_ENDIAN    PDP_ENDIAN

/**
 *  OpenBSD handling
 */
#elif defined(__OpenBSD__)

#include <sys/endian.h>

/**
 *  NetBSD handling
 */
#elif defined(__NetBSD__) || defined(__DragonFly__)

#include <sys/endian.h>
#define be16toh(x) betoh16(x)
#define le16toh(x) letoh16(x)
#define be32toh(x) betoh32(x)
#define le32toh(x) letoh32(x)
#define be64toh(x) betoh64(x)
#define le64toh(x) letoh64(x)

/**
 * FreeBSD handling
 */
#elif defined(__FreeBSD__)

#include <sys/endian.h>

/**
 * QNX Neutrino handling
 */
#elif defined(__QNXNTO__)

#include <net/netbyte.h>

/**
 *  Not on apple, and not on windows
 */
#else

// this is the normal linux way of doing things
#include <endian.h>

// end of "#if defined(__APPLE__)"
#endif