From 0f885cbba627efe9b8f763e1c2872e904fe0c0b1 Mon Sep 17 00:00:00 2001 From: Michael Phan-Ba Date: Fri, 31 Jul 2015 20:13:30 -0700 Subject: [PATCH] Initial commit --- .gitignore | 32 +++++++++++++ README.md | 36 +++++++++++++++ endian.h | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 9 ++++ 4 files changed, 202 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 endian.h create mode 100644 package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bbf313b --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ +# Object files +*.o +*.ko +*.obj +*.elf + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..1bab8b4 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +# endian.h + +This provides the endian conversion functions form endian.h on Windows, Linux, +*BSD, and Mac OS X. You still need to use `-std=gnu99` instead of `-std=c99` +for gcc. The functions might actually be macros. Functions: htobe16, htole16, +be16toh, le16toh, htobe32, htole32, be32toh, le32toh, htobe64, htole64, +be64toh, le64toh. + +The implementation was written by Mathias Panzenböck and published in this +[Gist][gist]. + +## Install + +Install with [clib(1)]: + +```sh +clib install mikepb/endian.h +``` + +## Usage + +```c +#include +#include "endian.h" + +uint32_t endian32(const uint32_t i) { + return be32toh(i); +} +``` + +## License + +Public Domain + +[clib]: https://github.com/clibs/clib +[gist]: https://gist.github.com/panzi/6856583 diff --git a/endian.h b/endian.h new file mode 100644 index 0000000..fe2d6fc --- /dev/null +++ b/endian.h @@ -0,0 +1,125 @@ +// +// endian.h +// +// https://gist.github.com/panzi/6856583 +// +// 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. + +#ifndef PORTABLE_ENDIAN_H__ +#define PORTABLE_ENDIAN_H__ + +#if (defined(_WIN16) || defined(_WIN32) || defined(_WIN64)) && !defined(__WINDOWS__) + +# define __WINDOWS__ + +#endif + +#if defined(__linux__) || defined(__CYGWIN__) + +# include + +#elif defined(__APPLE__) + +# include + +# define htobe16(x) OSSwapHostToBigInt16(x) +# define htole16(x) OSSwapHostToLittleInt16(x) +# define be16toh(x) OSSwapBigToHostInt16(x) +# define le16toh(x) OSSwapLittleToHostInt16(x) + +# define htobe32(x) OSSwapHostToBigInt32(x) +# define htole32(x) OSSwapHostToLittleInt32(x) +# define be32toh(x) OSSwapBigToHostInt32(x) +# define le32toh(x) OSSwapLittleToHostInt32(x) + +# define htobe64(x) OSSwapHostToBigInt64(x) +# define htole64(x) OSSwapHostToLittleInt64(x) +# define be64toh(x) OSSwapBigToHostInt64(x) +# define le64toh(x) OSSwapLittleToHostInt64(x) + +# define __BYTE_ORDER BYTE_ORDER +# define __BIG_ENDIAN BIG_ENDIAN +# define __LITTLE_ENDIAN LITTLE_ENDIAN +# define __PDP_ENDIAN PDP_ENDIAN + +#elif defined(__OpenBSD__) + +# include + +#elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) + +# include + +# 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) + +#elif defined(__WINDOWS__) + +# include +# include + +# 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) htonll(x) +# define htole64(x) (x) +# define be64toh(x) ntohll(x) +# 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 + +#else + +# error platform not supported + +#endif + +#endif diff --git a/package.json b/package.json new file mode 100644 index 0000000..d6b8160 --- /dev/null +++ b/package.json @@ -0,0 +1,9 @@ +{ + "name": "endian", + "version": "0.0.1", + "repo": "mikepb/endian.h", + "description": "Portable endian conversion functions for C", + "keywords": ["portable", "endian"], + "license": "PD", + "src": ["endian.h"] +} -- 2.44.0