diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2005-08-06 01:54:55 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:31:25 -0500 |
commit | 97eac1a46a38eb5ae9e9d15caa96d1c3e1fb57dd (patch) | |
tree | 500289ea6166dcbc031eb98db6aafcd841d12d70 /source4/build/pidl/Parse/Pidl/Ethereal/Conformance.pm | |
parent | 8658136f26488d9e9838afc5f2424b9721bc50db (diff) | |
download | samba-97eac1a46a38eb5ae9e9d15caa96d1c3e1fb57dd.tar.gz samba-97eac1a46a38eb5ae9e9d15caa96d1c3e1fb57dd.tar.bz2 samba-97eac1a46a38eb5ae9e9d15caa96d1c3e1fb57dd.zip |
r9161: More etheral parser generator fixes
(This used to be commit b323e83e8df6ba331b3f0b3abe28aa8ddf9127ef)
Diffstat (limited to 'source4/build/pidl/Parse/Pidl/Ethereal/Conformance.pm')
-rw-r--r-- | source4/build/pidl/Parse/Pidl/Ethereal/Conformance.pm | 120 |
1 files changed, 58 insertions, 62 deletions
diff --git a/source4/build/pidl/Parse/Pidl/Ethereal/Conformance.pm b/source4/build/pidl/Parse/Pidl/Ethereal/Conformance.pm index 910b604158..19c8ff2563 100644 --- a/source4/build/pidl/Parse/Pidl/Ethereal/Conformance.pm +++ b/source4/build/pidl/Parse/Pidl/Ethereal/Conformance.pm @@ -8,26 +8,17 @@ package Parse::Pidl::Ethereal::Conformance; require Exporter; @ISA = qw(Exporter); -@EXPORT_OK = qw(EmitProhibited FindDissectorParam %hf_renames %protocols); +@EXPORT_OK = qw(ReadConformance); use strict; use Parse::Pidl::Util qw(has_property); -sub handle_union_tag_size($$) +sub handle_type($$$$$$$$) { - my ($union,$size) = @_; + my ($data,$name,$dissectorname,$ft_type,$base_type,$mask,$valsstring,$alignment) = @_; - #FIXME -} - -use vars qw(%hf_renames %types %header_fields %protocols); - -sub handle_type($$$$$$$) -{ - my ($name,$dissectorname,$ft_type,$base_type,$mask,$valsstring,$alignment) = @_; - - $types{$name} = { + $data->{types}->{$name} = { NAME => $name, DISSECTOR_NAME => $dissectorname, FT_TYPE => $ft_type, @@ -39,27 +30,24 @@ sub handle_type($$$$$$$) } -sub handle_hf_rename($$) +sub handle_hf_rename($$$) { - my ($old,$new) = @_; - $hf_renames{$old} = $new; + my ($data,$old,$new) = @_; + $data->{hf_renames}{$old} = $new; } -my %dissectorparams = (); - -sub handle_param_value($$) +sub handle_param_value($$$) { - my ($dissector_name,$value) = @_; - - $dissectorparams{$dissector_name} = $value; + my ($data,$dissector_name,$value) = @_; + $data->{dissectorparams}->{$dissector_name} = $value; } -sub handle_hf_field($$$$$$$$) +sub handle_hf_field($$$$$$$$$) { - my ($hf,$title,$filter,$ft_type,$base_type,$valsstring,$mask,$blurb) = @_; + my ($data,$hf,$title,$filter,$ft_type,$base_type,$valsstring,$mask,$blurb) = @_; - $header_fields{$hf} = { + $data->{header_fields}->{$hf} = { HF => $hf, TITLE => $title, FILTER => $filter, @@ -71,42 +59,39 @@ sub handle_hf_field($$$$$$$$) }; } -sub handle_strip_prefix($) +sub handle_strip_prefix($$) { - my $x = shift; - #FIXME -} + my ($data,$x) = @_; -my @noemit = (); + push (@{$data->{strip_prefixes}}, $x); +} -sub handle_noemit($) +sub handle_noemit($$) { - my $type = shift; + my ($data,$type) = @_; - push (@noemit, $type); + $data->{noemit}->{$type} = 1; } - -sub handle_protocol($$$$) +sub handle_protocol($$$$$) { - my ($name, $longname, $shortname, $filtername) = @_; + my ($data, $name, $longname, $shortname, $filtername) = @_; - $protocols{$name} = { + $data->{protocols}->{$name} = { LONGNAME => $longname, SHORTNAME => $shortname, FILTERNAME => $filtername }; } -sub handle_fielddescription($$) +sub handle_fielddescription($$$) { - my ($field,$desc) = @_; + my ($data,$field,$desc) = @_; - #FIXME + $data->{fielddescription}->{$field} = $desc; } my %field_handlers = ( - UNION_TAG_SIZE => \&handle_union_tag_size, TYPE => \&handle_type, NOEMIT => \&handle_noemit, PARAM_VALUE => \&handle_param_value, @@ -117,40 +102,51 @@ my %field_handlers = ( FIELD_DESCRIPTION => \&handle_fielddescription ); -sub Parse($) +sub ReadConformance($$) { - my $f = shift; + my ($f,$data) = @_; + + $data->{override} = ""; + + my $incodeblock = 0; + + open(IN,"<$f") or return undef; - open(IN,$f) or return undef; + my $ln = 0; foreach (<IN>) { + $ln++; next if (/^#.*$/); next if (/^$/); - my @fields = split(/ /); - - $field_handlers{$fields[0]}(@fields); - } + s/[\r\n]//g; - close(IN); -} - -sub EmitProhibited($) -{ - my $type = shift; + if ($_ eq "CODE START") { + $incodeblock = 1; + next; + } elsif ($incodeblock and $_ eq "CODE END") { + $incodeblock = 0; + next; + } elsif ($incodeblock) { + $data->{override}.="$_\n"; + next; + } - return 1 if (grep(/$type/,@noemit)); + my @fields = split(/ /); - return 0; -} + my $cmd = $fields[0]; -sub FindDissectorParam($) -{ - my $type = shift; + shift @fields; - return $dissectorparams{$type} if defined ($dissectorparams{$type}); + if (not defined($field_handlers{$cmd})) { + print "$f:$ln: Warning: Unknown command `$cmd'\n"; + next; + } + + $field_handlers{$cmd}($data, @fields); + } - return 0; + close(IN); } 1; |