diff options
Diffstat (limited to 'source4/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm')
-rw-r--r-- | source4/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm | 439 |
1 files changed, 0 insertions, 439 deletions
diff --git a/source4/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm b/source4/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm deleted file mode 100644 index 5c37b4a0c4..0000000000 --- a/source4/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm +++ /dev/null @@ -1,439 +0,0 @@ -################################################### -# parse an Wireshark conformance file -# Copyright jelmer@samba.org 2005 -# released under the GNU GPL - -=pod - -=head1 NAME - -Parse::Pidl::Wireshark::Conformance - Conformance file parser for Wireshark - -=head1 DESCRIPTION - -This module supports parsing Wireshark conformance files (*.cnf). - -=head1 FILE FORMAT - -Pidl needs additional data for Wireshark output. This data is read from -so-called conformance files. This section describes the format of these -files. - -Conformance files are simple text files with a single command on each line. -Empty lines and lines starting with a '#' character are ignored. -Arguments to commands are seperated by spaces. - -The following commands are currently supported: - -=over 4 - -=item I<TYPE> name dissector ft_type base_type mask valsstring alignment - -Register new data type with specified name, what dissector function to call -and what properties to give header fields for elements of this type. - -=item I<NOEMIT> type - -Suppress emitting a dissect_type function for the specified type - -=item I<PARAM_VALUE> type param - -Set parameter to specify to dissector function for given type. - -=item I<HF_FIELD> hf title filter ft_type base_type valsstring mask description - -Generate a custom header field with specified properties. - -=item I<HF_RENAME> old_hf_name new_hf_name - -Force the use of new_hf_name when the parser generator was going to -use old_hf_name. - -This can be used in conjunction with HF_FIELD in order to make more than -one element use the same filter name. - -=item I<ETT_FIELD> ett - -Register a custom ett field - -=item I<STRIP_PREFIX> prefix - -Remove the specified prefix from all function names (if present). - -=item I<PROTOCOL> longname shortname filtername - -Change the short-, long- and filter-name for the current interface in -Wireshark. - -=item I<FIELD_DESCRIPTION> field desc - -Change description for the specified header field. `field' is the hf name of the field. - -=item I<IMPORT> dissector code... - -Code to insert when generating the specified dissector. @HF@ and -@PARAM@ will be substituted. - -=item I<INCLUDE> filename - -Include conformance data from the specified filename in the dissector. - -=item I<TFS> hf_name "true string" "false string" - -Override the text shown when a bitmap boolean value is enabled or disabled. - -=item I<MANUAL> fn_name - -Force pidl to not generate a particular function but allow the user -to write a function manually. This can be used to remove the function -for only one level for a particular element rather than all the functions and -ett/hf variables for a particular element as the NOEMIT command does. - -=back - -=head1 EXAMPLE - - INFO_KEY OpenKey.Ke - -=cut - -package Parse::Pidl::Wireshark::Conformance; - -require Exporter; -use vars qw($VERSION); -$VERSION = '0.01'; - -@ISA = qw(Exporter); -@EXPORT_OK = qw(ReadConformance ReadConformanceFH valid_ft_type valid_base_type); - -use strict; - -use Parse::Pidl qw(fatal warning error); -use Parse::Pidl::Util qw(has_property); - -sub handle_type($$$$$$$$$$) -{ - my ($pos,$data,$name,$dissectorname,$ft_type,$base_type,$mask,$valsstring,$alignment) = @_; - - unless(defined($alignment)) { - error($pos, "incomplete TYPE command"); - return; - } - - unless ($dissectorname =~ /.*dissect_.*/) { - warning($pos, "dissector name does not contain `dissect'"); - } - - unless(valid_ft_type($ft_type)) { - warning($pos, "invalid FT_TYPE `$ft_type'"); - } - - unless (valid_base_type($base_type)) { - warning($pos, "invalid BASE_TYPE `$base_type'"); - } - - $dissectorname =~ s/^\"(.*)\"$/$1/g; - - if (not ($dissectorname =~ /;$/)) { - warning($pos, "missing semicolon"); - } - - $data->{types}->{$name} = { - NAME => $name, - POS => $pos, - USED => 0, - DISSECTOR_NAME => $dissectorname, - FT_TYPE => $ft_type, - BASE_TYPE => $base_type, - MASK => $mask, - VALSSTRING => $valsstring, - ALIGNMENT => $alignment - }; -} - -sub handle_tfs($$$$$) -{ - my ($pos,$data,$hf,$trues,$falses) = @_; - - unless(defined($falses)) { - error($pos, "incomplete TFS command"); - return; - } - - $data->{tfs}->{$hf} = { - TRUE_STRING => $trues, - FALSE_STRING => $falses - }; -} - -sub handle_hf_rename($$$$) -{ - my ($pos,$data,$old,$new) = @_; - - unless(defined($new)) { - warning($pos, "incomplete HF_RENAME command"); - return; - } - - $data->{hf_renames}->{$old} = { - OLDNAME => $old, - NEWNAME => $new, - POS => $pos, - USED => 0 - }; -} - -sub handle_param_value($$$$) -{ - my ($pos,$data,$dissector_name,$value) = @_; - - unless(defined($value)) { - error($pos, "incomplete PARAM_VALUE command"); - return; - } - - $data->{dissectorparams}->{$dissector_name} = { - DISSECTOR => $dissector_name, - PARAM => $value, - POS => $pos, - USED => 0 - }; -} - -sub valid_base_type($) -{ - my $t = shift; - return 0 unless($t =~ /^BASE_.*/); - return 1; -} - -sub valid_ft_type($) -{ - my $t = shift; - return 0 unless($t =~ /^FT_.*/); - return 1; -} - -sub handle_hf_field($$$$$$$$$$) -{ - my ($pos,$data,$index,$name,$filter,$ft_type,$base_type,$valsstring,$mask,$blurb) = @_; - - unless(defined($blurb)) { - error($pos, "incomplete HF_FIELD command"); - return; - } - - unless(valid_ft_type($ft_type)) { - warning($pos, "invalid FT_TYPE `$ft_type'"); - } - - unless(valid_base_type($base_type)) { - warning($pos, "invalid BASE_TYPE `$base_type'"); - } - - $data->{header_fields}->{$index} = { - INDEX => $index, - POS => $pos, - USED => 0, - NAME => $name, - FILTER => $filter, - FT_TYPE => $ft_type, - BASE_TYPE => $base_type, - VALSSTRING => $valsstring, - MASK => $mask, - BLURB => $blurb - }; -} - -sub handle_strip_prefix($$$) -{ - my ($pos,$data,$x) = @_; - - push (@{$data->{strip_prefixes}}, $x); -} - -sub handle_noemit($$$) -{ - my ($pos,$data,$type) = @_; - - if (defined($type)) { - $data->{noemit}->{$type} = 1; - } else { - $data->{noemit_dissector} = 1; - } -} - -sub handle_manual($$$) -{ - my ($pos,$data,$fn) = @_; - - unless(defined($fn)) { - warning($pos, "incomplete MANUAL command"); - return; - } - - $data->{manual}->{$fn} = 1; -} - -sub handle_protocol($$$$$$) -{ - my ($pos, $data, $name, $longname, $shortname, $filtername) = @_; - - $data->{protocols}->{$name} = { - LONGNAME => $longname, - SHORTNAME => $shortname, - FILTERNAME => $filtername - }; -} - -sub handle_fielddescription($$$$) -{ - my ($pos,$data,$field,$desc) = @_; - - unless(defined($desc)) { - warning($pos, "incomplete FIELD_DESCRIPTION command"); - return; - } - - $data->{fielddescription}->{$field} = { - DESCRIPTION => $desc, - POS => $pos, - USED => 0 - }; -} - -sub handle_import -{ - my $pos = shift @_; - my $data = shift @_; - my $dissectorname = shift @_; - - unless(defined($dissectorname)) { - error($pos, "no dissectorname specified"); - return; - } - - $data->{imports}->{$dissectorname} = { - NAME => $dissectorname, - DATA => join(' ', @_), - USED => 0, - POS => $pos - }; -} - -sub handle_ett_field -{ - my $pos = shift @_; - my $data = shift @_; - my $ett = shift @_; - - unless(defined($ett)) { - error($pos, "incomplete ETT_FIELD command"); - return; - } - - push (@{$data->{ett}}, $ett); -} - -sub handle_include -{ - my $pos = shift @_; - my $data = shift @_; - my $fn = shift @_; - - unless(defined($fn)) { - error($pos, "incomplete INCLUDE command"); - return; - } - - ReadConformance($fn, $data); -} - -my %field_handlers = ( - TYPE => \&handle_type, - NOEMIT => \&handle_noemit, - MANUAL => \&handle_manual, - PARAM_VALUE => \&handle_param_value, - HF_FIELD => \&handle_hf_field, - HF_RENAME => \&handle_hf_rename, - ETT_FIELD => \&handle_ett_field, - TFS => \&handle_tfs, - STRIP_PREFIX => \&handle_strip_prefix, - PROTOCOL => \&handle_protocol, - FIELD_DESCRIPTION => \&handle_fielddescription, - IMPORT => \&handle_import, - INCLUDE => \&handle_include -); - -sub ReadConformance($$) -{ - my ($f,$data) = @_; - my $ret; - - open(IN,"<$f") or return undef; - - $ret = ReadConformanceFH(*IN, $data, $f); - - close(IN); - - return $ret; -} - -sub ReadConformanceFH($$$) -{ - my ($fh,$data,$f) = @_; - - my $incodeblock = 0; - - my $ln = 0; - - foreach (<$fh>) { - $ln++; - next if (/^#.*$/); - next if (/^$/); - - s/[\r\n]//g; - - if ($_ eq "CODE START") { - $incodeblock = 1; - next; - } elsif ($incodeblock and $_ eq "CODE END") { - $incodeblock = 0; - next; - } elsif ($incodeblock) { - if (exists $data->{override}) { - $data->{override}.="$_\n"; - } else { - $data->{override} = "$_\n"; - } - next; - } - - my @fields = /([^ "]+|"[^"]+")/g; - - my $cmd = $fields[0]; - - shift @fields; - - my $pos = { FILE => $f, LINE => $ln }; - - next unless(defined($cmd)); - - if (not defined($field_handlers{$cmd})) { - warning($pos, "Unknown command `$cmd'"); - next; - } - - $field_handlers{$cmd}($pos, $data, @fields); - } - - if ($incodeblock) { - warning({ FILE => $f, LINE => $ln }, - "Expecting CODE END"); - return undef; - } - - return 1; -} - -1; |