summaryrefslogtreecommitdiff
path: root/epan
diff options
context:
space:
mode:
authorLuis Ontanon <luis.ontanon@gmail.com>2005-09-27 22:57:07 +0000
committerLuis Ontanon <luis.ontanon@gmail.com>2005-09-27 22:57:07 +0000
commit95d60cc7ead74e8252fb7af6888659d4f922cf25 (patch)
tree33e7065921742050155007675dedfc37be93a8be /epan
parentec0f669770875b390d3645a0e5e314517768664a (diff)
downloadwireshark-95d60cc7ead74e8252fb7af6888659d4f922cf25.tar.gz
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
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-xml.c191
-rw-r--r--epan/tvbparse.c16
-rw-r--r--epan/tvbparse.h6
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),
+ tvbparse_until(-1,NULL,NULL,NULL,
+ 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),
+ want_name,
+ tvbparse_set_oneof(-1,NULL,NULL,NULL,
+ want_stopxmlpi,
+ tvbparse_set_seq(-1,NULL,NULL,NULL,
+ want_attributes,
+ want_stopxmlpi,
+ NULL),
+ NULL),
+ NULL);
+
+ tvbparse_wanted_t* want_closing_tag = tvbparse_set_seq(0,NULL,NULL,after_untag,
+ tvbparse_char(-1, "<", NULL, NULL, NULL),
+ tvbparse_char(-1, "/", NULL, NULL, NULL),
+ want_tag_name,
+ tvbparse_char(-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),
- tvbparse_until(-1,NULL,NULL,NULL,
- tvbparse_string(-1,"-->",NULL,NULL,NULL),
- TRUE),
- NULL),
- tvbparse_set_seq(hf_xmlpi,NULL,before_xmpli,NULL,
- tvbparse_string(-1,"<?",NULL,NULL,NULL),
- want_name,
- tvbparse_set_oneof(-1,NULL,NULL,NULL,
- want_stopxmlpi,
- tvbparse_set_seq(-1,NULL,NULL,NULL,
- want_attributes,
- want_stopxmlpi,
- NULL),
- NULL),
- NULL),
- tvbparse_set_seq(0,NULL,NULL,after_untag,
- tvbparse_char(-1, "<", NULL, NULL, NULL),
- tvbparse_char(-1, "/", NULL, NULL, NULL),
- want_tag_name,
- tvbparse_char(-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.