summaryrefslogtreecommitdiff
path: root/source4/build/pidl/parser.pm
diff options
context:
space:
mode:
Diffstat (limited to 'source4/build/pidl/parser.pm')
-rw-r--r--source4/build/pidl/parser.pm128
1 files changed, 128 insertions, 0 deletions
diff --git a/source4/build/pidl/parser.pm b/source4/build/pidl/parser.pm
index 1b09347052..19e6dc26f4 100644
--- a/source4/build/pidl/parser.pm
+++ b/source4/build/pidl/parser.pm
@@ -71,6 +71,21 @@ sub ParseArrayPush($$)
}
#####################################################################
+# print an array
+sub ParseArrayPrint($$)
+{
+ my $e = shift;
+ my $var_prefix = shift;
+ my $size = find_size_var($e, util::array_size($e));
+
+ if (util::is_scalar_type($e->{TYPE})) {
+ $res .= "\t\tndr_print_array_$e->{TYPE}(ndr, \"$e->{NAME}\", $var_prefix$e->{NAME}, $size);\n";
+ } else {
+ $res .= "\t\tndr_print_array(ndr, \"$e->{NAME}\", $var_prefix$e->{NAME}, sizeof($var_prefix$e->{NAME}\[0]), $size, (ndr_print_fn_t)ndr_print_$e->{TYPE});\n";
+ }
+}
+
+#####################################################################
# parse an array - pull side
sub ParseArrayPull($$)
{
@@ -110,6 +125,30 @@ sub ParseElementPushScalar($$$)
}
#####################################################################
+# print scalars in a structure element
+sub ParseElementPrintScalar($$)
+{
+ my($e) = shift;
+ my($var_prefix) = shift;
+ my $cprefix = util::c_push_prefix($e);
+
+ if (util::has_property($e, "struct_len")) {
+ return;
+ }
+
+ if (defined $e->{VALUE}) {
+ $res .= "\tndr_print_$e->{TYPE}(ndr, \"$e->{NAME}\", $e->{VALUE});\n";
+ } elsif (util::need_wire_pointer($e)) {
+ $res .= "\tndr_print_ptr(ndr, \"$e->{NAME}\", $var_prefix$e->{NAME});\n";
+ $res .= "\tndr->depth++;\n";
+ ParseElementPrintBuffer($e, "r->");
+ $res .= "\tndr->depth--;\n";
+ } else {
+ $res .= "\tndr_print_$e->{TYPE}(ndr, \"$e->{NAME}\", $cprefix$var_prefix$e->{NAME});\n";
+ }
+}
+
+#####################################################################
# parse scalars in a structure element - pull size
sub ParseElementPullSwitch($$$$)
{
@@ -186,6 +225,33 @@ sub ParseElementPushBuffer($$)
}
}
+#####################################################################
+# print buffers in a structure element
+sub ParseElementPrintBuffer($$)
+{
+ my($e) = shift;
+ my($var_prefix) = shift;
+ my $cprefix = util::c_push_prefix($e);
+
+ if (util::is_pure_scalar($e)) {
+ return;
+ }
+
+ if (util::need_wire_pointer($e)) {
+ $res .= "\tif ($var_prefix$e->{NAME}) {\n";
+ }
+
+ if (util::array_size($e)) {
+ ParseArrayPrint($e, "r->");
+ } else {
+ $res .= "\t\tndr_print_$e->{TYPE}(ndr, \"$e->{NAME}\", $cprefix$var_prefix$e->{NAME});\n";
+ }
+
+ if (util::need_wire_pointer($e)) {
+ $res .= "\t}\n";
+ }
+}
+
#####################################################################
# parse buffers in a structure element - pull side
@@ -272,6 +338,25 @@ sub ParseStructPush($)
}
#####################################################################
+# generate a struct print function
+sub ParseStructPrint($)
+{
+ my($struct) = shift;
+
+ $res .= "\tndr_print_struct(ndr, name);\n";
+
+ if (! defined $struct->{ELEMENTS}) {
+ return;
+ }
+
+ $res .= "\tndr->depth++;\n";
+ foreach my $e (@{$struct->{ELEMENTS}}) {
+ ParseElementPrintScalar($e, "r->");
+ }
+ $res .= "\tndr->depth--;\n";
+}
+
+#####################################################################
# parse a struct - pull side
sub ParseStructPull($)
{
@@ -341,6 +426,14 @@ sub ParseUnionPush($)
}
#####################################################################
+# print a union
+sub ParseUnionPrint($)
+{
+ my $e = shift;
+ print "WARNING! union print not done\n";
+}
+
+#####################################################################
# parse a union - pull side
sub ParseUnionPull($)
{
@@ -385,6 +478,20 @@ sub ParseTypePush($)
}
#####################################################################
+# generate a print function for a type
+sub ParseTypePrint($)
+{
+ my($data) = shift;
+
+ if (ref($data) eq "HASH") {
+ ($data->{TYPE} eq "STRUCT") &&
+ ParseStructPrint($data);
+ ($data->{TYPE} eq "UNION") &&
+ ParseUnionPrint($data);
+ }
+}
+
+#####################################################################
# parse a type
sub ParseTypePull($)
{
@@ -456,6 +563,26 @@ sub ParseTypedefPull($)
}
+#####################################################################
+# parse a typedef - push side
+sub ParseTypedefPrint($)
+{
+ my($e) = shift;
+
+ if ($e->{DATA}->{TYPE} eq "STRUCT") {
+ $res .= "void ndr_print_$e->{NAME}(struct ndr_print *ndr, const char *name, struct $e->{NAME} *r)";
+ $res .= "\n{\n";
+ ParseTypePrint($e->{DATA});
+ $res .= "}\n\n";
+ }
+
+ if ($e->{DATA}->{TYPE} eq "UNION") {
+ $res .= "void ndr_print_$e->{NAME}(struct ndr_print *ndr, const char *name, uint16 level, union $e->{NAME} *r)";
+ $res .= "\n{\n";
+ ParseTypePrint($e->{DATA});
+ $res .= "}\n\n";
+ }
+}
#####################################################################
@@ -537,6 +664,7 @@ sub ParseTypedef($)
my($e) = shift;
ParseTypedefPush($e);
ParseTypedefPull($e);
+ ParseTypedefPrint($e);
}
#####################################################################