1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-11 05:18:09 +03:00

* differentiate between pointers and non-pointers in switch_is union

elements in structures

* layout the pull/push/print generated functions with all push
  together, all pull together etc, as this makes for easier debugging

(note that I have no redirected commit messages for pidl to the
samba-cvs mailing list, so you may be seeing these messages for the
first time. See the pidl cvs repository for details on pidl)
(This used to be commit b5888b5315)
This commit is contained in:
Andrew Tridgell 2003-11-14 02:20:41 +00:00
parent 9cadbd5775
commit b6b4cc752b

View File

@ -168,6 +168,8 @@ sub ParseElementPushScalar($$$)
$res .= "\tNDR_CHECK(ndr_push_$e->{TYPE}(ndr, $e->{VALUE}));\n";
} elsif (util::need_wire_pointer($e)) {
$res .= "\tNDR_CHECK(ndr_push_ptr(ndr, $var_prefix$e->{NAME}));\n";
} elsif (my $switch = util::has_property($e, "switch_is")) {
ParseElementPushSwitch($e, $var_prefix, $ndr_flags, $switch);
} elsif (util::is_builtin_type($e->{TYPE})) {
$res .= "\tNDR_CHECK(ndr_push_$e->{TYPE}(ndr, $cprefix$var_prefix$e->{NAME}));\n";
} else {
@ -194,6 +196,8 @@ sub ParseElementPrintScalar($$)
$res .= "\tndr->depth++;\n";
ParseElementPrintBuffer($e, "r->");
$res .= "\tndr->depth--;\n";
} elsif (my $switch = util::has_property($e, "switch_is")) {
ParseElementPrintSwitch($e, $var_prefix, $switch);
} else {
$res .= "\tndr_print_$e->{TYPE}(ndr, \"$e->{NAME}\", $cprefix$var_prefix$e->{NAME});\n";
}
@ -217,6 +221,33 @@ sub ParseElementPullSwitch($$$$)
$res .= "\t}\n";
}
#####################################################################
# push switch element
sub ParseElementPushSwitch($$$$)
{
my($e) = shift;
my($var_prefix) = shift;
my($ndr_flags) = shift;
my $switch = shift;
my $switch_var = find_size_var($e, $switch);
my $cprefix = util::c_push_prefix($e);
$res .= "\tNDR_CHECK(ndr_push_$e->{TYPE}(ndr, $ndr_flags, $switch_var, $cprefix$var_prefix$e->{NAME}));\n";
}
#####################################################################
# print scalars in a structure element
sub ParseElementPrintSwitch($$$)
{
my($e) = shift;
my($var_prefix) = shift;
my $switch = shift;
my $switch_var = find_size_var($e, $switch);
my $cprefix = util::c_push_prefix($e);
$res .= "\tndr_print_$e->{TYPE}(ndr, \"$e->{NAME}\", $switch_var, $cprefix$var_prefix$e->{NAME});\n";
}
#####################################################################
# parse scalars in a structure element - pull size
@ -249,10 +280,11 @@ sub ParseElementPullScalar($$$)
#####################################################################
# parse buffers in a structure element
sub ParseElementPushBuffer($$)
sub ParseElementPushBuffer($$$)
{
my($e) = shift;
my($var_prefix) = shift;
my($ndr_flags) = shift;
my $cprefix = util::c_push_prefix($e);
if (util::is_pure_scalar($e)) {
@ -265,10 +297,16 @@ sub ParseElementPushBuffer($$)
if (util::array_size($e)) {
ParseArrayPush($e, "r->");
} elsif (my $switch = util::has_property($e, "switch_is")) {
if ($e->{POINTERS}) {
ParseElementPushSwitch($e, $var_prefix, "NDR_BUFFERS|NDR_SCALARS", $switch);
} else {
ParseElementPushSwitch($e, $var_prefix, "NDR_BUFFERS", $switch);
}
} elsif (util::is_builtin_type($e->{TYPE})) {
$res .= "\t\tNDR_CHECK(ndr_push_$e->{TYPE}(ndr, $cprefix$var_prefix$e->{NAME}));\n";
} else {
$res .= "\t\tNDR_CHECK(ndr_push_$e->{TYPE}(ndr, ndr_flags, $cprefix$var_prefix$e->{NAME}));\n";
$res .= "\t\tNDR_CHECK(ndr_push_$e->{TYPE}(ndr, $ndr_flags, $cprefix$var_prefix$e->{NAME}));\n";
}
if (util::need_wire_pointer($e)) {
@ -294,6 +332,8 @@ sub ParseElementPrintBuffer($$)
if (util::array_size($e)) {
ParseArrayPrint($e, "r->");
} elsif (my $switch = util::has_property($e, "switch_is")) {
ParseElementPrintSwitch($e, $var_prefix, $switch);
} else {
$res .= "\t\tndr_print_$e->{TYPE}(ndr, \"$e->{NAME}\", $cprefix$var_prefix$e->{NAME});\n";
}
@ -324,7 +364,11 @@ sub ParseElementPullBuffer($$$)
if (util::array_size($e)) {
ParseArrayPull($e, "r->");
} elsif (my $switch = util::has_property($e, "switch_is")) {
ParseElementPullSwitch($e, $var_prefix, $ndr_flags, $switch);
if ($e->{POINTERS}) {
ParseElementPullSwitch($e, $var_prefix, "NDR_SCALARS|NDR_BUFFERS", $switch);
} else {
ParseElementPullSwitch($e, $var_prefix, "NDR_BUFFERS", $switch);
}
} elsif (util::is_builtin_type($e->{TYPE})) {
$res .= "\t\tNDR_CHECK(ndr_pull_$e->{TYPE}(ndr, $cprefix$var_prefix$e->{NAME}));\n";
} elsif ($e->{POINTERS}) {
@ -393,7 +437,7 @@ sub ParseStructPush($)
$res .= "buffers:\n";
$res .= "\tif (!(ndr_flags & NDR_BUFFERS)) goto done;\n";
foreach my $e (@{$struct->{ELEMENTS}}) {
ParseElementPushBuffer($e, "r->");
ParseElementPushBuffer($e, "r->", "ndr_flags");
}
if (defined $struct_len) {
@ -510,7 +554,29 @@ sub ParseStructPull($)
sub ParseUnionPush($)
{
my $e = shift;
print "WARNING! union push not done\n";
$res .= "\tif (!(ndr_flags & NDR_SCALARS)) goto buffers;\n";
$res .= "\tNDR_CHECK(ndr_push_uint16(ndr, level));\n";
$res .= "\tswitch (level) {\n";
foreach my $el (@{$e->{DATA}}) {
$res .= "\tcase $el->{CASE}:\n";
ParseElementPushScalar($el->{DATA}, "r->", "NDR_SCALARS");
$res .= "\tbreak;\n\n";
}
$res .= "\tdefault:\n";
$res .= "\t\treturn ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);\n";
$res .= "\t}\n";
$res .= "buffers:\n";
$res .= "\tif (!(ndr_flags & NDR_BUFFERS)) goto done;\n";
$res .= "\tswitch (level) {\n";
foreach my $el (@{$e->{DATA}}) {
$res .= "\tcase $el->{CASE}:\n";
ParseElementPushBuffer($el->{DATA}, "r->", "ndr_flags");
$res .= "\tbreak;\n\n";
}
$res .= "\tdefault:\n";
$res .= "\t\treturn ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);\n";
$res .= "\t}\n";
$res .= "done:\n";
}
#####################################################################
@ -535,8 +601,8 @@ sub ParseUnionPull($)
{
my $e = shift;
$res .= "\tNDR_CHECK(ndr_pull_uint16(ndr, level));\n";
$res .= "\tif (!(ndr_flags & NDR_SCALARS)) goto buffers;\n";
$res .= "\tNDR_CHECK(ndr_pull_uint16(ndr, level));\n";
$res .= "\tswitch (*level) {\n";
foreach my $el (@{$e->{DATA}}) {
$res .= "\tcase $el->{CASE}:\n";
@ -544,7 +610,7 @@ sub ParseUnionPull($)
$res .= "\tbreak;\n\n";
}
$res .= "\tdefault:\n";
$res .= "\t\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value %u in $e->{NAME}\", *level);\n";
$res .= "\t\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", *level);\n";
$res .= "\t}\n";
$res .= "buffers:\n";
$res .= "\tif (!(ndr_flags & NDR_BUFFERS)) goto done;\n";
@ -555,7 +621,7 @@ sub ParseUnionPull($)
$res .= "\tbreak;\n\n";
}
$res .= "\tdefault:\n";
$res .= "\t\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value %u in $e->{NAME}\", *level);\n";
$res .= "\t\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", *level);\n";
$res .= "\t}\n";
$res .= "done:\n";
}
@ -705,7 +771,7 @@ sub ParseFunctionPush($)
$res .= "\t}\n";
} else {
ParseElementPushScalar($e, "r->in.", "NDR_SCALARS|NDR_BUFFERS");
ParseElementPushBuffer($e, "r->in.");
ParseElementPushBuffer($e, "r->in.", "NDR_SCALARS|NDR_BUFFERS");
}
}
}
@ -756,25 +822,6 @@ sub ParseFunctionPull($)
$res .= "\n\treturn NT_STATUS_OK;\n}\n\n";
}
#####################################################################
# parse a typedef
sub ParseTypedef($)
{
my($e) = shift;
ParseTypedefPush($e);
ParseTypedefPull($e);
ParseTypedefPrint($e);
}
#####################################################################
# parse a function
sub ParseFunction($)
{
my $i = shift;
ParseFunctionPush($i);
ParseFunctionPull($i);
}
#####################################################################
# parse the interface definitions
sub ParseInterface($)
@ -783,9 +830,19 @@ sub ParseInterface($)
my($data) = $interface->{DATA};
foreach my $d (@{$data}) {
($d->{TYPE} eq "TYPEDEF") &&
ParseTypedef($d);
ParseTypedefPush($d);
($d->{TYPE} eq "FUNCTION") &&
ParseFunction($d);
ParseFunctionPush($d);
}
foreach my $d (@{$data}) {
($d->{TYPE} eq "TYPEDEF") &&
ParseTypedefPull($d);
($d->{TYPE} eq "FUNCTION") &&
ParseFunctionPull($d);
}
foreach my $d (@{$data}) {
($d->{TYPE} eq "TYPEDEF") &&
ParseTypedefPrint($d);
}
}