diff options
author | Luis Ontanon <luis.ontanon@gmail.com> | 2005-09-28 01:06:39 +0000 |
---|---|---|
committer | Luis Ontanon <luis.ontanon@gmail.com> | 2005-09-28 01:06:39 +0000 |
commit | 217b73a0b1b8d9ccd7efce1dae9a7cd1be8cc990 (patch) | |
tree | 129d91e2e37f80e6d183296713d1a202a252b21c /tools/tpg | |
parent | 95d60cc7ead74e8252fb7af6888659d4f922cf25 (diff) | |
download | wireshark-217b73a0b1b8d9ccd7efce1dae9a7cd1be8cc990.tar.gz |
update tpg
tvbparse:
- for tvbparse_until spend the target token even if it isn't included
svn path=/trunk/; revision=16032
Diffstat (limited to 'tools/tpg')
-rw-r--r-- | tools/tpg/tpg.pl | 29 | ||||
-rw-r--r-- | tools/tpg/tpg.yp | 30 |
2 files changed, 25 insertions, 34 deletions
diff --git a/tools/tpg/tpg.pl b/tools/tpg/tpg.pl index 6c56815076..77cdf45ded 100644 --- a/tools/tpg/tpg.pl +++ b/tools/tpg/tpg.pl @@ -302,7 +302,7 @@ sub make_rule { if (length $tree_code_body ) { my $cb_name = ${$r}{before_cb_name} = "${$r}{name}\_before_cb"; - ${$r}{before_cb_code} = "static void $cb_name(void* tpg _U_, const void* wd _U_, struct _tvbparse_elem_t* elem _U_) {\n$tree_code_head\n$tree_code_body\n}"; + ${$r}{before_cb_code} = "static void $cb_name(void* tpg _U_, const void* wd _U_, struct _tvbparse_elem_t* elem _U_) {\n\tproto_item* pi;\n$tree_code_head\n$tree_code_body\n}"; ${$r}{code} .= $tree_code_after; } @@ -394,7 +394,7 @@ sub make_rule { } elsif (${$r}{type} eq 'until') { ${$code} .= $indent ."tvbparse_until(0,$wd_data,$before_fn,$after_fn,\n"; $dd++; - ${$code} .= $indent_more . make_rule(${$r}{subrule},$dd) . ", TRUE)"; + ${$code} .= $indent_more . make_rule(${$r}{subrule},$dd) . ", FALSE)"; $dd--; } @@ -416,7 +416,7 @@ sub make_vars { my $v = shift; my $r = shift; my $base = shift; - + if (exists ${$r}{var}) { ${$v}{${$r}{var}} = $base; } @@ -454,7 +454,7 @@ sub make_tree_code { if (exists ${$r}{tree}) { $root_var = "root_$fieldname"; - ${$head} .= "\tproto_item* $root_var;\n"; + ${$head} .= "\tproto_item* $root_var;\n\n"; ${$body} .= "\t$root_var = "; $ett_arr .= "\t&$proto_name\_hfis.ett_$fieldname,\\\n"; $ett_decl .= "\tguint ett_$fieldname; \n"; @@ -463,27 +463,32 @@ sub make_tree_code { } else { ${$body} .= "\t"; } + if (${$f}{type} eq 'FT_STRING') { - ${$body} .= "TPG_ADD_STRING(tpg,${$f}{vname},$elem);\n"; + ${$body} .= "\tpi = TPG_ADD_STRING(tpg,${$f}{vname},$elem);\n"; } elsif (${$f}{type} =~ /^FT_UINT/) { my $fieldvar = "tpg_uint_$fieldname"; ${$head} .= "\tguint $fieldvar = TPG_UINT($elem);\n"; - ${$body} .= "TPG_ADD_UINT(tpg,${$f}{vname},$elem,$fieldvar);\n"; + ${$body} .= "\tpi = TPG_ADD_UINT(tpg,${$f}{vname},$elem,$fieldvar);\n"; } elsif (${$f}{type} =~ /^FT_INT/) { my $fieldvar = "tpg_int_$fieldname"; ${$head} .= "\tgint $fieldvar = TPG_INT($elem);\n"; - ${$body} .= "TPG_ADD_INT(tpg,${$f}{vname},$elem,$fieldvar);\n"; + ${$body} .= "\tpi = TPG_ADD_INT(tpg,${$f}{vname},$elem,$fieldvar);\n"; } elsif (${$f}{type} eq 'FT_IPV4') { my $fieldvar = "tpg_ipv4_$fieldname"; ${$head} .= "\tguint32 $fieldvar = TPG_IPV4($elem);\n"; - ${$body} .= "TPG_ADD_IPV4(tpg,${$f}{vname},$elem,$fieldvar);\n"; + ${$body} .= "\tpi = TPG_ADD_IPV4(tpg,${$f}{vname},$elem,$fieldvar);\n"; } elsif (${$f}{type} eq 'FT_IPV6') { my $fieldvar = "tpg_ipv6_$fieldname"; ${$head} .= "\tguint8* $fieldvar = TPG_IPV6($elem);\n"; - ${$body} .= "TPG_ADD_IPV6(tpg,${$f}{vname},$elem,$fieldvar);\n"; + ${$body} .= "\tpi = TPG_ADD_IPV6(tpg,${$f}{vname},$elem,$fieldvar);\n"; } else { - ${$body} .= "TPG_ADD_TEXT(tpg,$elem);\n"; + ${$body} .= "\tpi = TPG_ADD_TEXT(tpg,$elem);\n"; + } + + if (exists ${$r}{plain_text}) { + ${$body} .= "\tTPG_SET_TEXT(pi,$elem);\n" } if (exists ${$r}{tree}) { @@ -525,10 +530,10 @@ sub tokenizer { [ '([A-Z][A-Z0-9_]*)', sub { [ 'UPPERCASE', $_[0] ] }], [ '([0-9]+|0x[0-9a-fA-F]+)', sub { [ 'NUMBER', $_[0] ] }], [ '(\%\%[0-9]+\%\%)', \&c_code ], - [ "('(\\\\'|[^'])*')", sub { [ 'SQUOTED', $_[0] ] }], + [ "'((\\\\'|[^'])*)'", sub { [ 'SQUOTED', $_[0] ] }], [ '\[\^((\\\\\\]|[^\\]])*)\]', sub { [ 'NOTCHARS', $_[0] ] }], [ '\[((\\\\\\]|[^\\]])*)\]', sub { [ 'CHARS', $_[0] ] }], - [ '("(\\\\"|[^"])*")', sub { [ 'DQUOTED', $_[0] ] }], + [ '"((\\\\"|[^"])*)"', sub { [ 'DQUOTED', $_[0] ] }], [ '(\%[a-z_]+|\%[A-Z][A-Z-]*|\=|\.\.\.|\.|\:|\;|\(|\)|\{|\}|\+|\*|\?|\<|\>|\|)', sub { [ $_[0], $_[0] ] }], ] } diff --git a/tools/tpg/tpg.yp b/tools/tpg/tpg.yp index 81bcb4137b..d9282e9208 100644 --- a/tools/tpg/tpg.yp +++ b/tools/tpg/tpg.yp @@ -53,6 +53,7 @@ sub from_to { sub chars_control { $_ = $_[0]; s/([a-zA-Z0-9])-([a-zA-Z0-9])/from_to($1,$2)/ge; + s/"/\\"/g; "\"$_\""; } @@ -71,24 +72,9 @@ statement: rule_statement { my $rulename = ${$_[1]}{name}; - if (exists ${${$parser_info}{rules}}{$rulename}) { - - my $rule = ${${$parser_info}{rules}}{$rulename}; - if (exists ${${$parser_info}{rules}}{root}) { - # a root rule exists already add this to its subrules - push @{${${$parser_info}{rules}}{subrules}}, $_[1]; - } else { - # this rule becomes the first subrule of a choice - ${${$parser_info}{rules}}{$rulename} = { - root=>'', - type=>'choice', - subrules=>[$rule,\$_[1]], - name=>${$_[1]}{name}, - } - } - } else { - ${${$parser_info}{rules}}{$rulename} = $_[1]; - } + abort($_[0],"%rule $rulename already defined") if exists ${${$parser_info}{rules}}{$rulename}; + + ${${$parser_info}{rules}}{$rulename} = $_[1]; } | parser_name_statement { abort($_[0],"%parser_name already defined") if exists ${$parser_info}{name}; @@ -184,7 +170,7 @@ base_rule: | until_rule | CHARS {{control=>chars_control($_[1]),type=>'chars'}} | NOTCHARS {{control=>chars_control($_[1]),type=>'not_chars'}} - | DQUOTED {{control=>"$_[1]",type=>'string'}} + | DQUOTED {{control=>"\"$_[1]\"",type=>'string'}} | SQUOTED {{control=>"\"$_[1]\"",type=>'caseless'}} | LOWERCASE {{control=>$_[1],type=>'named'}} ; @@ -277,7 +263,7 @@ value_string_items: ; value_string_item: - NUMBER QUOTED { [ $_[1], "\"$_[2]\"" ] } + NUMBER DQUOTED { [ $_[1], "\"$_[2]\"" ] } ; static_field_statement: @@ -290,7 +276,7 @@ static_field_statement: field_name: #empty {undef} - | DQUOTED + | DQUOTED { "\"$_[1]\""} ; field_type: @@ -310,7 +296,7 @@ field_value_string: field_description: #empty {'""'} - | SQUOTED + | SQUOTED { "\"$_[1]\""} ; quoted: DQUOTED | SQUOTED ; |