aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2014-01-13 21:05:44 +0000
committerGuy Harris <guy@alum.mit.edu>2014-01-13 21:05:44 +0000
commita2979508d011e897f9867997711e4496b1905ac7 (patch)
tree71c622b6c264ddaca527e8d3081d317757f2b9a0
parentc463f6cc88f7d3256d4bae7e4167ff1988645e1c (diff)
Add HEADER START and HEADER END, similar to CODE START and CODE END, to
allow stuff to be put into the .h file; that way, if you put helper functions into the .c file, for use by dissectors other than the one being generated, you can put declarations for them into the .h file. Do some checks for mis-nesting of CODE and HEADER blocks. Clean up the "this is generated code" header. svn path=/trunk/; revision=54720
-rw-r--r--tools/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm52
-rw-r--r--tools/pidl/lib/Parse/Pidl/Wireshark/NDR.pm10
2 files changed, 57 insertions, 5 deletions
diff --git a/tools/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm b/tools/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm
index fbdaa9ab19..d2d99f0158 100644
--- a/tools/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm
+++ b/tools/pidl/lib/Parse/Pidl/Wireshark/Conformance.pm
@@ -396,6 +396,7 @@ sub ReadConformanceFH($$$)
my ($fh,$data,$f) = @_;
my $incodeblock = 0;
+ my $inheaderblock = 0;
my $ln = 0;
@@ -407,9 +408,27 @@ sub ReadConformanceFH($$$)
s/[\r\n]//g;
if ($_ eq "CODE START") {
+ if ($incodeblock) {
+ warning({ FILE => $f, LINE => $ln },
+ "CODE START inside CODE section");
+ }
+ if ($inheaderblock) {
+ error({ FILE => $f, LINE => $ln },
+ "CODE START inside HEADER section");
+ return undef;
+ }
$incodeblock = 1;
next;
- } elsif ($incodeblock and $_ eq "CODE END") {
+ } elsif ($_ eq "CODE END") {
+ if (!$incodeblock) {
+ warning({ FILE => $f, LINE => $ln },
+ "CODE END outside CODE section");
+ }
+ if ($inheaderblock) {
+ error({ FILE => $f, LINE => $ln },
+ "CODE END inside HEADER section");
+ return undef;
+ }
$incodeblock = 0;
next;
} elsif ($incodeblock) {
@@ -419,6 +438,37 @@ sub ReadConformanceFH($$$)
$data->{override} = "$_\n";
}
next;
+ } elsif ($_ eq "HEADER START") {
+ if ($inheaderblock) {
+ warning({ FILE => $f, LINE => $ln },
+ "HEADER START inside HEADER section");
+ }
+ if ($incodeblock) {
+ error({ FILE => $f, LINE => $ln },
+ "HEADER START inside CODE section");
+ return undef;
+ }
+ $inheaderblock = 1;
+ next;
+ } elsif ($_ eq "HEADER END") {
+ if (!$inheaderblock) {
+ warning({ FILE => $f, LINE => $ln },
+ "HEADER END outside HEADER section");
+ }
+ if ($incodeblock) {
+ error({ FILE => $f, LINE => $ln },
+ "CODE END inside HEADER section");
+ return undef;
+ }
+ $inheaderblock = 0;
+ next;
+ } elsif ($inheaderblock) {
+ if (exists $data->{header}) {
+ $data->{header}.="$_\n";
+ } else {
+ $data->{header} = "$_\n";
+ }
+ next;
}
my @fields = /([^ "]+|"[^"]+")/g;
diff --git a/tools/pidl/lib/Parse/Pidl/Wireshark/NDR.pm b/tools/pidl/lib/Parse/Pidl/Wireshark/NDR.pm
index ff1bf77aeb..f443069e0c 100644
--- a/tools/pidl/lib/Parse/Pidl/Wireshark/NDR.pm
+++ b/tools/pidl/lib/Parse/Pidl/Wireshark/NDR.pm
@@ -930,6 +930,10 @@ sub ProcessInterface($$)
$self->RegisterInterface($x);
$self->RegisterInterfaceHandoff($x);
+ if (exists ($self->{conformance}->{header})) {
+ $self->pidl_hdr($self->{conformance}->{header});
+ }
+
$self->pidl_hdr("#endif /* $define */");
}
@@ -1012,7 +1016,7 @@ sub Parse($$$$$)
my $notice =
"/* DO NOT EDIT
- This filter was automatically generated
+ This file was automatically generated by Pidl
from $idl_file and $cnf_file.
Pidl is a perl based IDL compiler for DCE/RPC idl files.
@@ -1025,8 +1029,6 @@ sub Parse($$$$$)
";
- $self->pidl_hdr($notice);
-
$self->{res}->{headers} = "\n";
$self->{res}->{headers} .= "#include \"config.h\"\n";
@@ -1075,7 +1077,7 @@ sub Parse($$$$$)
}
$parser.=$self->{res}->{code};
- my $header = "/* autogenerated by pidl */\n\n";
+ my $header = $notice;
$header.=$self->{res}->{hdr};
$self->CheckUsed($self->{conformance});