summaryrefslogtreecommitdiff
path: root/source4/build
diff options
context:
space:
mode:
Diffstat (limited to 'source4/build')
-rw-r--r--source4/build/pidl/ndr.pm123
1 files changed, 55 insertions, 68 deletions
diff --git a/source4/build/pidl/ndr.pm b/source4/build/pidl/ndr.pm
index ae9f5b2292..5d3f23dfd7 100644
--- a/source4/build/pidl/ndr.pm
+++ b/source4/build/pidl/ndr.pm
@@ -12,6 +12,7 @@ use needed;
# list of known types
our %typedefs;
+our %typefamily;
sub RegisterPrimitives()
{
@@ -315,7 +316,7 @@ sub end_flags($)
#####################################################################
# work out the correct alignment for a structure or union
-sub struct_alignment
+sub find_largest_alignment($)
{
my $s = shift;
@@ -350,22 +351,7 @@ sub align_type
my $dt = $typedefs{$e}->{DATA};
return $dt->{ALIGN} if ($dt->{ALIGN});
-
- if ($dt->{TYPE} eq "STRUCT") {
- $dt->{ALIGN} = struct_alignment($dt);
- } elsif($dt->{TYPE} eq "UNION") {
- $dt->{ALIGN} = struct_alignment($dt);
- } elsif ($dt->{TYPE} eq "ENUM") {
- $dt->{ALIGN} = align_type(util::enum_type_fn($typedefs{$e}->{DATA}));
- } elsif ($dt->{TYPE} eq "BITMAP") {
- $dt->{ALIGN} = align_type(util::bitmap_type_fn($typedefs{$e}->{DATA}));
- }
-
- if (not defined($dt->{ALIGN})) {
- die("Internal pidl error. Unable to determine alignment for data type $dt->{TYPE}!");
- }
-
- return $dt->{ALIGN};
+ return $typefamily{$dt->{TYPE}}->{ALIGN}($dt);
}
#####################################################################
@@ -877,7 +863,7 @@ sub ParseStructPush($)
pidl "\tNDR_CHECK(ndr_push_struct_start(ndr));\n";
- my $align = struct_alignment($struct);
+ my $align = find_largest_alignment($struct);
pidl "\tNDR_CHECK(ndr_push_align(ndr, $align));\n";
foreach my $e (@{$struct->{ELEMENTS}}) {
@@ -954,6 +940,12 @@ sub ParseEnumPrint($)
end_flags($enum);
}
+$typefamily{ENUM} = {
+ PUSH_FN_BODY => \&ParseEnumPush,
+ PULL_FN_BODY => \&ParseEnumPull,
+ PRINT_FN_BODY => \&ParseEnumPrint,
+ ALIGN => sub { return align_type(util::enum_type_fn(shift)); }
+};
#####################################################################
# generate a push function for a bitmap
@@ -1026,6 +1018,13 @@ sub ParseBitmapPrint($)
end_flags($bitmap);
}
+$typefamily{BITMAP} = {
+ PUSH_FN_BODY => \&ParseBitmapPush,
+ PULL_FN_BODY => \&ParseBitmapPull,
+ PRINT_FN_BODY => \&ParseBitmapPrint,
+ ALIGN => sub { return align_type(util::bitmap_type_fn(shift)); }
+};
+
#####################################################################
# generate a struct print function
sub ParseStructPrint($)
@@ -1096,7 +1095,7 @@ sub ParseStructPull($)
pidl "\tNDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &$conform_e->{CONFORMANT_SIZE}));\n";
}
- my $align = struct_alignment($struct);
+ my $align = find_largest_alignment($struct);
pidl "\tNDR_CHECK(ndr_pull_align(ndr, $align));\n";
foreach my $e (@{$struct->{ELEMENTS}}) {
@@ -1137,6 +1136,14 @@ sub ParseStructNdrSize($)
pidl "}\n\n";
}
+$typefamily{STRUCT} = {
+ PUSH_FN_BODY => \&ParseStructPush,
+ PULL_FN_BODY => \&ParseStructPull,
+ PRINT_FN_BODY => \&ParseStructPrint,
+ SIZE_FN => \&ParseStructNdrSize,
+ ALIGN => \&find_largest_alignment
+};
+
#####################################################################
# calculate size of ndr struct
sub ParseUnionNdrSize($)
@@ -1303,28 +1310,14 @@ sub ParseUnionPull($)
end_flags($e);
}
-my %typefamily = (
- STRUCT => {
- PUSH_FN_BODY => \&ParseStructPush,
- PULL_FN_BODY => \&ParseStructPull,
- PRINT_FN_BODY => \&ParseStructPrint
- },
- UNION => {
- PUSH_FN_BODY => \&ParseUnionPush,
- PULL_FN_BODY => \&ParseUnionPull,
- PRINT_FN_BODY => \&ParseUnionPrint
- },
- ENUM => {
- PUSH_FN_BODY => \&ParseEnumPush,
- PULL_FN_BODY => \&ParseEnumPull,
- PRINT_FN_BODY => \&ParseEnumPrint
- },
- BITMAP => {
- PUSH_FN_BODY => \&ParseBitmapPush,
- PULL_FN_BODY => \&ParseBitmapPull,
- PRINT_FN_BODY => \&ParseBitmapPrint
- }
-);
+$typefamily{UNION} = {
+ PUSH_FN_BODY => \&ParseUnionPush,
+ PULL_FN_BODY => \&ParseUnionPull,
+ PRINT_FN_BODY => \&ParseUnionPrint,
+ SIZE_FN => \&ParseUnionNdrSize,
+ ALIGN => \&find_largest_alignment
+};
+
#####################################################################
# parse a typedef - push side
@@ -1338,25 +1331,23 @@ sub ParseTypedefPush($)
return;
}
- if (defined($e->{PROPERTIES}) && !defined($e->{DATA}->{PROPERTIES})) {
- $e->{DATA}->{PROPERTIES} = $e->{PROPERTIES};
- }
+ pidl $static . "NTSTATUS ndr_push_$e->{NAME}";
if ($e->{DATA}->{TYPE} eq "STRUCT") {
- pidl $static . "NTSTATUS ndr_push_$e->{NAME}(struct ndr_push *ndr, int ndr_flags, struct $e->{NAME} *r)";
+ pidl "(struct ndr_push *ndr, int ndr_flags, struct $e->{NAME} *r)";
}
if ($e->{DATA}->{TYPE} eq "UNION") {
- pidl $static . "NTSTATUS ndr_push_$e->{NAME}(struct ndr_push *ndr, int ndr_flags, int level, union $e->{NAME} *r)";
+ pidl "(struct ndr_push *ndr, int ndr_flags, int level, union $e->{NAME} *r)";
}
if ($e->{DATA}->{TYPE} eq "ENUM") {
- pidl $static . "NTSTATUS ndr_push_$e->{NAME}(struct ndr_push *ndr, int ndr_flags, enum $e->{NAME} r)";
+ pidl "(struct ndr_push *ndr, int ndr_flags, enum $e->{NAME} r)";
}
if ($e->{DATA}->{TYPE} eq "BITMAP") {
my $type_decl = util::bitmap_type_decl($e->{DATA});
- pidl $static . "NTSTATUS ndr_push_$e->{NAME}(struct ndr_push *ndr, int ndr_flags, $type_decl r)";
+ pidl "(struct ndr_push *ndr, int ndr_flags, $type_decl r)";
}
pidl "\n{\n";
@@ -1372,30 +1363,28 @@ sub ParseTypedefPull($)
my($e) = shift;
my $static = fn_prefix($e);
- if (defined($e->{PROPERTIES}) && !defined($e->{DATA}->{PROPERTIES})) {
- $e->{DATA}->{PROPERTIES} = $e->{PROPERTIES};
- }
-
if (! needed::is_needed("pull_$e->{NAME}")) {
# print "pull_$e->{NAME} not needed\n";
return;
}
+ pidl $static . "NTSTATUS ndr_pull_$e->{NAME}";
+
if ($e->{DATA}->{TYPE} eq "STRUCT") {
- pidl $static . "NTSTATUS ndr_pull_$e->{NAME}(struct ndr_pull *ndr, int ndr_flags, struct $e->{NAME} *r)";
+ pidl "(struct ndr_pull *ndr, int ndr_flags, struct $e->{NAME} *r)";
}
if ($e->{DATA}->{TYPE} eq "UNION") {
- pidl $static . "NTSTATUS ndr_pull_$e->{NAME}(struct ndr_pull *ndr, int ndr_flags, int level, union $e->{NAME} *r)";
+ pidl "(struct ndr_pull *ndr, int ndr_flags, int level, union $e->{NAME} *r)";
}
if ($e->{DATA}->{TYPE} eq "ENUM") {
- pidl $static . "NTSTATUS ndr_pull_$e->{NAME}(struct ndr_pull *ndr, int ndr_flags, enum $e->{NAME} *r)";
+ pidl "(struct ndr_pull *ndr, int ndr_flags, enum $e->{NAME} *r)";
}
if ($e->{DATA}->{TYPE} eq "BITMAP") {
my $type_decl = util::bitmap_type_decl($e->{DATA});
- pidl $static . "NTSTATUS ndr_pull_$e->{NAME}(struct ndr_pull *ndr, int ndr_flags, $type_decl *r)";
+ pidl "(struct ndr_pull *ndr, int ndr_flags, $type_decl *r)";
}
pidl "\n{\n";
@@ -1410,30 +1399,28 @@ sub ParseTypedefPrint($)
{
my($e) = shift;
- if (defined($e->{PROPERTIES}) && !defined($e->{DATA}->{PROPERTIES})) {
- $e->{DATA}->{PROPERTIES} = $e->{PROPERTIES};
- }
+ pidl "void ndr_print_$e->{NAME}";
if ($e->{DATA}->{TYPE} eq "STRUCT") {
- pidl "void ndr_print_$e->{NAME}(struct ndr_print *ndr, const char *name, struct $e->{NAME} *r)";
+ pidl "(struct ndr_print *ndr, const char *name, struct $e->{NAME} *r)";
pidl "\n{\n";
pidl "\tndr_print_struct(ndr, name, \"$e->{NAME}\");\n";
}
if ($e->{DATA}->{TYPE} eq "UNION") {
- pidl "void ndr_print_$e->{NAME}(struct ndr_print *ndr, const char *name, int level, union $e->{NAME} *r)";
+ pidl "(struct ndr_print *ndr, const char *name, int level, union $e->{NAME} *r)";
pidl "\n{\n";
pidl "\tndr_print_union(ndr, name, level, \"$e->{NAME}\");\n";
}
if ($e->{DATA}->{TYPE} eq "ENUM") {
- pidl "void ndr_print_$e->{NAME}(struct ndr_print *ndr, const char *name, enum $e->{NAME} r)";
+ pidl "(struct ndr_print *ndr, const char *name, enum $e->{NAME} r)";
pidl "\n{\n";
}
if ($e->{DATA}->{TYPE} eq "BITMAP") {
my $type_decl = util::bitmap_type_decl($e->{DATA});
- pidl "void ndr_print_$e->{NAME}(struct ndr_print *ndr, const char *name, $type_decl r)";
+ pidl "(struct ndr_print *ndr, const char *name, $type_decl r)";
pidl "\n{\n";
}
@@ -1449,12 +1436,8 @@ sub ParseTypedefNdrSize($)
if (! needed::is_needed("ndr_size_$t->{NAME}")) {
return;
}
-
- ($t->{DATA}->{TYPE} eq "STRUCT") &&
- ParseStructNdrSize($t);
- ($t->{DATA}->{TYPE} eq "UNION") &&
- ParseUnionNdrSize($t);
+ $typefamily{$t->{DATA}->{TYPE}}->{SIZE_FN}($t);
}
#####################################################################
@@ -1873,6 +1856,10 @@ sub LoadInterface($)
if ($d->{DATA}->{TYPE} eq "STRUCT" or $d->{DATA}->{TYPE} eq "UNION") {
CheckPointerTypes($d->{DATA}, $x->{PROPERTIES}->{pointer_default});
}
+
+ if (defined($d->{PROPERTIES}) && !defined($d->{DATA}->{PROPERTIES})) {
+ $d->{DATA}->{PROPERTIES} = $d->{PROPERTIES};
+ }
}
if ($d->{TYPE} eq "FUNCTION") {
CheckPointerTypes($d,