From 95d60cc7ead74e8252fb7af6888659d4f922cf25 Mon Sep 17 00:00:00 2001 From: Luis Ontanon Date: Tue, 27 Sep 2005 22:57:07 +0000 Subject: in tvbparse: - tvbparse_some now handles 0 items. - added accessors for a tt's offset and remaining length. in packet-xml: - min_len=0 for tvbparse_chars() is soon going to mean zero instead of 1 change the 0s to 1s. - attribute names can have ':' even if it's namespaces isn't managed yet. - split the xml grammar in more elements so It can be actually read by a human being. svn path=/trunk/; revision=16031 --- epan/dissectors/packet-xml.c | 191 ++++++++++++++++++++++++------------------- epan/tvbparse.c | 16 +++- epan/tvbparse.h | 6 +- 3 files changed, 123 insertions(+), 90 deletions(-) diff --git a/epan/dissectors/packet-xml.c b/epan/dissectors/packet-xml.c index 55cbe4605d..bf73b9efdd 100644 --- a/epan/dissectors/packet-xml.c +++ b/epan/dissectors/packet-xml.c @@ -444,27 +444,32 @@ static void unrecognized_token(void* tvbparse_data, const void* wanted_data _U_, void init_xml_parser(void) { - tvbparse_wanted_t* want_name = tvbparse_chars(-1,0,0,"abcdefghijklmnopqrstuvwxyz-_ABCDEFGHIJKLMNOPQRSTUVWXYZ",NULL,NULL,NULL); + tvbparse_wanted_t* want_name = tvbparse_chars(-1,1,0,"abcdefghijklmnopqrstuvwxyz-_ABCDEFGHIJKLMNOPQRSTUVWXYZ",NULL,NULL,NULL); + tvbparse_wanted_t* want_attr_name = tvbparse_chars(-1,1,0,"abcdefghijklmnopqrstuvwxyz-_ABCDEFGHIJKLMNOPQRSTUVWXYZ:",NULL,NULL,NULL); + + tvbparse_wanted_t* want_scoped_name = tvbparse_set_seq(XML_SCOPED_NAME, NULL, NULL, NULL, + want_name, + tvbparse_char(-1,":",NULL,NULL,NULL), + want_name, + NULL); tvbparse_wanted_t* want_tag_name = tvbparse_set_oneof(0, NULL, NULL, NULL, - tvbparse_set_seq(XML_SCOPED_NAME, NULL, NULL, NULL, - want_name, - tvbparse_char(-1,":",NULL,NULL,NULL), - want_name, - NULL), + want_scoped_name, want_name, NULL); - + + tvbparse_wanted_t* want_attrib_value = tvbparse_set_oneof(0, NULL, NULL, get_attrib_value, + tvbparse_quoted(-1, NULL, NULL, tvbparse_shrink_token_cb,'\"','\\'), + tvbparse_quoted(-1, NULL, NULL, tvbparse_shrink_token_cb,'\'','\\'), + tvbparse_chars(-1,1,0,"0123456789",NULL,NULL,NULL), + want_name, + NULL); + tvbparse_wanted_t* want_attributes = tvbparse_one_or_more(-1, NULL, NULL, NULL, tvbparse_set_seq(-1, NULL, NULL, after_attrib, - tvbparse_chars(-1,0,0,"abcdefghijklmnopqrstuvwxyz-_ABCDEFGHIJKLMNOPQRSTUVWXYZ:",NULL,NULL,NULL), + want_attr_name, tvbparse_char(-1,"=",NULL,NULL,NULL), - tvbparse_set_oneof(0, NULL, NULL, get_attrib_value, - tvbparse_quoted(-1, NULL, NULL, tvbparse_shrink_token_cb,'\"','\\'), - tvbparse_quoted(-1, NULL, NULL, tvbparse_shrink_token_cb,'\'','\\'), - tvbparse_chars(-1,0,0,"0123456789",NULL,NULL,NULL), - want_name, - NULL), + want_attrib_value, NULL)); tvbparse_wanted_t* want_stoptag = tvbparse_set_oneof(-1,NULL,NULL,NULL, @@ -474,77 +479,93 @@ void init_xml_parser(void) { tvbparse_wanted_t* want_stopxmlpi = tvbparse_string(-1,"?>",NULL,NULL,after_xmlpi); - want_ignore = tvbparse_chars(-1,0,0," \t\r\n",NULL,NULL,NULL); + tvbparse_wanted_t* want_comment = tvbparse_set_seq(hf_comment,NULL,NULL,after_token, + tvbparse_string(-1,"",NULL,NULL,NULL), + TRUE), + NULL); + + tvbparse_wanted_t* want_xmlpi = tvbparse_set_seq(hf_xmlpi,NULL,before_xmpli,NULL, + tvbparse_string(-1,"", NULL, NULL, NULL), + NULL); + + tvbparse_wanted_t* want_doctype_start = tvbparse_set_seq(-1,NULL,before_dtd_doctype,NULL, + tvbparse_char(-1,"<",NULL,NULL,NULL), + tvbparse_char(-1,"!",NULL,NULL,NULL), + tvbparse_casestring(-1,"DOCTYPE",NULL,NULL,NULL), + tvbparse_set_oneof(-1,NULL,NULL,NULL, + tvbparse_set_seq(-1,NULL,NULL,NULL, + want_name, + tvbparse_char(-1,"[",NULL,NULL,NULL), + NULL), + tvbparse_set_seq(-1,NULL,NULL,pop_stack, + want_name, + tvbparse_set_oneof(-1,NULL,NULL,NULL, + tvbparse_casestring(-1,"PUBLIC",NULL,NULL,NULL), + tvbparse_casestring(-1,"SYSTEM",NULL,NULL,NULL), + NULL), + tvbparse_until(-1,NULL,NULL,NULL, + tvbparse_char(-1,">",NULL,NULL,NULL), + FALSE), + tvbparse_char(-1,">",NULL,NULL,NULL), + NULL), + NULL), + NULL); + + tvbparse_wanted_t* want_dtd_tag = tvbparse_set_seq(hf_dtd_tag,NULL,NULL,after_token, + tvbparse_char(-1,"<",NULL,NULL,NULL), + tvbparse_char(-1,"!",NULL,NULL,NULL), + tvbparse_until(-1,NULL,NULL,NULL, + tvbparse_char(-1, ">", NULL, NULL, NULL), + TRUE), + NULL); + + tvbparse_wanted_t* want_tag = tvbparse_set_seq(-1, NULL, before_tag, NULL, + tvbparse_char(-1,"<",NULL,NULL,NULL), + want_tag_name, + tvbparse_set_oneof(-1,NULL,NULL,NULL, + tvbparse_set_seq(-1,NULL,NULL,NULL, + want_attributes, + want_stoptag, + NULL), + want_stoptag, + NULL), + NULL); + + tvbparse_wanted_t* want_dtd_close = tvbparse_set_seq(-1,NULL,NULL,after_dtd_close, + tvbparse_char(-1,"]",NULL,NULL,NULL), + tvbparse_char(-1,">",NULL,NULL,NULL), + NULL); + + want_ignore = tvbparse_chars(-1,1,0," \t\r\n",NULL,NULL,NULL); + want = tvbparse_set_oneof(-1, NULL, NULL, NULL, - tvbparse_set_seq(hf_comment,NULL,NULL,after_token, - tvbparse_string(-1,"",NULL,NULL,NULL), - TRUE), - NULL), - tvbparse_set_seq(hf_xmlpi,NULL,before_xmpli,NULL, - tvbparse_string(-1,"", NULL, NULL, NULL), - NULL), - tvbparse_set_seq(-1,NULL,before_dtd_doctype,NULL, - tvbparse_char(-1,"<",NULL,NULL,NULL), - tvbparse_char(-1,"!",NULL,NULL,NULL), - tvbparse_casestring(-1,"DOCTYPE",NULL,NULL,NULL), - tvbparse_set_oneof(-1,NULL,NULL,NULL, - tvbparse_set_seq(-1,NULL,NULL,NULL, - want_name, - tvbparse_char(-1,"[",NULL,NULL,NULL), - NULL), - tvbparse_set_seq(-1,NULL,NULL,pop_stack, - want_name, - tvbparse_set_oneof(-1,NULL,NULL,NULL, - tvbparse_casestring(-1,"PUBLIC",NULL,NULL,NULL), - tvbparse_casestring(-1,"SYSTEM",NULL,NULL,NULL), - NULL), - tvbparse_until(-1,NULL,NULL,NULL, - tvbparse_char(-1,">",NULL,NULL,NULL), - TRUE), - NULL), - NULL), - NULL), - tvbparse_set_seq(-1,NULL,NULL,after_dtd_close, - tvbparse_char(-1,"]",NULL,NULL,NULL), - tvbparse_char(-1,">",NULL,NULL,NULL), - NULL), - tvbparse_set_seq(hf_dtd_tag,NULL,NULL,after_token, - tvbparse_char(-1,"<",NULL,NULL,NULL), - tvbparse_char(-1,"!",NULL,NULL,NULL), - tvbparse_until(-1,NULL,NULL,NULL, - tvbparse_char(-1, ">", NULL, NULL, NULL), - TRUE), - NULL), - tvbparse_set_seq(-1, NULL, before_tag, NULL, - tvbparse_char(-1,"<",NULL,NULL,NULL), - want_tag_name, - tvbparse_set_oneof(-1,NULL,NULL,NULL, - tvbparse_set_seq(-1,NULL,NULL,NULL, - want_attributes, - want_stoptag, - NULL), - want_stoptag, - NULL), - NULL), - tvbparse_not_chars(XML_CDATA,0,0,"<",NULL,NULL,after_token), - tvbparse_not_chars(-1,0,0," \t\r\n",NULL,NULL,unrecognized_token), + want_comment, + want_xmlpi, + want_closing_tag, + want_doctype_start, + want_dtd_close, + want_dtd_tag, + want_tag, + tvbparse_not_chars(XML_CDATA,1,0,"<",NULL,NULL,after_token), + tvbparse_not_chars(-1,1,0," \t\r\n",NULL,NULL,unrecognized_token), NULL); @@ -750,8 +771,8 @@ static xml_ns_t* make_xml_hier(gchar* elem_name, new = duplicate_element(orig); new->fqn = fqn; - add_xml_field(hfs, &(new->hf_tag), elem_name, fqn); - add_xml_field(hfs, &(new->hf_cdata), elem_name, fqn); + add_xml_field(hfs, &(new->hf_tag), g_strdup(elem_name), fqn); + add_xml_field(hfs, &(new->hf_cdata), g_strdup(elem_name), fqn); ett_p = &new->ett; g_array_append_val(etts,ett_p); diff --git a/epan/tvbparse.c b/epan/tvbparse.c index e10dad9e5b..94a23c2526 100644 --- a/epan/tvbparse.c +++ b/epan/tvbparse.c @@ -50,7 +50,8 @@ typedef enum _tvbparse_wanted_type_t { /* composed tokens */ TVBPARSE_WANTED_SET_ONEOF, /* one of the given types */ TVBPARSE_WANTED_SET_SEQ, /* an exact sequence of tokens of the given types */ - TVBPARSE_WANTED_CARDINALITY, /* one or more tokens of the given type */ + TVBPARSE_WANTED_CARDINALITY /* one or more tokens of the given type */ + } tvbparse_type_t; struct _tvbparse_t { @@ -284,7 +285,7 @@ tvbparse_wanted_t* tvbparse_some(int id, tvbparse_wanted_t* w = g_malloc(sizeof(tvbparse_wanted_t)); - g_assert(from > 0 && from < to); + g_assert(from <= to); w->id = id; w->type = TVBPARSE_WANTED_CARDINALITY; @@ -420,6 +421,13 @@ static tvbparse_elem_t* new_tok(tvbparse_t* tt, return tok; } +guint tvbparse_curr_offset(tvbparse_t* tt) { + return tt->offset; +} +guint tvbparse_len_left(tvbparse_t* tt) { + return tt->max_len; +} + tvbparse_elem_t* tvbparse_get(tvbparse_t* tt, const tvbparse_wanted_t* wanted) { tvbparse_elem_t* tok = NULL; @@ -629,6 +637,10 @@ tvbparse_elem_t* tvbparse_get(tvbparse_t* tt, guint got_so_far = 0; tvbparse_wanted_t* w = g_ptr_array_index(wanted->elems,0); + if ( wanted->min == 0 ) { + new_tok(tt,wanted->id,tt->offset,0,wanted); + } + while (got_so_far < wanted->max) { tvbparse_elem_t* new = tvbparse_get(tt, w); diff --git a/epan/tvbparse.h b/epan/tvbparse.h index b2e982f17b..78a300740d 100644 --- a/epan/tvbparse.h +++ b/epan/tvbparse.h @@ -294,9 +294,6 @@ void tvbparse_shrink_token_cb(void* tvbparse_data, - - - /* initialize the parser (at every packet) * tvb: what are we parsing? * offset: from where @@ -313,6 +310,9 @@ tvbparse_t* tvbparse_init(tvbuff_t* tvb, /* reset the parser */ gboolean tvbparse_reset(tvbparse_t* tt, int offset, int len); +guint tvbparse_curr_offset(tvbparse_t* tt); +guint tvbparse_len_left(tvbparse_t* tt); + /* * This ill look for the wanted token at the current offset or after any given * number of ignored tokens returning NULL if there's no match. -- cgit v1.2.3