aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGilbert Ramirez <gram@alumni.rice.edu>2003-02-08 04:22:37 +0000
committerGilbert Ramirez <gram@alumni.rice.edu>2003-02-08 04:22:37 +0000
commit9615c4ef25937edc242ff81a9ee7ec7a35aa7698 (patch)
treef03877f03d3e572f98e4e87d046f3a9017c00742
parent086e99dff9584dc837b1bb1be8611468bc05d324 (diff)
Provide a way for ftype modules to provide a string representation
of their value. Provide such a method for FT_BYTES, FT_UINT_BYTES, and FT_ETHER. Have proto_alloc_dfilter_string() use the new methods. This is part of a movement of ftype-related code out of proto.c and into the ftype code. The immediate effect is that generated display filters for long byte sequences don't incorrectly have trailing periods ("...") to indicate continuation. svn path=/trunk/; revision=7100
-rw-r--r--epan/ftypes/ftype-bytes.c152
-rw-r--r--epan/ftypes/ftype-double.c6
-rw-r--r--epan/ftypes/ftype-integer.c24
-rw-r--r--epan/ftypes/ftype-ipv4.c4
-rw-r--r--epan/ftypes/ftype-none.c4
-rw-r--r--epan/ftypes/ftype-string.c8
-rw-r--r--epan/ftypes/ftype-time.c6
-rw-r--r--epan/ftypes/ftype-tvbuff.c4
-rw-r--r--epan/ftypes/ftypes-int.h6
-rw-r--r--epan/ftypes/ftypes.c16
-rw-r--r--epan/ftypes/ftypes.h8
-rw-r--r--epan/proto.c31
12 files changed, 183 insertions, 86 deletions
diff --git a/epan/ftypes/ftype-bytes.c b/epan/ftypes/ftype-bytes.c
index 0bd220394b..546195442b 100644
--- a/epan/ftypes/ftype-bytes.c
+++ b/epan/ftypes/ftype-bytes.c
@@ -1,5 +1,5 @@
/*
- * $Id: ftype-bytes.c,v 1.13 2002/08/28 20:41:00 jmayer Exp $
+ * $Id: ftype-bytes.c,v 1.14 2003/02/08 04:22:37 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -57,6 +57,40 @@ bytes_fvalue_set(fvalue_t *fv, gpointer value, gboolean already_copied)
fv->value.bytes = value;
}
+static int
+bytes_strlen(fvalue_t *fv)
+{
+ /* 3 bytes for each byte of the byte "NN:" minus 1 byte
+ * as there's no trailing ":" */
+ return fv->value.bytes->len * 3 - 1;
+}
+
+static char *
+bytes_to_string(fvalue_t *fv)
+{
+ guint8 *c;
+ char *buf;
+ char *write_cursor;
+ unsigned int i;
+
+ c = fv->value.bytes->data;
+ buf = g_malloc0(bytes_strlen(fv));
+ write_cursor = buf;
+
+ for (i = 0; i < fv->value.bytes->len; i++) {
+ if (i == 0) {
+ sprintf(write_cursor, "%02x", *c++);
+ write_cursor += 2;
+
+ }
+ else {
+ sprintf(write_cursor, ":%02x", *c++);
+ write_cursor += 3;
+ }
+ }
+ return buf;
+}
+
static void
common_fvalue_set(fvalue_t *fv, guint8* data, guint len)
{
@@ -557,6 +591,8 @@ ftype_register_bytes(void)
bytes_fvalue_new, /* new_value */
bytes_fvalue_free, /* free_value */
val_from_string, /* val_from_string */
+ bytes_to_string, /* val_to_string_repr */
+ bytes_strlen, /* len_string_repr */
bytes_fvalue_set, /* set_value */
NULL, /* set_value_integer */
@@ -564,7 +600,7 @@ ftype_register_bytes(void)
value_get, /* get_value */
NULL, /* get_value_integer */
- NULL,
+ NULL, /* get_value_floating */
cmp_eq,
cmp_ne,
@@ -584,6 +620,8 @@ ftype_register_bytes(void)
bytes_fvalue_new, /* new_value */
bytes_fvalue_free, /* free_value */
val_from_string, /* val_from_string */
+ bytes_to_string, /* val_to_string_repr */
+ bytes_strlen, /* len_string_repr */
bytes_fvalue_set, /* set_value */
NULL, /* set_value_integer */
@@ -591,7 +629,7 @@ ftype_register_bytes(void)
value_get, /* get_value */
NULL, /* get_value_integer */
- NULL,
+ NULL, /* get_value_floating */
cmp_eq,
cmp_ne,
@@ -605,20 +643,22 @@ ftype_register_bytes(void)
};
static ftype_t ether_type = {
- "FT_ETHER",
- "Ethernet or other MAC address",
- ETHER_LEN,
- bytes_fvalue_new,
- bytes_fvalue_free,
- ether_from_string,
+ "FT_ETHER", /* name */
+ "Ethernet or other MAC address",/* pretty_name */
+ ETHER_LEN, /* wire_size */
+ bytes_fvalue_new, /* new_value */
+ bytes_fvalue_free, /* free_value */
+ ether_from_string, /* val_from_string */
+ bytes_to_string, /* val_to_string_repr */
+ bytes_strlen, /* len_string_repr */
- ether_fvalue_set,
- NULL,
- NULL,
+ ether_fvalue_set, /* set_value */
+ NULL, /* set_value_integer */
+ NULL, /* set_value_floating */
- value_get,
- NULL,
- NULL,
+ value_get, /* get_value */
+ NULL, /* get_value_integer */
+ NULL, /* get_value_floating */
cmp_eq,
cmp_ne,
@@ -632,20 +672,22 @@ ftype_register_bytes(void)
};
static ftype_t ipv6_type = {
- "FT_IPv6",
- "IPv6 address",
- IPv6_LEN,
- bytes_fvalue_new,
- bytes_fvalue_free,
- ipv6_from_string,
+ "FT_IPv6", /* name */
+ "IPv6 address", /* pretty_name */
+ IPv6_LEN, /* wire_size */
+ bytes_fvalue_new, /* new_value */
+ bytes_fvalue_free, /* free_value */
+ ipv6_from_string, /* val_from_string */
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
- ipv6_fvalue_set,
- NULL,
- NULL,
+ ipv6_fvalue_set, /* set_value */
+ NULL, /* set_value_integer */
+ NULL, /* set_value_floating */
- value_get,
- NULL,
- NULL,
+ value_get, /* get_value */
+ NULL, /* get_value_integer */
+ NULL, /* get_value_floating */
cmp_eq,
cmp_ne,
@@ -659,20 +701,22 @@ ftype_register_bytes(void)
};
static ftype_t u64_type = {
- "FT_UINT64",
- "Unsigned 64-bit integer",
- U64_LEN,
- bytes_fvalue_new,
- bytes_fvalue_free,
- u64_from_string,
+ "FT_UINT64", /* name */
+ "Unsigned 64-bit integer", /* pretty_name */
+ U64_LEN, /* wire_size */
+ bytes_fvalue_new, /* new_value */
+ bytes_fvalue_free, /* free_value */
+ u64_from_string, /* val_from_string */
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
- u64_fvalue_set,
- NULL,
- NULL,
+ u64_fvalue_set, /* set_value */
+ NULL, /* set_value_integer */
+ NULL, /* set_value_floating */
- value_get,
- NULL,
- NULL,
+ value_get, /* get_value */
+ NULL, /* get_value_integer */
+ NULL, /* get_value_floating */
cmp_eq,
cmp_ne,
@@ -686,20 +730,22 @@ ftype_register_bytes(void)
};
static ftype_t i64_type = {
- "FT_INT64",
- "Signed 64-bit integer",
- U64_LEN,
- bytes_fvalue_new,
- bytes_fvalue_free,
- i64_from_string,
-
- u64_fvalue_set,
- NULL,
- NULL,
-
- value_get,
- NULL,
- NULL,
+ "FT_INT64", /* name */
+ "Signed 64-bit integer", /* pretty_name */
+ U64_LEN, /* wire_size */
+ bytes_fvalue_new, /* new_value */
+ bytes_fvalue_free, /* free_value */
+ i64_from_string, /* val_from_string */
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
+
+ u64_fvalue_set, /* set_value */
+ NULL, /* set_value_integer */
+ NULL, /* set_value_floating */
+
+ value_get, /* get_value */
+ NULL, /* get_value_integer */
+ NULL, /* get_value_floating */
cmp_eq,
cmp_ne,
diff --git a/epan/ftypes/ftype-double.c b/epan/ftypes/ftype-double.c
index b798365dd3..2091bda846 100644
--- a/epan/ftypes/ftype-double.c
+++ b/epan/ftypes/ftype-double.c
@@ -1,5 +1,5 @@
/*
- * $Id: ftype-double.c,v 1.7 2002/08/28 20:41:00 jmayer Exp $
+ * $Id: ftype-double.c,v 1.8 2003/02/08 04:22:37 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -124,6 +124,8 @@ ftype_register_double(void)
double_fvalue_new,
NULL,
val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
NULL,
NULL,
@@ -151,6 +153,8 @@ ftype_register_double(void)
double_fvalue_new,
NULL,
val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
NULL,
NULL,
diff --git a/epan/ftypes/ftype-integer.c b/epan/ftypes/ftype-integer.c
index 145de88666..da70ecc2ec 100644
--- a/epan/ftypes/ftype-integer.c
+++ b/epan/ftypes/ftype-integer.c
@@ -1,5 +1,5 @@
/*
- * $Id: ftype-integer.c,v 1.11 2002/12/19 02:58:51 guy Exp $
+ * $Id: ftype-integer.c,v 1.12 2003/02/08 04:22:37 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -212,6 +212,8 @@ ftype_register_integers(void)
int_fvalue_new,
NULL,
val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
NULL,
set_integer,
@@ -238,6 +240,8 @@ ftype_register_integers(void)
int_fvalue_new,
NULL,
val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
NULL,
set_integer,
@@ -264,6 +268,8 @@ ftype_register_integers(void)
int_fvalue_new,
NULL,
val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
NULL,
set_integer,
@@ -290,6 +296,8 @@ ftype_register_integers(void)
int_fvalue_new,
NULL,
val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
NULL,
set_integer,
@@ -316,6 +324,8 @@ ftype_register_integers(void)
int_fvalue_new,
NULL,
val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
NULL,
set_integer,
@@ -342,6 +352,8 @@ ftype_register_integers(void)
int_fvalue_new,
NULL,
val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
NULL,
set_integer,
@@ -368,6 +380,8 @@ ftype_register_integers(void)
int_fvalue_new,
NULL,
val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
NULL,
set_integer,
@@ -394,6 +408,8 @@ ftype_register_integers(void)
int_fvalue_new,
NULL,
val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
NULL,
set_integer,
@@ -420,6 +436,8 @@ ftype_register_integers(void)
boolean_fvalue_new,
NULL,
val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
NULL,
set_integer,
@@ -447,6 +465,8 @@ ftype_register_integers(void)
int_fvalue_new,
NULL,
ipxnet_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
NULL,
set_integer,
@@ -474,6 +494,8 @@ ftype_register_integers(void)
int_fvalue_new,
NULL,
val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
NULL,
set_integer,
diff --git a/epan/ftypes/ftype-ipv4.c b/epan/ftypes/ftype-ipv4.c
index dacf82a68e..ad978a7915 100644
--- a/epan/ftypes/ftype-ipv4.c
+++ b/epan/ftypes/ftype-ipv4.c
@@ -1,5 +1,5 @@
/*
- * $Id: ftype-ipv4.c,v 1.9 2002/08/28 20:41:00 jmayer Exp $
+ * $Id: ftype-ipv4.c,v 1.10 2003/02/08 04:22:37 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -168,6 +168,8 @@ ftype_register_ipv4(void)
NULL,
NULL,
val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
NULL,
set_integer,
diff --git a/epan/ftypes/ftype-none.c b/epan/ftypes/ftype-none.c
index c3101bb177..864c8a6b9a 100644
--- a/epan/ftypes/ftype-none.c
+++ b/epan/ftypes/ftype-none.c
@@ -1,5 +1,5 @@
/*
- * $Id: ftype-none.c,v 1.4 2002/08/28 20:41:00 jmayer Exp $
+ * $Id: ftype-none.c,v 1.5 2003/02/08 04:22:37 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -39,6 +39,8 @@ ftype_register_none(void)
NULL,
NULL,
NULL,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
NULL,
NULL,
diff --git a/epan/ftypes/ftype-string.c b/epan/ftypes/ftype-string.c
index 3a50134dfb..63f508addb 100644
--- a/epan/ftypes/ftype-string.c
+++ b/epan/ftypes/ftype-string.c
@@ -1,5 +1,5 @@
/*
- * $Id: ftype-string.c,v 1.7 2002/08/28 20:41:00 jmayer Exp $
+ * $Id: ftype-string.c,v 1.8 2003/02/08 04:22:37 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -130,6 +130,8 @@ ftype_register_string(void)
string_fvalue_new,
string_fvalue_free,
val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
string_fvalue_set,
NULL,
@@ -156,6 +158,8 @@ ftype_register_string(void)
string_fvalue_new,
string_fvalue_free,
val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
string_fvalue_set,
NULL,
@@ -182,6 +186,8 @@ ftype_register_string(void)
string_fvalue_new,
string_fvalue_free,
val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
string_fvalue_set,
NULL,
diff --git a/epan/ftypes/ftype-time.c b/epan/ftypes/ftype-time.c
index 77d8f6f1c6..f35483da7b 100644
--- a/epan/ftypes/ftype-time.c
+++ b/epan/ftypes/ftype-time.c
@@ -1,5 +1,5 @@
/*
- * $Id: ftype-time.c,v 1.17 2002/08/28 20:41:00 jmayer Exp $
+ * $Id: ftype-time.c,v 1.18 2003/02/08 04:22:37 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -308,6 +308,8 @@ ftype_register_time(void)
time_fvalue_new,
NULL,
absolute_val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
time_fvalue_set,
NULL,
@@ -333,6 +335,8 @@ ftype_register_time(void)
time_fvalue_new,
NULL,
relative_val_from_string,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
time_fvalue_set,
NULL,
diff --git a/epan/ftypes/ftype-tvbuff.c b/epan/ftypes/ftype-tvbuff.c
index f899bfc62a..f051fd3094 100644
--- a/epan/ftypes/ftype-tvbuff.c
+++ b/epan/ftypes/ftype-tvbuff.c
@@ -1,5 +1,5 @@
/*
- * $Id: ftype-tvbuff.c,v 1.7 2002/08/28 20:41:00 jmayer Exp $
+ * $Id: ftype-tvbuff.c,v 1.8 2003/02/08 04:22:37 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -85,6 +85,8 @@ ftype_register_tvbuff(void)
value_new,
NULL,
NULL,
+ NULL, /* val_to_string_repr */
+ NULL, /* len_string_repr */
value_set,
NULL,
diff --git a/epan/ftypes/ftypes-int.h b/epan/ftypes/ftypes-int.h
index 0796782b6e..c264ff079a 100644
--- a/epan/ftypes/ftypes-int.h
+++ b/epan/ftypes/ftypes-int.h
@@ -1,5 +1,5 @@
/*
- * $Id: ftypes-int.h,v 1.6 2002/08/28 20:41:00 jmayer Exp $
+ * $Id: ftypes-int.h,v 1.7 2003/02/08 04:22:37 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -30,6 +30,8 @@ typedef void (*FvalueNewFunc)(fvalue_t*);
typedef void (*FvalueFreeFunc)(fvalue_t*);
typedef gboolean (*FvalueFromString)(fvalue_t*, char*, LogFunc);
+typedef char* (*FvalueToStringRepr)(fvalue_t*);
+typedef int (*FvalueStringReprLen)(fvalue_t*);
typedef void (*FvalueSetFunc)(fvalue_t*, gpointer, gboolean);
typedef void (*FvalueSetIntegerFunc)(fvalue_t*, guint32);
@@ -51,6 +53,8 @@ struct _ftype_t {
FvalueNewFunc new_value;
FvalueFreeFunc free_value;
FvalueFromString val_from_string;
+ FvalueToStringRepr val_to_string_repr;
+ FvalueStringReprLen len_string_repr;
/* could be union */
FvalueSetFunc set_value;
diff --git a/epan/ftypes/ftypes.c b/epan/ftypes/ftypes.c
index d681fe037d..a0e0804d57 100644
--- a/epan/ftypes/ftypes.c
+++ b/epan/ftypes/ftypes.c
@@ -1,5 +1,5 @@
/*
- * $Id: ftypes.c,v 1.7 2002/08/28 20:41:00 jmayer Exp $
+ * $Id: ftypes.c,v 1.8 2003/02/08 04:22:37 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -271,6 +271,20 @@ fvalue_length(fvalue_t *fv)
return fv->ftype->wire_size;
}
+int
+fvalue_string_repr_len(fvalue_t *fv)
+{
+ g_assert(fv->ftype->len_string_repr);
+ return fv->ftype->len_string_repr(fv);
+}
+
+char *
+fvalue_to_string_repr(fvalue_t *fv)
+{
+ g_assert(fv->ftype->val_to_string_repr);
+ return fv->ftype->val_to_string_repr(fv);
+}
+
typedef struct {
fvalue_t *fv;
GByteArray *bytes;
diff --git a/epan/ftypes/ftypes.h b/epan/ftypes/ftypes.h
index 869123da64..d4fc926900 100644
--- a/epan/ftypes/ftypes.h
+++ b/epan/ftypes/ftypes.h
@@ -1,7 +1,7 @@
/* ftypes.h
* Definitions for field types
*
- * $Id: ftypes.h,v 1.15 2002/12/19 02:58:51 guy Exp $
+ * $Id: ftypes.h,v 1.16 2003/02/08 04:22:37 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -145,6 +145,12 @@ typedef void (*LogFunc)(char*,...);
fvalue_t*
fvalue_from_string(ftenum_t ftype, char *s, LogFunc log);
+int
+fvalue_string_repr_len(fvalue_t *fv);
+
+char *
+fvalue_to_string_repr(fvalue_t *fv);
+
const char*
fvalue_type_name(fvalue_t *fv);
diff --git a/epan/proto.c b/epan/proto.c
index 3eb3ed441a..874d929130 100644
--- a/epan/proto.c
+++ b/epan/proto.c
@@ -1,7 +1,7 @@
/* proto.c
* Routines for protocol tree
*
- * $Id: proto.c,v 1.81 2003/01/31 03:17:52 guy Exp $
+ * $Id: proto.c,v 1.82 2003/02/08 04:22:30 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -3505,18 +3505,6 @@ proto_alloc_dfilter_string(field_info *finfo, guint8 *pd)
fvalue_get_floating(finfo->value));
break;
- case FT_ETHER:
- /*
- * 4 bytes for " == ".
- * 17 bytes for "NN:NN:NN:NN:NN:NN".
- * 1 byte for the trailing '\0'.
- */
- dfilter_len = abbrev_len + 4 + 17 + 1;
- buf = g_malloc0(dfilter_len);
- snprintf(buf, dfilter_len, "%s == %s",
- hfinfo->abbrev,
- ether_to_str(fvalue_get(finfo->value)));
- break;
case FT_ABSOLUTE_TIME:
/*
@@ -3561,24 +3549,21 @@ proto_alloc_dfilter_string(field_info *finfo, guint8 *pd)
hfinfo->abbrev, value_str);
break;
+ case FT_ETHER:
case FT_BYTES:
case FT_UINT_BYTES:
/*
* 4 bytes for " == ".
- * 3 bytes for each byte of the byte string, as
- * "NN:", minus 1 byte as there's no trailing ":".
* 1 byte for the trailing '\0'.
*
- * XXX - what are the other 2 bytes for?
*/
- dfilter_len = fvalue_length(finfo->value)*3 - 1;
- dfilter_len += abbrev_len + 4 + 2 + 1;
+ dfilter_len = fvalue_string_repr_len(finfo->value);
+ dfilter_len += abbrev_len + 4 + 1;
buf = g_malloc0(dfilter_len);
- snprintf(buf, dfilter_len, "%s == %s",
- hfinfo->abbrev,
- /* XXX - bytes_to_str_punct() will truncate long strings with '...' */
- bytes_to_str_punct(fvalue_get(finfo->value),
- fvalue_length(finfo->value),':'));
+ snprintf(buf, dfilter_len, "%s == ", hfinfo->abbrev);
+ stringified = fvalue_to_string_repr(finfo->value);
+ strcat(buf, stringified);
+ g_free(stringified);
break;
default: