1 ###################################################
2 # parse an ethereal conformance file
3 # Copyright jelmer@samba.org 2005
4 # released under the GNU GPL
6 package Parse::Pidl::Ethereal::Conformance;
11 @EXPORT_OK = qw(ReadConformance);
15 use Parse::Pidl::Util qw(has_property);
17 sub handle_type($$$$$$$$)
19 my ($data,$name,$dissectorname,$ft_type,$base_type,$mask,$valsstring,$alignment) = @_;
21 $data->{types}->{$name} = {
23 DISSECTOR_NAME => $dissectorname,
25 BASE_TYPE => $base_type,
27 VALSSTRING => $valsstring,
28 ALIGNMENT => $alignment
32 sub handle_hf_rename($$$)
34 my ($data,$old,$new) = @_;
35 $data->{hf_renames}{$old} = $new;
38 sub handle_param_value($$$)
40 my ($data,$dissector_name,$value) = @_;
42 $data->{dissectorparams}->{$dissector_name} = $value;
45 sub handle_hf_field($$$$$$$$$)
47 my ($data,$index,$name,$filter,$ft_type,$base_type,$valsstring,$mask,$blurb) = @_;
49 $data->{header_fields}->{$index} = {
54 BASE_TYPE => $base_type,
55 VALSSTRING => $valsstring,
61 sub handle_strip_prefix($$)
65 push (@{$data->{strip_prefixes}}, $x);
73 $type = shift if ($#_ == 1);
76 $data->{noemit}->{$type} = 1;
78 $data->{noemit_dissector} = 1;
82 sub handle_protocol($$$$$)
84 my ($data, $name, $longname, $shortname, $filtername) = @_;
86 $data->{protocols}->{$name} = {
87 LONGNAME => $longname,
88 SHORTNAME => $shortname,
89 FILTERNAME => $filtername
93 sub handle_fielddescription($$$)
95 my ($data,$field,$desc) = @_;
97 $data->{fielddescription}->{$field} = $desc;
103 my $dissectorname = shift @_;
105 $data->{imports}->{$dissectorname} = join(' ', @_);
108 my %field_handlers = (
109 TYPE => \&handle_type,
110 NOEMIT => \&handle_noemit,
111 PARAM_VALUE => \&handle_param_value,
112 HF_FIELD => \&handle_hf_field,
113 HF_RENAME => \&handle_hf_rename,
114 STRIP_PREFIX => \&handle_strip_prefix,
115 PROTOCOL => \&handle_protocol,
116 FIELD_DESCRIPTION => \&handle_fielddescription,
117 IMPORT => \&handle_import
120 sub ReadConformance($$)
124 $data->{override} = "";
128 open(IN,"<$f") or return undef;
139 if ($_ eq "CODE START") {
142 } elsif ($incodeblock and $_ eq "CODE END") {
145 } elsif ($incodeblock) {
146 $data->{override}.="$_\n";
150 my @fields = split(/ /);
152 my $cmd = $fields[0];
156 if (not defined($field_handlers{$cmd})) {
157 print "$f:$ln: Warning: Unknown command `$cmd'\n";
161 $field_handlers{$cmd}($data, @fields);