From c68f62210fc20890502cb84dbc2ea4321de5b791 Mon Sep 17 00:00:00 2001 From: Guy Harris Date: Sun, 22 Aug 2004 00:31:58 +0000 Subject: 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 --- epan/ftypes/ftype-integer.c | 221 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) (limited to 'epan/ftypes/ftype-integer.c') 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); -- cgit v1.2.3