diff options
-rw-r--r-- | epan/tvbparse.c | 32 | ||||
-rw-r--r-- | epan/tvbparse.h | 3 |
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 |