aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>2005-10-22 05:43:09 +0000
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>2005-10-22 05:43:09 +0000
commit93e0009cbe2967763c1610127b02d2b4630f3505 (patch)
tree8a7ef9f1a8c2b0c2edfaf69d8041b36e1b2d9282 /epan
parent959ae9f555f66e5c086a5865e6298e9133221355 (diff)
Move the ptvcursor.c code to epan/proto, and make ptvcursor_add() handle
FT_UINT_BYTES and FT_UINT_STRING correctly when the tree argument is null (which involves carving proto_tree_add_item() into bits and having both ptvcursor_add() and proto_tree_add_item() call those bits). git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@16287 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan')
-rw-r--r--epan/Makefile.common1
-rw-r--r--epan/proto.c210
-rw-r--r--epan/ptvcursor.c116
3 files changed, 182 insertions, 145 deletions
diff --git a/epan/Makefile.common b/epan/Makefile.common
index 760e544105..086b7bffa4 100644
--- a/epan/Makefile.common
+++ b/epan/Makefile.common
@@ -63,7 +63,6 @@ LIBETHEREAL_SRC = \
plugins.c \
prefs.c \
proto.c \
- ptvcursor.c \
radius_dict.c \
range.c \
reassemble.c \
diff --git a/epan/proto.c b/epan/proto.c
index 5e66c4beca..b56682a73f 100644
--- a/epan/proto.c
+++ b/epan/proto.c
@@ -33,6 +33,7 @@
#include <float.h>
#include "packet.h"
+#include "ptvcursor.h"
#include "strutil.h"
#include "addr_resolv.h"
#include "plugins.h"
@@ -42,6 +43,12 @@
#include "tvbuff.h"
#include "emem.h"
+struct ptvcursor {
+ proto_tree *tree;
+ tvbuff_t *tvb;
+ gint offset;
+};
+
#define cVALS(x) (const value_string*)(x)
#if 1
@@ -97,6 +104,14 @@ static const char* hfinfo_int64_format(header_field_info *hfinfo);
static proto_item*
proto_tree_add_node(proto_tree *tree, field_info *fi);
+static header_field_info *
+get_hfi_and_length(int hfindex, tvbuff_t *tvb, gint start, gint *length,
+ gint *item_length);
+
+static field_info *
+new_field_info(proto_tree *tree, header_field_info *hfinfo, tvbuff_t *tvb,
+ gint start, gint item_length);
+
static field_info *
alloc_field_info(proto_tree *tree, int hfindex, tvbuff_t *tvb,
gint start, gint *length);
@@ -579,6 +594,53 @@ proto_registrar_get_byname(const char *field_name)
return g_tree_lookup(gpa_name_tree, field_name);
}
+/* Allocates an initializes a ptvcursor_t with 3 variables:
+ * proto_tree, tvbuff, and offset. */
+ptvcursor_t*
+ptvcursor_new(proto_tree *tree, tvbuff_t *tvb, gint offset)
+{
+ ptvcursor_t *ptvc;
+
+ ptvc = g_new(ptvcursor_t, 1);
+ ptvc->tree = tree;
+ ptvc->tvb = tvb;
+ ptvc->offset = offset;
+ return ptvc;
+}
+
+/* Frees memory for ptvcursor_t, but nothing deeper than that. */
+void
+ptvcursor_free(ptvcursor_t *ptvc)
+{
+ g_free(ptvc);
+}
+
+/* Returns tvbuff. */
+tvbuff_t*
+ptvcursor_tvbuff(ptvcursor_t* ptvc)
+{
+ return ptvc->tvb;
+}
+
+/* Returns current offset. */
+gint
+ptvcursor_current_offset(ptvcursor_t* ptvc)
+{
+ return ptvc->offset;
+}
+
+proto_tree*
+ptvcursor_tree(ptvcursor_t* ptvc)
+{
+ return ptvc->tree;
+}
+
+void
+ptvcursor_set_tree(ptvcursor_t* ptvc, proto_tree *tree)
+{
+ ptvc->tree = tree;
+}
+
/* Add a text-only node, leaving it to our caller to fill the text in */
static proto_item *
proto_tree_add_text_node(proto_tree *tree, tvbuff_t *tvb, gint start, gint length)
@@ -724,11 +786,10 @@ get_int_value(tvbuff_t *tvb, gint offset, gint length, gboolean little_endian)
/* Add an item to a proto_tree, using the text label registered to that item;
the item is extracted from the tvbuff handed to it. */
-proto_item *
-proto_tree_add_item(proto_tree *tree, int hfindex, tvbuff_t *tvb,
- gint start, gint length, gboolean little_endian)
+static proto_item *
+proto_tree_new_item(field_info *new_fi, proto_tree *tree, int hfindex,
+ tvbuff_t *tvb, gint start, gint length, gboolean little_endian)
{
- field_info *new_fi;
proto_item *pi;
guint32 value, n;
float floatval;
@@ -737,16 +798,6 @@ proto_tree_add_item(proto_tree *tree, int hfindex, tvbuff_t *tvb,
GHashTable *hash;
GPtrArray *ptrs;
- if (!tree)
- return(NULL);
-
- TRY_TO_FAKE_THIS_ITEM(tree, hfindex);
-
- new_fi = alloc_field_info(tree, hfindex, tvb, start, &length);
-
- if (new_fi == NULL)
- return(NULL);
-
/* there is a possibility here that we might raise an exception
* and thus would lose track of the field_info.
* store it in a temp so that if we come here again we can reclaim
@@ -981,6 +1032,66 @@ proto_tree_add_item(proto_tree *tree, int hfindex, tvbuff_t *tvb,
return pi;
}
+/* Gets data from tvbuff, adds it to proto_tree, increments offset,
+ and returns proto_item* */
+proto_item*
+ptvcursor_add(ptvcursor_t *ptvc, int hfindex, gint length,
+ gboolean little_endian)
+{
+ field_info *new_fi;
+ header_field_info *hfinfo;
+ gint item_length;
+ guint32 n;
+ int offset;
+
+ offset = ptvc->offset;
+ hfinfo = get_hfi_and_length(hfindex, ptvc->tvb, offset, &length,
+ &item_length);
+ ptvc->offset += length;
+ if (hfinfo->type == FT_UINT_BYTES || hfinfo->type == FT_UINT_STRING) {
+ /*
+ * The length of the rest of the item is in the first N
+ * bytes of the item.
+ */
+ n = get_uint_value(ptvc->tvb, offset, length, little_endian);
+ ptvc->offset += n;
+ }
+ if (ptvc->tree == NULL)
+ return NULL;
+
+ TRY_TO_FAKE_THIS_ITEM(ptvc->tree, hfindex);
+
+ new_fi = new_field_info(ptvc->tree, hfinfo, ptvc->tvb, offset,
+ item_length);
+ if (new_fi == NULL)
+ return NULL;
+
+ return proto_tree_new_item(new_fi, ptvc->tree, hfindex, ptvc->tvb,
+ offset, length, little_endian);
+}
+
+/* Add an item to a proto_tree, using the text label registered to that item;
+ the item is extracted from the tvbuff handed to it. */
+proto_item *
+proto_tree_add_item(proto_tree *tree, int hfindex, tvbuff_t *tvb,
+ gint start, gint length, gboolean little_endian)
+{
+ field_info *new_fi;
+
+ if (!tree)
+ return(NULL);
+
+ TRY_TO_FAKE_THIS_ITEM(tree, hfindex);
+
+ new_fi = alloc_field_info(tree, hfindex, tvb, start, &length);
+
+ if (new_fi == NULL)
+ return(NULL);
+
+ return proto_tree_new_item(new_fi, tree, hfindex, tvb, start,
+ length, little_endian);
+}
+
proto_item *
proto_tree_add_item_hidden(proto_tree *tree, int hfindex, tvbuff_t *tvb,
gint start, gint length, gboolean little_endian)
@@ -1022,6 +1133,28 @@ proto_tree_add_none_format(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint st
return pi;
}
+/* Gets data from tvbuff, adds it to proto_tree, *DOES NOT* increment
+ * offset, and returns proto_item* */
+proto_item*
+ptvcursor_add_no_advance(ptvcursor_t* ptvc, int hf, gint length,
+ gboolean endianness)
+{
+ proto_item *item;
+
+ item = proto_tree_add_item(ptvc->tree, hf, ptvc->tvb, ptvc->offset,
+ length, endianness);
+
+ return item;
+}
+
+/* Advance the ptvcursor's offset within its tvbuff without
+ * adding anything to the proto_tree. */
+void
+ptvcursor_advance(ptvcursor_t* ptvc, gint length)
+{
+ ptvc->offset += length;
+}
+
static void
proto_tree_set_protocol_tvb(field_info *fi, tvbuff_t *tvb)
@@ -2203,13 +2336,12 @@ proto_tree_add_pi(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
return pi;
}
-static field_info *
-alloc_field_info(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
- gint *length)
+
+static header_field_info *
+get_hfi_and_length(int hfindex, tvbuff_t *tvb, gint start, gint *length,
+ gint *item_length)
{
header_field_info *hfinfo;
- field_info *fi;
- gint item_length;
gint length_remaining;
/*
@@ -2308,9 +2440,9 @@ alloc_field_info(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
default:
DISSECTOR_ASSERT_NOT_REACHED();
}
- item_length = *length;
+ *item_length = *length;
} else {
- item_length = *length;
+ *item_length = *length;
if (hfinfo->type == FT_PROTOCOL || hfinfo->type == FT_NONE) {
/*
* These types are for interior nodes of the
@@ -2322,18 +2454,29 @@ alloc_field_info(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
* Ethereal, we don't highlight stuff past
* the end of the data.
*/
- /* XXX - what to do, if we don't have a tvb? */
- if(tvb) {
- length_remaining = tvb_length_remaining(tvb, start);
- if (item_length < 0 || (item_length > 0 && (length_remaining < item_length)))
- item_length = length_remaining;
- }
+ /* XXX - what to do, if we don't have a tvb? */
+ if (tvb) {
+ length_remaining = tvb_length_remaining(tvb, start);
+ if (*item_length < 0 ||
+ (*item_length > 0 &&
+ (length_remaining < *item_length)))
+ *item_length = length_remaining;
+ }
}
- if (item_length < 0) {
+ if (*item_length < 0) {
THROW(ReportedBoundsError);
}
}
+ return hfinfo;
+}
+
+static field_info *
+new_field_info(proto_tree *tree, header_field_info *hfinfo, tvbuff_t *tvb,
+ gint start, gint item_length)
+{
+ field_info *fi;
+
FIELD_INFO_NEW(fi);
fi->hfinfo = hfinfo;
@@ -2353,6 +2496,17 @@ alloc_field_info(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
return fi;
}
+static field_info *
+alloc_field_info(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint start,
+ gint *length)
+{
+ header_field_info *hfinfo;
+ gint item_length;
+
+ hfinfo = get_hfi_and_length(hfindex, tvb, start, length, &item_length);
+ return new_field_info(tree, hfinfo, tvb, start, item_length);
+}
+
/* Set representation of a proto_tree entry, if the protocol tree is to
be visible. */
static void
diff --git a/epan/ptvcursor.c b/epan/ptvcursor.c
deleted file mode 100644
index cde56022f0..0000000000
--- a/epan/ptvcursor.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/* ptvcursor.c
- *
- * Proto Tree TVBuff cursor
- * Gilbert Ramirez <gram@alumni.rice.edu>
- *
- * $Id$
- *
- * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@zing.org>
- * Copyright 2000 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#include "ptvcursor.h"
-
-
-struct ptvcursor {
- proto_tree *tree;
- tvbuff_t *tvb;
- gint offset;
-};
-
-
-/* Allocates an initializes a ptvcursor_t with 3 variables:
- * proto_tree, tvbuff, and offset. */
-ptvcursor_t*
-ptvcursor_new(proto_tree *tree, tvbuff_t *tvb, gint offset)
-{
- ptvcursor_t *ptvc;
-
- ptvc = g_new(ptvcursor_t, 1);
- ptvc->tree = tree;
- ptvc->tvb = tvb;
- ptvc->offset = offset;
- return ptvc;
-}
-
-
-/* Gets data from tvbuff, adds it to proto_tree, increments offset,
- * and returns proto_item* */
-proto_item*
-ptvcursor_add(ptvcursor_t *ptvc, int hf, gint length, gboolean endianness)
-{
- proto_item *item;
-
- item = ptvcursor_add_no_advance(ptvc, hf, length, endianness);
- ptvc->offset += proto_item_get_len(item);
- return item;
-}
-
-/* Gets data from tvbuff, adds it to proto_tree, *DOES NOT* increment
- * offset, and returns proto_item* */
-proto_item*
-ptvcursor_add_no_advance(ptvcursor_t* ptvc, int hf, gint length,
- gboolean endianness)
-{
- proto_item *item;
-
- item = proto_tree_add_item(ptvc->tree, hf, ptvc->tvb, ptvc->offset,
- length, endianness);
-
- return item;
-}
-
-/* Advance the ptvcursor's offset within its tvbuff without
- * adding anything to the proto_tree. */
-void
-ptvcursor_advance(ptvcursor_t* ptvc, gint length)
-{
- ptvc->offset += length;
-}
-
-/* Frees memory for ptvcursor_t, but nothing deeper than that. */
-void
-ptvcursor_free(ptvcursor_t *ptvc)
-{
- g_free(ptvc);
-}
-/* Returns tvbuff. */
-tvbuff_t*
-ptvcursor_tvbuff(ptvcursor_t* ptvc)
-{
- return ptvc->tvb;
-}
-
-/* Returns current offset. */
-gint
-ptvcursor_current_offset(ptvcursor_t* ptvc)
-{
- return ptvc->offset;
-}
-
-proto_tree*
-ptvcursor_tree(ptvcursor_t* ptvc)
-{
- return ptvc->tree;
-}
-
-void
-ptvcursor_set_tree(ptvcursor_t* ptvc, proto_tree *tree)
-{
- ptvc->tree = tree;
-}