summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2003-11-18 03:25:51 +0000
committerAndrew Tridgell <tridge@samba.org>2003-11-18 03:25:51 +0000
commitcb22240eb4f58936fb0e5f9d97ae23099c11c31a (patch)
tree26565f4e43bd486b9658429231c64edc9bc29285 /source4
parentca20fa105795a600fc1e2ee56813fb0bb3b83c9f (diff)
downloadsamba-cb22240eb4f58936fb0e5f9d97ae23099c11c31a.tar.gz
samba-cb22240eb4f58936fb0e5f9d97ae23099c11c31a.tar.bz2
samba-cb22240eb4f58936fb0e5f9d97ae23099c11c31a.zip
support the 'default' case in IDL unions
(This used to be commit 7f3f274cdc0f22324049952f2b744902a6fdf652)
Diffstat (limited to 'source4')
-rw-r--r--source4/build/pidl/idl.gram10
-rw-r--r--source4/build/pidl/parser.pm68
2 files changed, 62 insertions, 16 deletions
diff --git a/source4/build/pidl/idl.gram b/source4/build/pidl/idl.gram
index 1a44f6e908..69a6e2458b 100644
--- a/source4/build/pidl/idl.gram
+++ b/source4/build/pidl/idl.gram
@@ -66,6 +66,12 @@ union_element: '[' 'case' '(' constant ')' ']' base_element ';'
"CASE" => $item{constant},
"DATA" => $item{base_element}
}}
+ | 'default' base_element ';'
+ {{
+ "TYPE" => "UNION_ELEMENT",
+ "CASE" => "default",
+ "DATA" => $item{base_element}
+ }}
base_element: property_list(s?) type pointer(s?) identifier array_len(?)
{{
@@ -82,8 +88,8 @@ array_len:
{ "*" }
| '[' '*' ']'
{ "*" }
- | '[' <commit> text ']'
- { "$item{text}" }
+ | '[' <commit> anytext ']'
+ { "$item{anytext}" }
| <error?>
element_list1: base_element(s? /;/) ';'
diff --git a/source4/build/pidl/parser.pm b/source4/build/pidl/parser.pm
index 1d3e772298..5a39903b8f 100644
--- a/source4/build/pidl/parser.pm
+++ b/source4/build/pidl/parser.pm
@@ -40,6 +40,10 @@ sub find_size_var($$)
if (util::is_constant($size)) {
return $size;
}
+
+ if ($size =~ /ndr->/) {
+ return $size;
+ }
if ($fn->{TYPE} ne "FUNCTION") {
return "r->$size";
@@ -582,6 +586,7 @@ sub ParseStructPull($)
sub ParseUnionPush($)
{
my $e = shift;
+ my $have_default = 0;
$res .= "\tif (!(ndr_flags & NDR_SCALARS)) goto buffers;\n";
$res .= "\tNDR_CHECK(ndr_push_struct_start(ndr));\n";
@@ -591,24 +596,37 @@ sub ParseUnionPush($)
}
$res .= "\tswitch (level) {\n";
foreach my $el (@{$e->{DATA}}) {
- $res .= "\tcase $el->{CASE}:\n";
+ if ($el->{CASE} eq "default") {
+ $res .= "\tdefault:\n";
+ $have_default = 1;
+ } else {
+ $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";
+ if (! $have_default) {
+ $res .= "\tdefault:\n";
+ $res .= "\t\treturn ndr_push_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", level);\n";
+ }
$res .= "\t}\n";
$res .= "\tndr_push_struct_end(ndr);\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";
+ if ($el->{CASE} eq "default") {
+ $res .= "\tdefault:\n";
+ } else {
+ $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";
+ if (! $have_default) {
+ $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";
}
@@ -618,14 +636,22 @@ sub ParseUnionPush($)
sub ParseUnionPrint($)
{
my $e = shift;
+ my $have_default = 0;
$res .= "\tswitch (level) {\n";
foreach my $el (@{$e->{DATA}}) {
- $res .= "\tcase $el->{CASE}:\n";
+ if ($el->{CASE} eq "default") {
+ $have_default = 1;
+ $res .= "\tdefault:\n";
+ } else {
+ $res .= "\tcase $el->{CASE}:\n";
+ }
ParseElementPrintScalar($el->{DATA}, "r->");
$res .= "\tbreak;\n\n";
}
- $res .= "\tdefault:\n\t\tndr_print_bad_level(ndr, name, level);\n";
+ if (! $have_default) {
+ $res .= "\tdefault:\n\t\tndr_print_bad_level(ndr, name, level);\n";
+ }
$res .= "\t}\n";
}
@@ -634,6 +660,7 @@ sub ParseUnionPrint($)
sub ParseUnionPull($)
{
my $e = shift;
+ my $have_default = 0;
$res .= "\tif (!(ndr_flags & NDR_SCALARS)) goto buffers;\n";
@@ -644,7 +671,12 @@ sub ParseUnionPull($)
}
$res .= "\tswitch (*level) {\n";
foreach my $el (@{$e->{DATA}}) {
- $res .= "\tcase $el->{CASE}: {\n";
+ if ($el->{CASE} eq "default") {
+ $res .= "\tdefault: {\n";
+ $have_default = 1;
+ } else {
+ $res .= "\tcase $el->{CASE}: {\n";
+ }
my $e2 = $el->{DATA};
if ($e2->{POINTERS}) {
$res .= "\t\tuint32 _ptr_$e2->{NAME};\n";
@@ -652,20 +684,28 @@ sub ParseUnionPull($)
ParseElementPullScalar($el->{DATA}, "r->", "NDR_SCALARS");
$res .= "\tbreak; }\n\n";
}
- $res .= "\tdefault:\n";
- $res .= "\t\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", *level);\n";
+ if (! $have_default) {
+ $res .= "\tdefault:\n";
+ $res .= "\t\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", *level);\n";
+ }
$res .= "\t}\n";
$res .= "\tndr_pull_struct_end(ndr);\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";
+ if ($el->{CASE} eq "default") {
+ $res .= "\tdefault:\n";
+ } else {
+ $res .= "\tcase $el->{CASE}:\n";
+ }
ParseElementPullBuffer($el->{DATA}, "r->", "NDR_BUFFERS");
$res .= "\tbreak;\n\n";
}
- $res .= "\tdefault:\n";
- $res .= "\t\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", *level);\n";
+ if (! $have_default) {
+ $res .= "\tdefault:\n";
+ $res .= "\t\treturn ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, \"Bad switch value \%u\", *level);\n";
+ }
$res .= "\t}\n";
$res .= "done:\n";
}