Date: Thu, 5 Jan 2012 00:39:23 +0100 From: Ed Schouten <ed@80386.nl> To: Marcel Moolenaar <marcel@xcllnt.net> Cc: FreeBSD Arch <freebsd-arch@freebsd.org> Subject: Re: ntohq/htonq? Message-ID: <20120104233923.GY1895@hoeg.nl> In-Reply-To: <306FD881-6140-4DE2-AFF1-95C8079E4187@xcllnt.net> References: <306FD881-6140-4DE2-AFF1-95C8079E4187@xcllnt.net>
next in thread | previous in thread | raw e-mail | index | archive | help
--zNngJsVJxur72n6A
Content-Type: multipart/mixed; boundary="GpIToxGFjxEkdZJB"
Content-Disposition: inline
--GpIToxGFjxEkdZJB
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
Marcel, others,
* Marcel Moolenaar <marcel@xcllnt.net>, 20110914 04:36:
> I did some googling and htonq and ntohq seem to be de
> facto names used, but oddly enough no OS has them defined.
> It's surreal. Are there better alternatives we should
> migrate to?
I just sent a patch to stefanf@ to change <tgmath.h> to be built on top
of a new macro __generic(), which can act as a transition aid towards
C11's _Generic().
If we really want to add support for htonq() and ntohq(), I would rather
see us gain a hton() and ntoh() that are implemented as type-generic
macros. That way we won't up having htonllll() by the year 2050. Also,
it will allow people to `wrap' it into more fancy macros:
#define DECODE_FIELD(x) do { foo->a_ ## x =3D ntoh(bar->b_ ## x); } while (=
0)
Proof of concept patch (for illustration purposes only) for
<sys/endian.h> attached to this email.
--=20
Ed Schouten <ed@80386.nl>
WWW: http://80386.nl/
--GpIToxGFjxEkdZJB
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment; filename="endian.diff"
Content-Transfer-Encoding: quoted-printable
Index: sys/sys/cdefs.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- sys/sys/cdefs.h (revision 229516)
+++ sys/sys/cdefs.h (working copy)
@@ -248,6 +248,24 @@
#endif
#endif
=20
+/*
+ * Emulation of C11 _Generic(). Unlike the previously defined C11
+ * keywords, it is not possible to implement this using exactly the same
+ * syntax. Therefore implement something similar under the name
+ * __generic(). Unlike _Generic(), this macro can only distinguish
+ * between a single type, so it requires nested invocations to
+ * distinguish multiple cases.
+ */
+
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >=3D 201112L
+#define __generic(expr, t, yes, no) \
+ _Generic(expr, t: yes, default: no)
+#elif __GNUC_PREREQ__(3, 1)
+#define __generic(expr, t, yes, no) \
+ __builtin_choose_expr( \
+ __builtin_types_compatible_p(__typeof(expr), t), yes, no)
+#endif
+
#if __GNUC_PREREQ__(2, 96)
#define __malloc_like __attribute__((__malloc__))
#define __pure __attribute__((__pure__))
Index: sys/sys/endian.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- sys/sys/endian.h (revision 229516)
+++ sys/sys/endian.h (working copy)
@@ -202,4 +202,27 @@
le32enc(p + 4, (uint32_t)(u >> 32));
}
=20
+#ifdef __generic
+
+/*
+ * Type-generic byte order macros.
+ */
+
+#define __endian_op(x, func16, func32, func64) \
+ __endian_op2(x, 8, x, \
+ __endian_op2(x, 16, func16, \
+ __endian_op2(x, 32, func32, \
+ __endian_op2(x, 64, func64, (void)0))))
+#define __endian_op2(x, size, func, rest) \
+ __generic(x, __uint ## size ## _t, func, \
+ __generic(x, __int ## size ## _t, func, rest))
+
+#define bswap(x) __endian_op(x, bswap16(x), bswap32(x), bswap64(x))
+#define htobe(x) __endian_op(x, htobe16(x), htobe32(x), htobe64(x))
+#define betoh(x) __endian_op(x, be16toh(x), be32toh(x), be64toh(x))
+#define htole(x) __endian_op(x, htole16(x), htole32(x), htole64(x))
+#define letoh(x) __endian_op(x, le16toh(x), le32toh(x), le64toh(x))
+
+#endif /* __generic */
+
#endif /* _SYS_ENDIAN_H_ */
--GpIToxGFjxEkdZJB--
--zNngJsVJxur72n6A
Content-Type: application/pgp-signature
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (FreeBSD)
iQIcBAEBAgAGBQJPBOMqAAoJEG5e2P40kaK71d4QAKP8oEk74xaVKOFzAaHqeYVi
wrZ+CcOlGSmemQNGsk10co7+96LOxiaMjskShbY/ZiayONJTKTRHfee6wlQmaM4/
8a843MDCf8pLbpYN4m1H7Yl98AyH5P5Rt4Mi7vloo6WPzQmueci9nm0JtIkHiARC
8buzpBqsuSODMpmRVbHd15JDTwUz1OWDWaJ+vkXKEbUpT00F12WTxxikiFls5iv7
ra1NOaLJgp7+I2b3dhoTFeymFFdHaRFravyl2VE38HxqpZfVC+zxJ+pdezyMNvA6
IhL6ya8BE+xEoapmA1Pmu9I9I6Cel7aIciGiNW+DpQDxQco6vO5bZKgN4g+H+VzG
8RAu2q7Wka/j17nmkFJ71h9bM9BXFeuoOnKCssiwZsZdjwbCr0onUkO1cIYwvXNX
NWzA2QrG3Q/P2lX3cID8LpEKwHNXkUlzSF5nm6mqrMDmkUacN5blwlHIV0d/zTVj
9sYr+LugS4RJilthJSWZx40d5bNKa2pFnJvFoPbKkM+g9NGQRXEAlCtquoVzMBd4
XVOmOY6Lqfe13PsmA6cJvfx4t3S5wWFFT3tPC635jxnuuT3/gGJ7g4erdsgMk2u9
TUhe1wdgXcwy+ILPtTu/cuDjSHwoqbRhkQ+wyG8P2q34DpsI2DJYfap72Ip1veMv
JO0Kit2XUfPr8jIYBHmK
=Ht6m
-----END PGP SIGNATURE-----
--zNngJsVJxur72n6A--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120104233923.GY1895>
