aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/tvbparse.c32
-rw-r--r--epan/tvbparse.h3
2 files changed, 35 insertions, 0 deletions
diff --git a/epan/tvbparse.c b/epan/tvbparse.c
index 3c90230f09..cf2148813e 100644
--- a/epan/tvbparse.c
+++ b/epan/tvbparse.c
@@ -804,3 +804,35 @@ tvbparse_elem_t* tvbparse_find(tvbparse_t* tt, const tvbparse_wanted_t* wanted)
return NULL;
}
+
+static void tvbparse_tree_add_elem(proto_tree* tree, tvbparse_elem_t* curr) {
+ GPtrArray* stack = g_ptr_array_new();
+ struct _elem_tree_stack_frame* frame = ep_alloc(sizeof(struct _elem_tree_stack_frame));
+ proto_item* pi;
+ frame->tree = tree;
+ frame->elem = curr;
+
+ while (curr) {
+ pi = proto_tree_add_text(frame->tree,curr->tvb,curr->offset,curr->len,"%s",tvb_format_text(curr->tvb,curr->offset,curr->len));
+
+ if(curr->sub) {
+ frame->elem = curr;
+ g_ptr_array_add(stack,frame);
+ frame = ep_alloc(sizeof(struct _elem_tree_stack_frame));
+ frame->tree = proto_item_add_subtree(pi,0);
+ curr = curr->sub;
+ continue;
+ }
+
+ curr = curr->next;
+
+ while( !curr && stack->len ) {
+ frame = g_ptr_array_remove_index_fast(stack,stack->len - 1);
+ curr = frame->elem->next;
+ }
+
+ }
+
+ g_ptr_array_free(stack,TRUE);
+}
+
diff --git a/epan/tvbparse.h b/epan/tvbparse.h
index 536f31e25c..ac67f7ddb7 100644
--- a/epan/tvbparse.h
+++ b/epan/tvbparse.h
@@ -348,4 +348,7 @@ tvbparse_elem_t* tvbparse_get(tvbparse_t* tt,
tvbparse_elem_t* tvbparse_find(tvbparse_t* tt,
const tvbparse_wanted_t* wanted);
+
+void tvbparse_tree_add_elem(proto_tree* tree, tvbparse_elem_t* curr);
+
#endif