aboutsummaryrefslogtreecommitdiff
path: root/src/endian.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/endian.h')
-rw-r--r--src/endian.h74
1 files changed, 63 insertions, 11 deletions
diff --git a/src/endian.h b/src/endian.h
index 11712b5..0b3e8af 100644
--- a/src/endian.h
+++ b/src/endian.h
@@ -1,3 +1,14 @@
+/** \file
+ * \brief Proone's own <endian.h>. Proone does not use <endian.h> present on
+ * many platforms simply because the header is not a standard. Proone does not
+ * use the traditional byte swap approach to solve the endianness problem for
+ * data communication so that all arches have the same disadvantage when
+ * communicating with other hosts.
+ * \note The functions in the internet protocol headers are used if present to
+ * avoid confusion.
+ * \see BYTEORDER(3)
+ * \see <arpa/inet.h>
+ */
/*
* Copyright (c) 2019-2021 David Timber <mieabby@gmail.com>
*
@@ -20,23 +31,43 @@
* SOFTWARE.
*/
#pragma once
-/**********************************************************************
-* Endianess Independent Byte Extraction
-***********************************************************************/
-/* prne_getmsbN(x, n)
-*
-* Extract nth most significant byte of x.
-*/
+
+/** \def prne_getmsb \def prne_getmsb64 \def prne_getmsb32 \def prne_getmsb16
+ * \brief Extract \p n th most significant byte of \p x
+ * \param[in] x The integer
+ * \param[in] n The byte place, in range of [0, 1] if \p x is 16-bit integer,
+ * [0, 3] if \p x is 32-bit integer, [0, 7] if \p x is 64-bit integer.
+ * \param[in] w The data type to use in calculation. One of uint_fastN_t
+ * variants.
+ * \param[in] s The number of bits to shift by.
+ * \return The 8-bit integer extracted from the \p n th place of \p x in range
+ * [0, 255].
+ * \see \c prne_recmb_msb64()
+ * \see \c prne_recmb_msb32()
+ * \see \c prne_recmb_msb16()
+ */
#define prne_getmsb(x, n, w, s)\
(uint8_t)(((w)(x) & (w)0xFF << (s - 8 * (n))) >> (s - 8 * (n)))
#define prne_getmsb64(x, n) prne_getmsb((x), (n), uint_fast64_t, 56)
#define prne_getmsb32(x, n) prne_getmsb((x), (n), uint_fast32_t, 24)
#define prne_getmsb16(x, n) prne_getmsb((x), (n), uint_fast16_t, 8)
-/* prne_recmb_msbN(...)
-*
-* Recombine bytes in big-endian order to uintN.
-*/
+/** \def prne_recmb_msb64 \def prne_recmb_msb32 \def prne_recmb_msb16
+ * \brief Recombine bytes in big-endian order.
+ * \param a The first byte.
+ * \param b The second byte.
+ * \param c The third byte.
+ * \param d The fourth byte.
+ * \param e The fifth byte.
+ * \param f The sixth byte.
+ * \param g The seventh byte.
+ * \param h The eighth byte.
+ * \return The recombined integer in the host's endian.
+ * \see \c prne_getmsb()
+ * \see \c prne_getmsb64()
+ * \see \c prne_getmsb32()
+ * \see \c prne_getmsb16()
+ */
#define prne_recmb_msb64(a, b, c, d, e, f, g, h) (\
((uint_fast64_t)(a) << 56) |\
((uint_fast64_t)(b) << 48) |\
@@ -60,9 +91,18 @@
/* Machine Characteristics
*/
+/** \def PRNE_ENDIAN_LITTLE \def PRNE_ENDIAN_BIG
+ * \brief The values that can be matched against \c PRNE_HOST_ENDIAN
+ * \note The PDP endian is not defined because the ELF does not support it.
+ */
#define PRNE_ENDIAN_LITTLE 1
#define PRNE_ENDIAN_BIG 2
+/** \def PRNE_HOST_ENDIAN
+ * \brief The host endian.
+ * \see \c PRNE_ENDIAN_LITTLE
+ * \see \c PRNE_ENDIAN_BIG
+ */
#ifdef __GNUC__
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
#define PRNE_HOST_ENDIAN PRNE_ENDIAN_BIG
@@ -72,11 +112,23 @@
#error "FIXME!"
#endif
#else
+ // Expand this to support compilers other than GCC
#error "FIXME!"
#endif
+/**
+ * \brief Swap bytes to invert the endianness of the 16-bit integer.
+ * \param x The integer.
+ * \returns The integer with its bytes swapped.
+ */
#define prne_einv16(x) (((0xFF00 & x) >> 8) | ((0x00FF & x) << 8))
+/** \def prne_htobe16 \def prne_be16toh \def prne_htole16 \def prne_le16toh
+ * \brief Convert the endianness of the integer.
+ * \param x The integer.
+ * \return The integer converted.
+ * \note Use the functions in <arpa/inet.h> where appropriate!
+ */
#if PRNE_HOST_ENDIAN == PRNE_ENDIAN_BIG
#define prne_htobe16(x) (x)
#define prne_be16toh(x) (x)