aboutsummaryrefslogtreecommitdiffstats
path: root/epan/ftypes/ftype-integer.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2004-08-22 00:31:58 +0000
committerGuy Harris <guy@alum.mit.edu>2004-08-22 00:31:58 +0000
commitc68f62210fc20890502cb84dbc2ea4321de5b791 (patch)
treed7311a179eacd5a137e9e874b3bf2d0e15377de6 /epan/ftypes/ftype-integer.c
parent9dcb077e460619b8ab54810e4fef850a0799bcde (diff)
Add "tvb_get_ntoh64()" and "tvb_get_letoh64()" routines to fetch 64-bit
integers. Make FT_INT64 and FT_UINT64 add numerical values, rather than byte-array values, to the protocol tree, and add routines to add specified 64-bit integer values to the protocol tree. Use those routines in the RSVP dissector. svn path=/trunk/; revision=11796
Diffstat (limited to 'epan/ftypes/ftype-integer.c')
-rw-r--r--epan/ftypes/ftype-integer.c221
1 files changed, 221 insertions, 0 deletions
diff --git a/epan/ftypes/ftype-integer.c b/epan/ftypes/ftype-integer.c
index a347d88a98..f15dceed6a 100644
--- a/epan/ftypes/ftype-integer.c
+++ b/epan/ftypes/ftype-integer.c
@@ -191,6 +191,135 @@ cmp_bitwise_and(fvalue_t *a, fvalue_t *b)
return (a->value.integer & b->value.integer);
}
+static void
+int64_fvalue_new(fvalue_t *fv)
+{
+ fv->value.integer64 = 0;
+}
+
+static void
+set_integer64(fvalue_t *fv, guint64 value)
+{
+ fv->value.integer64 = value;
+}
+
+static guint64
+get_integer64(fvalue_t *fv)
+{
+ return fv->value.integer64;
+}
+
+static gboolean
+val64_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value _U_, LogFunc logfunc)
+{
+ guint64 value;
+ char *endptr;
+
+ errno = 0;
+ value = strtoull(s, &endptr, 0);
+
+ if (errno == EINVAL || endptr == s || *endptr != '\0') {
+ /* This isn't a valid number. */
+ if (logfunc != NULL)
+ logfunc("\"%s\" is not a valid number.", s);
+ return FALSE;
+ }
+ if (errno == ERANGE) {
+ if (logfunc != NULL) {
+ if (value == ULONG_MAX) {
+ logfunc("\"%s\" causes an integer overflow.",
+ s);
+ }
+ else {
+ /*
+ * XXX - can "strtoul()" set errno to
+ * ERANGE without returning ULONG_MAX?
+ */
+ logfunc("\"%s\" is not an integer.", s);
+ }
+ }
+ return FALSE;
+ }
+ if (value > G_MAXUINT64) {
+ /*
+ * Fits in an unsigned long, but not in a guint64
+ * (unlikely, but not impossible).
+ */
+ if (logfunc != NULL)
+ logfunc("\"%s\" causes an integer overflow.", s);
+ return FALSE;
+ }
+
+ fv->value.integer64 = value;
+ return TRUE;
+}
+
+static gboolean
+cmp_eq64(fvalue_t *a, fvalue_t *b)
+{
+ return a->value.integer64 == b->value.integer64;
+}
+
+static gboolean
+cmp_ne64(fvalue_t *a, fvalue_t *b)
+{
+ return a->value.integer64 != b->value.integer64;
+}
+
+static gboolean
+u_cmp_gt64(fvalue_t *a, fvalue_t *b)
+{
+ return (gint64)a->value.integer64 > (gint64)b->value.integer64;
+}
+
+static gboolean
+u_cmp_ge64(fvalue_t *a, fvalue_t *b)
+{
+ return (gint64)a->value.integer64 >= (gint64)b->value.integer64;
+}
+
+static gboolean
+u_cmp_lt64(fvalue_t *a, fvalue_t *b)
+{
+ return (gint64)a->value.integer64 < (gint64)b->value.integer64;
+}
+
+static gboolean
+u_cmp_le64(fvalue_t *a, fvalue_t *b)
+{
+ return (gint64)a->value.integer64 <= (gint64)b->value.integer64;
+}
+
+static gboolean
+s_cmp_gt64(fvalue_t *a, fvalue_t *b)
+{
+ return a->value.integer64 > b->value.integer64;
+}
+
+static gboolean
+s_cmp_ge64(fvalue_t *a, fvalue_t *b)
+{
+ return a->value.integer64 >= b->value.integer64;
+}
+
+static gboolean
+s_cmp_lt64(fvalue_t *a, fvalue_t *b)
+{
+ return a->value.integer64 < b->value.integer64;
+}
+
+static gboolean
+s_cmp_le64(fvalue_t *a, fvalue_t *b)
+{
+ return a->value.integer64 <= b->value.integer64;
+}
+
+static gboolean
+cmp_bitwise_and64(fvalue_t *a, fvalue_t *b)
+{
+ return (a->value.integer64 & b->value.integer64);
+}
+
/* BOOLEAN-specific */
static void
@@ -259,10 +388,12 @@ ftype_register_integers(void)
NULL, /* set_value */
set_integer, /* set_value_integer */
+ NULL, /* set_value_integer64 */
NULL, /* set_value_floating */
NULL, /* get_value */
get_integer, /* get_value_integer */
+ NULL, /* get_value_integer64 */
NULL, /* get_value_floating */
cmp_eq,
@@ -291,10 +422,12 @@ ftype_register_integers(void)
NULL, /* set_value */
set_integer, /* set_value_integer */
+ NULL, /* set_value_integer64 */
NULL, /* set_value_floating */
NULL, /* get_value */
get_integer, /* get_value_integer */
+ NULL, /* get_value_integer64 */
NULL, /* get_value_floating */
cmp_eq,
@@ -323,10 +456,12 @@ ftype_register_integers(void)
NULL, /* set_value */
set_integer, /* set_value_integer */
+ NULL, /* set_value_integer64 */
NULL, /* set_value_floating */
NULL, /* get_value */
get_integer, /* get_value_integer */
+ NULL, /* get_value_integer64 */
NULL, /* get_value_floating */
cmp_eq,
@@ -355,10 +490,12 @@ ftype_register_integers(void)
NULL, /* set_value */
set_integer, /* set_value_integer */
+ NULL, /* set_value_integer64 */
NULL, /* set_value_floating */
NULL, /* get_value */
get_integer, /* get_value_integer */
+ NULL, /* get_value_integer64 */
NULL, /* get_value_floating */
cmp_eq,
@@ -374,6 +511,40 @@ ftype_register_integers(void)
NULL, /* len */
NULL, /* slice */
};
+ static ftype_t uint64_type = {
+ "FT_UINT64", /* name */
+ "unsigned, 8 bytes", /* pretty_name */
+ 8, /* wire_size */
+ int64_fvalue_new, /* new_value */
+ NULL, /* free_value */
+ val64_from_unparsed, /* val_from_unparsed */
+ NULL, /* val_from_string */
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
+
+ NULL, /* set_value */
+ NULL, /* set_value_integer */
+ set_integer64, /* set_value_integer64 */
+ NULL, /* set_value_floating */
+
+ NULL, /* get_value */
+ NULL, /* get_value_integer */
+ get_integer64, /* get_value_integer64 */
+ NULL, /* get_value_floating */
+
+ cmp_eq64,
+ cmp_ne64,
+ u_cmp_gt64,
+ u_cmp_ge64,
+ u_cmp_lt64,
+ u_cmp_le64,
+ cmp_bitwise_and64,
+ NULL, /* cmp_contains */
+ NULL, /* cmp_matches */
+
+ NULL,
+ NULL,
+ };
static ftype_t int8_type = {
"FT_INT8", /* name */
"signed, 1 byte", /* pretty_name */
@@ -387,10 +558,12 @@ ftype_register_integers(void)
NULL, /* set_value */
set_integer, /* set_value_integer */
+ NULL, /* set_value_integer64 */
NULL, /* set_value_floating */
NULL, /* get_value */
get_integer, /* get_value_integer */
+ NULL, /* get_value_integer64 */
NULL, /* get_value_floating */
cmp_eq,
@@ -419,10 +592,12 @@ ftype_register_integers(void)
NULL, /* set_value */
set_integer, /* set_value_integer */
+ NULL, /* set_value_integer64 */
NULL, /* set_value_floating */
NULL, /* get_value */
get_integer, /* get_value_integer */
+ NULL, /* get_value_integer64 */
NULL, /* get_value_floating */
cmp_eq,
@@ -451,10 +626,12 @@ ftype_register_integers(void)
NULL, /* set_value */
set_integer, /* set_value_integer */
+ NULL, /* set_value_integer64 */
NULL, /* set_value_floating */
NULL, /* get_value */
get_integer, /* get_value_integer */
+ NULL, /* get_value_integer64 */
NULL, /* get_value_floating */
cmp_eq,
@@ -483,10 +660,12 @@ ftype_register_integers(void)
NULL, /* set_value */
set_integer, /* set_value_integer */
+ NULL, /* set_value_integer64 */
NULL, /* set_value_floating */
NULL, /* get_value */
get_integer, /* get_value_integer */
+ NULL, /* get_value_integer64 */
NULL, /* get_value_floating */
cmp_eq,
@@ -502,6 +681,40 @@ ftype_register_integers(void)
NULL, /* len */
NULL, /* slice */
};
+ static ftype_t int64_type = {
+ "FT_INT64", /* name */
+ "signed, 8 bytes", /* pretty_name */
+ 8, /* wire_size */
+ int64_fvalue_new, /* new_value */
+ NULL, /* free_value */
+ val64_from_unparsed, /* val_from_unparsed */
+ NULL, /* val_from_string */
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
+
+ NULL, /* set_value */
+ NULL, /* set_value_integer */
+ set_integer64, /* set_value_integer64 */
+ NULL, /* set_value_floating */
+
+ NULL, /* get_value */
+ NULL, /* get_value_integer */
+ get_integer64, /* get_value_integer64 */
+ NULL, /* get_value_floating */
+
+ cmp_eq64,
+ cmp_ne64,
+ s_cmp_gt64,
+ s_cmp_ge64,
+ s_cmp_lt64,
+ s_cmp_le64,
+ cmp_bitwise_and64,
+ NULL, /* cmp_contains */
+ NULL, /* cmp_matches */
+
+ NULL,
+ NULL,
+ };
static ftype_t boolean_type = {
"FT_BOOLEAN", /* name */
"Boolean", /* pretty_name */
@@ -515,10 +728,12 @@ ftype_register_integers(void)
NULL, /* set_value */
set_integer, /* set_value_integer */
+ NULL, /* set_value_integer64 */
NULL, /* set_value_floating */
NULL, /* get_value */
get_integer, /* get_value_integer */
+ NULL, /* get_value_integer64 */
NULL, /* get_value_floating */
bool_eq, /* cmp_eq */
@@ -548,10 +763,12 @@ ftype_register_integers(void)
NULL, /* set_value */
set_integer, /* set_value_integer */
+ NULL, /* set_value_integer64 */
NULL, /* set_value_floating */
NULL, /* get_value */
get_integer, /* get_value_integer */
+ NULL, /* get_value_integer64 */
NULL, /* get_value_floating */
cmp_eq,
@@ -581,10 +798,12 @@ ftype_register_integers(void)
NULL, /* set_value */
set_integer, /* set_value_integer */
+ NULL, /* set_value_integer64 */
NULL, /* set_value_floating */
NULL, /* get_value */
get_integer, /* get_value_integer */
+ NULL, /* get_value_integer64 */
NULL, /* get_value_floating */
cmp_eq,
@@ -605,10 +824,12 @@ ftype_register_integers(void)
ftype_register(FT_UINT16, &uint16_type);
ftype_register(FT_UINT24, &uint24_type);
ftype_register(FT_UINT32, &uint32_type);
+ ftype_register(FT_UINT64, &uint64_type);
ftype_register(FT_INT8, &int8_type);
ftype_register(FT_INT16, &int16_type);
ftype_register(FT_INT24, &int24_type);
ftype_register(FT_INT32, &int32_type);
+ ftype_register(FT_INT64, &int64_type);
ftype_register(FT_BOOLEAN, &boolean_type);
ftype_register(FT_IPXNET, &ipxnet_type);
ftype_register(FT_FRAMENUM, &framenum_type);