sub handle_union_tag_size($$)
{
+ my ($union,$size) = @_;
+
#FIXME
}
+use vars qw(%hf_renames %types %header_fields);
+
sub handle_type($$$$$$$)
{
my ($name,$dissectorname,$ft_type,$base_type,$mask,$valsstring,$alignment) = @_;
- #FIXME
+
+ $types{$name} = {
+ NAME => $name,
+ DISSECTOR_NAME => $dissectorname,
+ FT_TYPE => $ft_type,
+ BASE_TYPE => $base_type,
+ MASK => $mask,
+ VALSSTRING => $valsstring,
+ ALIGNMENT => $alignment
+ };
}
-use vars qw(%hf_renames);
sub handle_hf_rename($$)
{
sub handle_hf_field($$$$$$$$)
{
- my ($hf,$title,$filter,$ft_type,$base_type,$valsstring,$mask,$blub) = @_;
-
+ my ($hf,$title,$filter,$ft_type,$base_type,$valsstring,$mask,$blurb) = @_;
+
+ $header_fields{$hf} = {
+ HF => $hf,
+ TITLE => $title,
+ FILTER => $filter,
+ FT_TYPE => $ft_type,
+ BASE_TYPE => $base_type,
+ VALSSTRING => $valsstring,
+ MASK => $mask,
+ BLURB => $blurb
+ };
}
sub handle_strip_prefix($)
{
+ my $x = shift;
#FIXME
}
# Portions based on idl2eth.c by Ronnie Sahlberg
# released under the GNU GPL
+# TODO:
+# - order of functions generated per element level
+# - strings
+
package Parse::Pidl::Ethereal::NDR;
use strict;
pidl_code "return offset;";
pidl_code "}\n";
- register_hf_field($name, $dissectorname, enum_ft($e), "BASE_DEC", "0", "VALS($valsstring)", enum_size($e));
+ register_type($name, $dissectorname, enum_ft($e), "BASE_DEC", "0", "VALS($valsstring)", enum_size($e));
}
sub Bitmap($$$)
my $hf_bitname = "hf_$ifname\_$name\_$en";
my $filtername = "$ifname\.$name\.$en";
- register_hf_field($hf_bitname, $en, $filtername, "FT_BOOLEAN", $e->{ALIGN} * 8, "TFS(&$en\_tfs)", $ev, "");
+ register_hf_field($hf_bitname, field2name($en), $filtername, "FT_BOOLEAN", $e->{ALIGN} * 8, "TFS(&$en\_tfs)", $ev, "");
pidl_def "static const true_false_string $name\_tfs = {";
pidl_def " \"$name is SET\",";
return if (EmitProhibited($dissectorname));
- my $hf = register_hf_field("hf_$ifname\_$pn\_$e->{NAME}", $e->{NAME}, "$ifname.$pn.$e->{NAME}", type2ft($e->{TYPE}), "BASE_HEX", "NULL", 0, "");
+ my $hf = register_hf_field("hf_$ifname\_$pn\_$e->{NAME}", field2name($e->{NAME}), "$ifname.$pn.$e->{NAME}", type2ft($e->{TYPE}), "BASE_HEX", "NULL", 0, "");
my $add = "";
foreach (@{$e->{LEVELS}}) {
indent;
foreach (@{$fn->{ELEMENTS}}) {
if (grep(/in/,@{$_->{DIRECTION}})) {
- pidl_code "dissectornames{$_->{NAME}};";
+ pidl_code "$dissectornames{$_->{NAME}}";
pidl_code "offset=dissect_deferred_pointers(pinfo,tvb,offset,drep);";
+ pidl_code "";
}
}
pidl_code "return offset;";
indent;
foreach (@{$fn->{ELEMENTS}}) {
if (grep(/out/,@{$_->{DIRECTION}})) {
- pidl_code "$dissectornames{$_->{NAME}};";
+ pidl_code "$dissectornames{$_->{NAME}}";
pidl_code "offset=dissect_deferred_pointers(pinfo,tvb,offset,drep);";
}
{
my $x = shift;
+ my $define = "__PACKET_DCERPC_" . uc($_->{NAME}) . "_H";
+ pidl_hdr "#ifndef $define";
+ pidl_hdr "#define $define";
+ pidl_hdr "";
+
+ if (defined $x->{PROPERTIES}->{depends}) {
+ foreach (split / /, $x->{PROPERTIES}->{depends}) {
+ pidl_hdr "#include \"packet-dcerpc-$_\.h\"\n";
+ }
+ }
+
+ pidl_def "static gint proto_dcerpc_$x->{NAME} = -1;";
+ register_ett("ett_dcerpc_$x->{NAME}");
+ register_hf_field("hf_$x->{NAME}_opnum", "Operation", "$x->{NAME}.opnum", "FT_UINT16", "BASE_DEC", "NULL", 0, "");
+
foreach (@{$x->{TYPEDEFS}}) {
$dissectors{$_->{NAME}} = "$x->{NAME}_dissect_$_->{NAME}";
}
Interface($x);
- $res{functiontable} = DumpFunctionTable($x);
+ pidl_code "\n".DumpFunctionTable($x);
RegisterInterface($x);
RegisterInterfaceHandoff($x);
+
+ pidl_hdr "#endif /* $define */";
}
#####################################################################
pidl_hdr "/* header auto-generated by pidl */";
- $res{headers} = "";
+ $res{headers} = "\n";
$res{headers} .= "#ifdef HAVE_CONFIG_H\n";
$res{headers} .= "#include \"config.h\"\n";
$res{headers} .= "#endif\n\n";
$parser.=$res{def};
$parser.=$res{code};
- my $define = "__PACKET_DCERPC_" . uc($_->{NAME}) . "_H";
- my $header = "#ifndef $define\n#define $define\n\n".$res{hdr} . "\n#endif /* $define */\n";
+ my $header = "/* autogenerated by pidl */\n\n";
+ $header.=$res{hdr};
return ($parser,$header);
}
my $res = "static dcerpc_sub_dissector $if->{NAME}\_dissectors[] = {\n";
foreach (@{$if->{FUNCTIONS}}) {
- $res.= "\t{ $_->{OPNUM}, \"$_->{NAME},\n";
+ $res.= "\t{ $_->{OPNUM}, \"$_->{NAME}\",\n";
$res.= "\t $if->{NAME}_dissect_$_->{NAME}_request, $if->{NAME}_dissect_$_->{NAME}_response},\n";
}
- $res .= "\t{ 0, NULL, NULL, NULL },\n";
+ $res .= "\t{ 0, NULL, NULL, NULL }\n";
- return "$res\t}\n";
+ return "$res};\n";
}