Provide a way for ftype modules to provide a string representation
authorGilbert Ramirez <gram@alumni.rice.edu>
Sat, 8 Feb 2003 04:22:37 +0000 (04:22 -0000)
committerGilbert Ramirez <gram@alumni.rice.edu>
Sat, 8 Feb 2003 04:22:37 +0000 (04:22 -0000)
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

12 files changed:
epan/ftypes/ftype-bytes.c
epan/ftypes/ftype-double.c
epan/ftypes/ftype-integer.c
epan/ftypes/ftype-ipv4.c
epan/ftypes/ftype-none.c
epan/ftypes/ftype-string.c
epan/ftypes/ftype-time.c
epan/ftypes/ftype-tvbuff.c
epan/ftypes/ftypes-int.h
epan/ftypes/ftypes.c
epan/ftypes/ftypes.h
epan/proto.c

index 0bd220394bd84580fd1cb44237cfa13140e9854b..546195442b968017fe1acecc2d3e65915db767d1 100644 (file)
@@ -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,
index b798365dd3161b4bb9ba212c8ad7035bf76b5a7e..2091bda8460f6c600bfc33fc9fe44ee8ad6d104f 100644 (file)
@@ -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,
index 145de886668779a7a21eb504d325aa73fdc8b87b..da70ecc2ecd2017e34794e5d494d1585470206c3 100644 (file)
@@ -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,
index dacf82a68e5d33e4cbaeab7a3ff2e954e8a7992a..ad978a79153f3c36a4c992ba5e493c9606b840b7 100644 (file)
@@ -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,
index c3101bb1777c90e8063ac13709d10f2140c05d7a..864c8a6b9aa80d9cff785d540fe5d2261e524aca 100644 (file)
@@ -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,
index 3a50134dfb890fb0d0b2114952e27091b3ee3fc2..63f508addbf4cf51d59a02ff258770968bd655a9 100644 (file)
@@ -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,
index 77d8f6f1c635e6e74805a5f6b0eb5357279c630b..f35483da7b480d15927772dfdd25062b66a32631 100644 (file)
@@ -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,
index f899bfc62a43c0b6a63d38c51c8a43b718d2ae36..f051fd30941b69dd756984d3b2256f632e85564c 100644 (file)
@@ -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,
index 0796782b6e46f72a2d8ab88f4b7368ab60f8f8a0..c264ff079aa067edef7756a707416fdb7f3c4346 100644 (file)
@@ -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;
index d681fe037d0e4ecf25164a50eae12449cedda267..a0e0804d5706dd9e9422ebcd6b59c1c96fb0c761 100644 (file)
@@ -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;
index 869123da64823d59e00b23f1cbae7948cfca5213..d4fc9269003a6b41262ddd93a8bc1e4dde46fb84 100644 (file)
@@ -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);
 
index 3eb3ed441ac7f9bbfd148a1d09bd4518604bf7ce..874d929130c7077b30c851e72934efba14c3c4e1 100644 (file)
@@ -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: