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
|