summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/build/pidl/header.pm52
-rw-r--r--source4/build/pidl/needed.pm92
-rw-r--r--source4/build/pidl/parser.pm82
3 files changed, 147 insertions, 79 deletions
diff --git a/source4/build/pidl/header.pm b/source4/build/pidl/header.pm
index f9acc5e222..58707a90a5 100644
--- a/source4/build/pidl/header.pm
+++ b/source4/build/pidl/header.pm
@@ -6,6 +6,7 @@
package IdlHeader;
use strict;
+use needed;
my($res);
my($tab_depth);
@@ -178,6 +179,35 @@ sub HeaderTypedef($)
}
#####################################################################
+# prototype a typedef
+sub HeaderTypedefProto($)
+{
+ my($d) = shift;
+ if (!util::has_property($d->{DATA}, "public")) {
+ return;
+ }
+
+ if ($d->{DATA}{TYPE} eq "STRUCT") {
+ $res .= "NTSTATUS ndr_push_$d->{NAME}(struct ndr_push *, int , struct $d->{NAME} *);\n";
+ $res .= "NTSTATUS ndr_pull_$d->{NAME}(struct ndr_pull *, int , struct $d->{NAME} *);\n";
+ if (!util::has_property($d->{DATA}, "noprint")) {
+ $res .= "void ndr_print_$d->{NAME}(struct ndr_print *, const char *, struct $d->{NAME} *);\n";
+ }
+
+ if (needed::is_needed("ndr_size_$d->{NAME}")) {
+ $res .= "size_t ndr_size_$d->{NAME}(int , struct $d->{NAME} *, int );\n";
+ }
+ }
+ if ($d->{DATA}{TYPE} eq "UNION") {
+ $res .= "NTSTATUS ndr_push_$d->{NAME}(struct ndr_push *, int, int, union $d->{NAME} *);\n";
+ $res .= "NTSTATUS ndr_pull_$d->{NAME}(struct ndr_pull *, int, int, union $d->{NAME} *);\n";
+ if (!util::has_property($d->{DATA}, "noprint")) {
+ $res .= "void ndr_print_$d->{NAME}(struct ndr_print *, const char *, int, union $d->{NAME} *);\n";
+ }
+ }
+}
+
+#####################################################################
# parse a typedef
sub HeaderConst($)
{
@@ -267,6 +297,18 @@ sub HeaderFunction($)
}
#####################################################################
+# output prototypes for a IDL function
+sub HeaderFnProto($)
+{
+ my $fn = shift;
+ my $name = $fn->{NAME};
+ $res .= "void ndr_print_$name(struct ndr_print *, const char *, int, struct $name *);\n";
+ $res .= "struct rpc_request *dcerpc_$name\_send(struct dcerpc_pipe *, TALLOC_CTX *, struct $name *);\n";
+ $res .= "NTSTATUS dcerpc_$name(struct dcerpc_pipe *, TALLOC_CTX *, struct $name *);\n";
+ $res .= "\n";
+}
+
+#####################################################################
# parse the interface definitions
sub HeaderInterface($)
{
@@ -310,8 +352,12 @@ sub HeaderInterface($)
HeaderConst($d);
($d->{TYPE} eq "TYPEDEF") &&
HeaderTypedef($d);
+ ($d->{TYPE} eq "TYPEDEF") &&
+ HeaderTypedefProto($d);
($d->{TYPE} eq "FUNCTION") &&
HeaderFunction($d);
+ ($d->{TYPE} eq "FUNCTION") &&
+ HeaderFnProto($d);
}
$res .= "#endif /* _HEADER_NDR_$interface->{NAME} */\n";
@@ -326,8 +372,10 @@ sub Parse($)
$res = "/* header auto-generated by pidl */\n\n";
foreach my $x (@{$idl}) {
- ($x->{TYPE} eq "INTERFACE") &&
- HeaderInterface($x);
+ if ($x->{TYPE} eq "INTERFACE") {
+ needed::BuildNeeded($x);
+ HeaderInterface($x);
+ }
}
return $res;
}
diff --git a/source4/build/pidl/needed.pm b/source4/build/pidl/needed.pm
new file mode 100644
index 0000000000..301b85e51c
--- /dev/null
+++ b/source4/build/pidl/needed.pm
@@ -0,0 +1,92 @@
+###################################################
+# Samba4 parser generator for IDL structures
+# Copyright tridge@samba.org 2000-2004
+# Copyright jelmer@samba.org 2004
+# released under the GNU GPL
+
+package needed;
+
+use strict;
+
+# the list of needed functions
+my %needed;
+
+sub NeededFunction($)
+{
+ my $fn = shift;
+ $needed{"pull_$fn->{NAME}"} = 1;
+ $needed{"push_$fn->{NAME}"} = 1;
+ foreach my $e (@{$fn->{DATA}}) {
+ $e->{PARENT} = $fn;
+ $needed{"pull_$e->{TYPE}"} = 1;
+ $needed{"push_$e->{TYPE}"} = 1;
+ }
+}
+
+sub NeededTypedef($)
+{
+ my $t = shift;
+ if (util::has_property($t->{DATA}, "public")) {
+ $needed{"pull_$t->{NAME}"} = 1;
+ $needed{"push_$t->{NAME}"} = 1;
+ }
+
+ if ($t->{DATA}->{TYPE} eq "STRUCT") {
+ if (util::has_property($t->{DATA}, "gensize")) {
+ $needed{"ndr_size_$t->{NAME}"} = 1;
+ }
+
+ for my $e (@{$t->{DATA}->{ELEMENTS}}) {
+ $e->{PARENT} = $t->{DATA};
+ if ($needed{"pull_$t->{NAME}"}) {
+ $needed{"pull_$e->{TYPE}"} = 1;
+ }
+ if ($needed{"push_$t->{NAME}"}) {
+ $needed{"push_$e->{TYPE}"} = 1;
+ }
+ if ($needed{"ndr_size_$t->{NAME}"}) {
+ $needed{"ndr_size_$e->{TYPE}"} = 1;
+ }
+ }
+ }
+ if ($t->{DATA}->{TYPE} eq "UNION") {
+ for my $e (@{$t->{DATA}->{DATA}}) {
+ $e->{PARENT} = $t->{DATA};
+ if ($e->{TYPE} eq "UNION_ELEMENT") {
+ if ($needed{"pull_$t->{NAME}"}) {
+ $needed{"pull_$e->{DATA}->{TYPE}"} = 1;
+ }
+ if ($needed{"push_$t->{NAME}"}) {
+ $needed{"push_$e->{DATA}->{TYPE}"} = 1;
+ }
+ if ($needed{"ndr_size_$t->{NAME}"}) {
+ $needed{"ndr_size_$e->{DATA}->{TYPE}"} = 1;
+ }
+ }
+ }
+ }
+}
+
+#####################################################################
+# work out what parse functions are needed
+sub BuildNeeded($)
+{
+ my($interface) = shift;
+ my($data) = $interface->{DATA};
+ foreach my $d (@{$data}) {
+ ($d->{TYPE} eq "FUNCTION") &&
+ NeededFunction($d);
+ }
+ foreach my $d (reverse @{$data}) {
+ ($d->{TYPE} eq "TYPEDEF") &&
+ NeededTypedef($d);
+ }
+}
+
+sub is_needed($)
+{
+ my $name = shift;
+ return $needed{$name};
+}
+
+1;
diff --git a/source4/build/pidl/parser.pm b/source4/build/pidl/parser.pm
index 15dd1cd70e..cec972911e 100644
--- a/source4/build/pidl/parser.pm
+++ b/source4/build/pidl/parser.pm
@@ -9,9 +9,9 @@ package IdlParser;
use strict;
use client;
+use needed;
# the list of needed functions
-my %needed;
my %structs;
sub pidl($)
@@ -1127,7 +1127,7 @@ sub ParseTypedefPush($)
my($e) = shift;
my $static = fn_prefix($e);
- if (! $needed{"push_$e->{NAME}"}) {
+ if (! needed::is_needed("push_$e->{NAME}")) {
# print "push_$e->{NAME} not needed\n";
return;
}
@@ -1157,7 +1157,7 @@ sub ParseTypedefPull($)
my($e) = shift;
my $static = fn_prefix($e);
- if (! $needed{"pull_$e->{NAME}"}) {
+ if (! needed::is_needed("pull_$e->{NAME}")) {
# print "pull_$e->{NAME} not needed\n";
return;
}
@@ -1208,7 +1208,7 @@ sub ParseTypedefPrint($)
sub ParseTypedefNdrSize($)
{
my($t) = shift;
- if (! $needed{"ndr_size_$t->{NAME}"}) {
+ if (! needed::is_needed("ndr_size_$t->{NAME}")) {
return;
}
@@ -1557,78 +1557,6 @@ sub ParseInterface($)
}
-sub NeededFunction($)
-{
- my $fn = shift;
- $needed{"pull_$fn->{NAME}"} = 1;
- $needed{"push_$fn->{NAME}"} = 1;
- foreach my $e (@{$fn->{DATA}}) {
- $e->{PARENT} = $fn;
- $needed{"pull_$e->{TYPE}"} = 1;
- $needed{"push_$e->{TYPE}"} = 1;
- }
-}
-
-sub NeededTypedef($)
-{
- my $t = shift;
- if (util::has_property($t->{DATA}, "public")) {
- $needed{"pull_$t->{NAME}"} = 1;
- $needed{"push_$t->{NAME}"} = 1;
- }
-
- if ($t->{DATA}->{TYPE} eq "STRUCT") {
- if (util::has_property($t->{DATA}, "gensize")) {
- $needed{"ndr_size_$t->{NAME}"} = 1;
- }
-
- for my $e (@{$t->{DATA}->{ELEMENTS}}) {
- $e->{PARENT} = $t->{DATA};
- if ($needed{"pull_$t->{NAME}"}) {
- $needed{"pull_$e->{TYPE}"} = 1;
- }
- if ($needed{"push_$t->{NAME}"}) {
- $needed{"push_$e->{TYPE}"} = 1;
- }
- if ($needed{"ndr_size_$t->{NAME}"}) {
- $needed{"ndr_size_$e->{TYPE}"} = 1;
- }
- }
- }
- if ($t->{DATA}->{TYPE} eq "UNION") {
- for my $e (@{$t->{DATA}->{DATA}}) {
- $e->{PARENT} = $t->{DATA};
- if ($e->{TYPE} eq "UNION_ELEMENT") {
- if ($needed{"pull_$t->{NAME}"}) {
- $needed{"pull_$e->{DATA}->{TYPE}"} = 1;
- }
- if ($needed{"push_$t->{NAME}"}) {
- $needed{"push_$e->{DATA}->{TYPE}"} = 1;
- }
- if ($needed{"ndr_size_$t->{NAME}"}) {
- $needed{"ndr_size_$e->{DATA}->{TYPE}"} = 1;
- }
- }
- }
- }
-}
-
-#####################################################################
-# work out what parse functions are needed
-sub BuildNeeded($)
-{
- my($interface) = shift;
- my($data) = $interface->{DATA};
- foreach my $d (@{$data}) {
- ($d->{TYPE} eq "FUNCTION") &&
- NeededFunction($d);
- }
- foreach my $d (reverse @{$data}) {
- ($d->{TYPE} eq "TYPEDEF") &&
- NeededTypedef($d);
- }
-}
-
#####################################################################
# parse a parsed IDL structure back into an IDL file
sub Parse($$)
@@ -1642,7 +1570,7 @@ sub Parse($$)
pidl "#include \"includes.h\"\n\n";
foreach my $x (@{$idl}) {
if ($x->{TYPE} eq "INTERFACE") {
- BuildNeeded($x);
+ needed::BuildNeeded($x);
ParseInterface($x);
}
}