r10093: Fix the HF_FIELD conformance file command
[Samba/aatanasov.git] / source4 / pidl / lib / Parse / Pidl / Ethereal / Conformance.pm
blobd0a304793910823a942a93314429ff4f4721eb78
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;
8 require Exporter;
10 @ISA = qw(Exporter);
11 @EXPORT_OK = qw(ReadConformance);
13 use strict;
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} = {
22 NAME => $name,
23 DISSECTOR_NAME => $dissectorname,
24 FT_TYPE => $ft_type,
25 BASE_TYPE => $base_type,
26 MASK => $mask,
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} = {
50 INDEX => $index,
51 NAME => $name,
52 FILTER => $filter,
53 FT_TYPE => $ft_type,
54 BASE_TYPE => $base_type,
55 VALSSTRING => $valsstring,
56 MASK => $mask,
57 BLURB => $blurb
61 sub handle_strip_prefix($$)
63 my ($data,$x) = @_;
65 push (@{$data->{strip_prefixes}}, $x);
68 sub handle_noemit($$)
70 my ($data) = shift;
71 my $type;
73 $type = shift if ($#_ == 1);
75 if (defined($type)) {
76 $data->{noemit}->{$type} = 1;
77 } else {
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;
100 sub handle_import
102 my $data = shift @_;
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($$)
122 my ($f,$data) = @_;
124 $data->{override} = "";
126 my $incodeblock = 0;
128 open(IN,"<$f") or return undef;
130 my $ln = 0;
132 foreach (<IN>) {
133 $ln++;
134 next if (/^#.*$/);
135 next if (/^$/);
137 s/[\r\n]//g;
139 if ($_ eq "CODE START") {
140 $incodeblock = 1;
141 next;
142 } elsif ($incodeblock and $_ eq "CODE END") {
143 $incodeblock = 0;
144 next;
145 } elsif ($incodeblock) {
146 $data->{override}.="$_\n";
147 next;
150 my @fields = split(/ /);
152 my $cmd = $fields[0];
154 shift @fields;
156 if (not defined($field_handlers{$cmd})) {
157 print "$f:$ln: Warning: Unknown command `$cmd'\n";
158 next;
161 $field_handlers{$cmd}($data, @fields);
164 close(IN);