summaryrefslogtreecommitdiff
path: root/source4/build/pidl/validator.pm
diff options
context:
space:
mode:
Diffstat (limited to 'source4/build/pidl/validator.pm')
-rw-r--r--source4/build/pidl/validator.pm41
1 files changed, 40 insertions, 1 deletions
diff --git a/source4/build/pidl/validator.pm b/source4/build/pidl/validator.pm
index 79f1c6be88..ee1c33ef4c 100644
--- a/source4/build/pidl/validator.pm
+++ b/source4/build/pidl/validator.pm
@@ -16,6 +16,38 @@ sub fatal($)
die "IDL is not valid\n";
}
+sub el_name($)
+{
+ my $e = shift;
+
+ if ($e->{PARENT} && $e->{PARENT}->{NAME}) {
+ return "$e->{PARENT}->{NAME}.$e->{NAME}";
+ }
+
+ if ($e->{PARENT} && $e->{PARENT}->{PARENT}->{NAME}) {
+ return "$e->{PARENT}->{PARENT}->{NAME}.$e->{NAME}";
+ }
+
+ if ($e->{PARENT}) {
+ return "$e->{PARENT}->{NAME}.$e->{NAME}";
+ }
+ return $e->{NAME};
+}
+
+#####################################################################
+# parse a struct
+sub ValidElement($)
+{
+ my $e = shift;
+ if ($e->{POINTERS} && $e->{POINTERS} > 1) {
+ fatal(el_name($e) . " : pidl cannot handle multiple pointer levels. Use a sub-structure containing a pointer instead\n");
+ }
+
+ if ($e->{POINTERS} && $e->{ARRAY_LEN}) {
+ fatal(el_name($e) . " : pidl cannot handle pointers to arrays. Use a substructure instead\n");
+ }
+}
+
#####################################################################
# parse a struct
sub ValidStruct($)
@@ -23,7 +55,8 @@ sub ValidStruct($)
my($struct) = shift;
foreach my $e (@{$struct->{ELEMENTS}}) {
-
+ $e->{PARENT} = $struct;
+ ValidElement($e);
}
}
@@ -34,6 +67,8 @@ sub ValidUnion($)
{
my($union) = shift;
foreach my $e (@{$union->{DATA}}) {
+ $e->{PARENT} = $union;
+ ValidElement($e);
}
}
@@ -44,6 +79,8 @@ sub ValidTypedef($)
my($typedef) = shift;
my $data = $typedef->{DATA};
+ $data->{PARENT} = $typedef;
+
if (ref($data) eq "HASH") {
if ($data->{TYPE} eq "STRUCT") {
ValidStruct($data);
@@ -62,9 +99,11 @@ sub ValidFunction($)
my($fn) = shift;
foreach my $e (@{$fn->{DATA}}) {
+ $e->{PARENT} = $fn;
if (util::has_property($e, "ref") && !$e->{POINTERS}) {
fatal "[ref] variables must be pointers ($fn->{NAME}/$e->{NAME})\n";
}
+ ValidElement($e);
}
}