r9094: More ethereal parser updates, only header fields left to fix + actual data...
[ira/wip.git] / source4 / build / pidl / Parse / Pidl / Ethereal / Conformance.pm
1 ###################################################
2 # parse an ethereal conformance file
3 # Copyright jelmer@samba.org 2005
4 # released under the GNU GPL
5
6 package Parse::Pidl::Ethereal::Conformance;
7
8 require Exporter;
9
10 @ISA = qw(Exporter);
11 @EXPORT_OK = qw(EmitProhibited FindDissectorParam %hf_renames);
12
13 use strict;
14
15 use Parse::Pidl::Util qw(has_property);
16
17 sub handle_union_tag_size($$)
18 {
19         #FIXME  
20 }
21
22 sub handle_type($$$$$$$)
23 {
24         my ($name,$dissectorname,$ft_type,$base_type,$mask,$valsstring,$alignment) = @_;
25         #FIXME
26 }
27
28 use vars qw(%hf_renames);
29
30 sub handle_hf_rename($$)
31 {
32         my ($old,$new) = @_;
33         $hf_renames{$old} = $new;
34 }
35
36 my %dissectorparams = ();
37
38 sub handle_param_value($$)
39 {
40         my ($dissector_name,$value) = @_;
41
42         $dissectorparams{$dissector_name} = $value;
43
44 }
45
46 sub handle_hf_field($$$$$$$$)
47 {
48         my ($hf,$title,$filter,$ft_type,$base_type,$valsstring,$mask,$blub) = @_;
49
50 }
51
52 sub handle_strip_prefix($)
53 {
54         #FIXME
55 }
56
57 my @noemit = ();
58
59 sub handle_noemit($)
60 {
61         my $type = shift;
62
63         push (@noemit, $type);
64 }
65
66 my %field_handlers = (
67         UNION_TAG_SIZE => \&handle_union_tag_size,
68         TYPE => \&handle_type,
69         NOEMIT => \&handle_noemit, 
70         PARAM_VALUE => \&handle_param_value, 
71         HF_FIELD => \&handle_hf_field, 
72         HF_RENAME => \&handle_hf_rename, 
73         STRIP_PREFIX => \&handle_strip_prefix
74 );
75
76 sub Parse($)
77 {
78         my $f = shift;
79
80         open(IN,$f) or return undef;
81
82         foreach (<IN>) {
83                 next if (/^#.*$/);
84                 next if (/^$/);
85
86                 my @fields = split(/ /);
87                 
88                 $field_handlers{$fields[0]}(@fields);
89         }
90
91         close(IN);
92 }
93
94 sub EmitProhibited($)
95 {
96         my $type = shift;
97
98         return 1 if (grep(/$type/,@noemit));
99
100         return 0;
101 }
102
103 sub FindDissectorParam($)
104 {
105         my $type = shift;
106
107         return $dissectorparams{$type} if defined ($dissectorparams{$type});
108
109         return 0;
110 }
111
112 1;