summaryrefslogtreecommitdiff
path: root/src/pint.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/pint.h')
-rw-r--r--src/pint.h213
1 files changed, 213 insertions, 0 deletions
diff --git a/src/pint.h b/src/pint.h
new file mode 100644
index 0000000..11ff8c9
--- /dev/null
+++ b/src/pint.h
@@ -0,0 +1,213 @@
+/* pint.h
+ * Definitions for extracting and translating integers safely and portably
+ * via pointers.
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <[email protected]>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef __PINT_H__
+#define __PINT_H__
+
+#include <glib.h>
+
+/* Routines that take a possibly-unaligned pointer to a 16-bit, 24-bit,
+ * 32-bit, 40-bit, ... 64-bit integral quantity, in a particular byte
+ * order, and fetch the value and return it in host byte order.
+ *
+ * The pntohN() routines fetch big-endian values; the pletohN() routines
+ * fetch little-endian values.
+ */
+
+static inline guint16 pntoh16(const void *p)
+{
+ return (guint16)*((const guint8 *)(p)+0)<<8|
+ (guint16)*((const guint8 *)(p)+1)<<0;
+}
+
+static inline guint32 pntoh24(const void *p)
+{
+ return (guint32)*((const guint8 *)(p)+0)<<16|
+ (guint32)*((const guint8 *)(p)+1)<<8|
+ (guint32)*((const guint8 *)(p)+2)<<0;
+}
+
+static inline guint32 pntoh32(const void *p)
+{
+ return (guint32)*((const guint8 *)(p)+0)<<24|
+ (guint32)*((const guint8 *)(p)+1)<<16|
+ (guint32)*((const guint8 *)(p)+2)<<8|
+ (guint32)*((const guint8 *)(p)+3)<<0;
+}
+
+static inline guint64 pntoh40(const void *p)
+{
+ return (guint64)*((const guint8 *)(p)+0)<<32|
+ (guint64)*((const guint8 *)(p)+1)<<24|
+ (guint64)*((const guint8 *)(p)+2)<<16|
+ (guint64)*((const guint8 *)(p)+3)<<8|
+ (guint64)*((const guint8 *)(p)+4)<<0;
+}
+
+static inline guint64 pntoh48(const void *p)
+{
+ return (guint64)*((const guint8 *)(p)+0)<<40|
+ (guint64)*((const guint8 *)(p)+1)<<32|
+ (guint64)*((const guint8 *)(p)+2)<<24|
+ (guint64)*((const guint8 *)(p)+3)<<16|
+ (guint64)*((const guint8 *)(p)+4)<<8|
+ (guint64)*((const guint8 *)(p)+5)<<0;
+}
+
+static inline guint64 pntoh56(const void *p)
+{
+ return (guint64)*((const guint8 *)(p)+0)<<48|
+ (guint64)*((const guint8 *)(p)+1)<<40|
+ (guint64)*((const guint8 *)(p)+2)<<32|
+ (guint64)*((const guint8 *)(p)+3)<<24|
+ (guint64)*((const guint8 *)(p)+4)<<16|
+ (guint64)*((const guint8 *)(p)+5)<<8|
+ (guint64)*((const guint8 *)(p)+6)<<0;
+}
+
+static inline guint64 pntoh64(const void *p)
+{
+ return (guint64)*((const guint8 *)(p)+0)<<56|
+ (guint64)*((const guint8 *)(p)+1)<<48|
+ (guint64)*((const guint8 *)(p)+2)<<40|
+ (guint64)*((const guint8 *)(p)+3)<<32|
+ (guint64)*((const guint8 *)(p)+4)<<24|
+ (guint64)*((const guint8 *)(p)+5)<<16|
+ (guint64)*((const guint8 *)(p)+6)<<8|
+ (guint64)*((const guint8 *)(p)+7)<<0;
+}
+
+static inline guint16 pletoh16(const void *p)
+{
+ return (guint16)*((const guint8 *)(p)+1)<<8|
+ (guint16)*((const guint8 *)(p)+0)<<0;
+}
+
+static inline guint32 pletoh24(const void *p)
+{
+ return (guint32)*((const guint8 *)(p)+2)<<16|
+ (guint32)*((const guint8 *)(p)+1)<<8|
+ (guint32)*((const guint8 *)(p)+0)<<0;
+}
+
+static inline guint32 pletoh32(const void *p)
+{
+ return (guint32)*((const guint8 *)(p)+3)<<24|
+ (guint32)*((const guint8 *)(p)+2)<<16|
+ (guint32)*((const guint8 *)(p)+1)<<8|
+ (guint32)*((const guint8 *)(p)+0)<<0;
+}
+
+static inline guint64 pletoh40(const void *p)
+{
+ return (guint64)*((const guint8 *)(p)+4)<<32|
+ (guint64)*((const guint8 *)(p)+3)<<24|
+ (guint64)*((const guint8 *)(p)+2)<<16|
+ (guint64)*((const guint8 *)(p)+1)<<8|
+ (guint64)*((const guint8 *)(p)+0)<<0;
+}
+
+static inline guint64 pletoh48(const void *p)
+{
+ return (guint64)*((const guint8 *)(p)+5)<<40|
+ (guint64)*((const guint8 *)(p)+4)<<32|
+ (guint64)*((const guint8 *)(p)+3)<<24|
+ (guint64)*((const guint8 *)(p)+2)<<16|
+ (guint64)*((const guint8 *)(p)+1)<<8|
+ (guint64)*((const guint8 *)(p)+0)<<0;
+}
+
+static inline guint64 pletoh56(const void *p)
+{
+ return (guint64)*((const guint8 *)(p)+6)<<48|
+ (guint64)*((const guint8 *)(p)+5)<<40|
+ (guint64)*((const guint8 *)(p)+4)<<32|
+ (guint64)*((const guint8 *)(p)+3)<<24|
+ (guint64)*((const guint8 *)(p)+2)<<16|
+ (guint64)*((const guint8 *)(p)+1)<<8|
+ (guint64)*((const guint8 *)(p)+0)<<0;
+}
+
+static inline guint64 pletoh64(const void *p)
+{
+ return (guint64)*((const guint8 *)(p)+7)<<56|
+ (guint64)*((const guint8 *)(p)+6)<<48|
+ (guint64)*((const guint8 *)(p)+5)<<40|
+ (guint64)*((const guint8 *)(p)+4)<<32|
+ (guint64)*((const guint8 *)(p)+3)<<24|
+ (guint64)*((const guint8 *)(p)+2)<<16|
+ (guint64)*((const guint8 *)(p)+1)<<8|
+ (guint64)*((const guint8 *)(p)+0)<<0;
+}
+/* Pointer routines to put items out in a particular byte order.
+ * These will work regardless of the byte alignment of the pointer.
+ */
+
+static inline void phton16(guint8 *p, guint16 v)
+{
+ p[0] = (guint8)(v >> 8);
+ p[1] = (guint8)(v >> 0);
+}
+
+static inline void phton32(guint8 *p, guint32 v)
+{
+ p[0] = (guint8)(v >> 24);
+ p[1] = (guint8)(v >> 16);
+ p[2] = (guint8)(v >> 8);
+ p[3] = (guint8)(v >> 0);
+}
+
+static inline void phton64(guint8 *p, guint64 v) {
+ p[0] = (guint8)(v >> 56);
+ p[1] = (guint8)(v >> 48);
+ p[2] = (guint8)(v >> 40);
+ p[3] = (guint8)(v >> 32);
+ p[4] = (guint8)(v >> 24);
+ p[5] = (guint8)(v >> 16);
+ p[6] = (guint8)(v >> 8);
+ p[7] = (guint8)(v >> 0);
+}
+
+static inline void phtole32(guint8 *p, guint32 v) {
+ p[0] = (guint8)(v >> 0);
+ p[1] = (guint8)(v >> 8);
+ p[2] = (guint8)(v >> 16);
+ p[3] = (guint8)(v >> 24);
+}
+
+static inline void phtole64(guint8 *p, guint64 v) {
+ p[0] = (guint8)(v >> 0);
+ p[1] = (guint8)(v >> 8);
+ p[2] = (guint8)(v >> 16);
+ p[3] = (guint8)(v >> 24);
+ p[4] = (guint8)(v >> 32);
+ p[5] = (guint8)(v >> 40);
+ p[6] = (guint8)(v >> 48);
+ p[7] = (guint8)(v >> 56);
+}
+
+/* Subtract two guint32s with respect to wraparound */
+#define guint32_wraparound_diff(higher, lower) ((higher>lower)?(higher-lower):(higher+0xffffffff-lower+1))
+
+#endif /* PINT_H */
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local Variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * ex: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */