automatic printing of unions
authorAndrew Tridgell <tridge@samba.org>
Tue, 11 Nov 2003 04:38:10 +0000 (04:38 +0000)
committerAndrew Tridgell <tridge@samba.org>
Tue, 11 Nov 2003 04:38:10 +0000 (04:38 +0000)
(This used to be commit 73b530075589f24f7bb9a001fde979ec6930d2bb)

source4/build/pidl/parser.pm
source4/build/pidl/util.pm

index 19e6dc26f4e74dbc99e00d88f15e3c247384191f..b52026a8d3511e83e837ca39142ffa6ea041f128 100644 (file)
@@ -138,7 +138,7 @@ sub ParseElementPrintScalar($$)
 
        if (defined $e->{VALUE}) {
                $res .= "\tndr_print_$e->{TYPE}(ndr, \"$e->{NAME}\", $e->{VALUE});\n";
-       } elsif (util::need_wire_pointer($e)) {
+       } elsif (util::has_direct_buffers($e)) {
                $res .= "\tndr_print_ptr(ndr, \"$e->{NAME}\", $var_prefix$e->{NAME});\n";
                $res .= "\tndr->depth++;\n";
                ParseElementPrintBuffer($e, "r->");
@@ -343,8 +343,6 @@ sub ParseStructPrint($)
 {
        my($struct) = shift;
 
-       $res .= "\tndr_print_struct(ndr, name);\n";
-
        if (! defined $struct->{ELEMENTS}) {
                return;
        }
@@ -430,7 +428,15 @@ sub ParseUnionPush($)
 sub ParseUnionPrint($)
 {
        my $e = shift;
-       print "WARNING! union print not done\n";        
+
+       $res .= "\tswitch (level) {\n";
+       foreach my $el (@{$e->{DATA}}) {
+               $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";
+       $res .= "\t}\n";
 }
 
 #####################################################################
@@ -438,7 +444,6 @@ sub ParseUnionPrint($)
 sub ParseUnionPull($)
 {
        my $e = shift;
-       print "union pull not done\n";  
 
        $res .= "\tNDR_CHECK(ndr_pull_uint16(ndr, level));\n";
        $res .= "\tif (!(ndr_flags & NDR_SCALARS)) goto buffers;\n";
@@ -572,6 +577,7 @@ sub ParseTypedefPrint($)
        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";
+               $res .= "\tndr_print_struct(ndr, name, \"$e->{NAME}\");\n";
                ParseTypePrint($e->{DATA});
                $res .= "}\n\n";
        }
@@ -579,6 +585,7 @@ sub ParseTypedefPrint($)
        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";
+               $res .= "\tndr_print_union(ndr, name, level, \"$e->{NAME}\");\n";
                ParseTypePrint($e->{DATA});
                $res .= "}\n\n";
        }
index 910684a919561a4f22c1f5a2ea1b198f12e9ef19..17d1d146abf56cb6625d80882479e76dc0e0dfcf 100644 (file)
@@ -307,5 +307,15 @@ sub c_pull_prefix($)
        return "";
 }
 
+# determine if an element has a direct buffers component
+sub has_direct_buffers($)
+{
+       my $e = shift;
+       if ($e->{POINTERS} || array_size($e)) {
+               return 1;
+       }
+       return 0;
+}
+
 1;