summaryrefslogtreecommitdiffstats
path: root/wsutil/sign_ext.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /wsutil/sign_ext.h
parentInitial commit. (diff)
downloadwireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz
wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'wsutil/sign_ext.h')
-rw-r--r--wsutil/sign_ext.h71
1 files changed, 71 insertions, 0 deletions
diff --git a/wsutil/sign_ext.h b/wsutil/sign_ext.h
new file mode 100644
index 0000000..67401ed
--- /dev/null
+++ b/wsutil/sign_ext.h
@@ -0,0 +1,71 @@
+/** @file
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef __WSUTIL_SIGN_EXT_H__
+#define __WSUTIL_SIGN_EXT_H__
+
+#include <inttypes.h>
+
+#include <glib.h>
+
+#include <wsutil/ws_assert.h>
+
+/* sign extension routines */
+
+static inline uint32_t
+ws_sign_ext32(uint32_t val, int no_of_bits)
+{
+ ws_assert (no_of_bits >= 0 && no_of_bits <= 32);
+
+ if ((no_of_bits == 0) || (no_of_bits == 32))
+ return val;
+
+ /*
+ * Don't shift signed values left; that's not valid in C99, at
+ * least, if the value is negative or if the shift count is
+ * the number of bits in the value - 1, and we might get
+ * compile-time or run-time complaints about that.
+ */
+ if (val & (1U << (no_of_bits-1)))
+ val |= (0xFFFFFFFFU << no_of_bits);
+
+ return val;
+}
+
+static inline uint64_t
+ws_sign_ext64(uint64_t val, int no_of_bits)
+{
+ ws_assert (no_of_bits >= 0 && no_of_bits <= 64);
+
+ if ((no_of_bits == 0) || (no_of_bits == 64))
+ return val;
+
+ /*
+ * Don't shift signed values left; that's not valid in C99, at
+ * least, if the value is negative or if the shift count is
+ * the number of bits in the value - 1, and we might get
+ * compile-time or run-time complaints about that.
+ */
+ if (val & (G_GUINT64_CONSTANT(1) << (no_of_bits-1)))
+ val |= (G_GUINT64_CONSTANT(0xFFFFFFFFFFFFFFFF) << no_of_bits);
+
+ return val;
+}
+
+/*
+static inline uint64_t
+ws_sign_ext64(uint64_t val, int no_of_bits)
+{
+ int64_t sval = (val << (64 - no_of_bits));
+
+ return (uint64_t) (sval >> (64 - no_of_bits));
+}
+*/
+
+#endif /* __WSUTIL_SIGN_EXT_H__ */