pidl:NDR/Parser: allow [string,size_of()] together
authorStefan Metzmacher <metze@samba.org>
Mon, 1 Aug 2011 13:17:41 +0000 (15:17 +0200)
committerStefan Metzmacher <metze@samba.org>
Mon, 1 Aug 2011 13:46:11 +0000 (15:46 +0200)
metze

pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm

index 406fc02cec5cfbbe4d696bdb73f37d8f3f1408c9..3d31366abf7ab82965895dccdab5ea8a03c0fc80 100644 (file)
@@ -198,6 +198,12 @@ sub ParseArrayPushHeader($$$$$$)
                } else {
                        $size = $length = "ndr_string_length($var_name, sizeof(*$var_name))";
                }
+               if (defined($l->{SIZE_IS})) {
+                       $size = ParseExpr($l->{SIZE_IS}, $env, $e);
+               }
+               if (defined($l->{LENGTH_IS})) {
+                       $length = ParseExpr($l->{LENGTH_IS}, $env, $e);
+               }
        } else {
                $size = ParseExpr($l->{SIZE_IS}, $env, $e);
                $length = ParseExpr($l->{LENGTH_IS}, $env, $e);
@@ -352,7 +358,7 @@ sub ParseArrayPullHeader($$$$$$)
                $self->pidl("}");
        }
 
-       if ($l->{IS_CONFORMANT} and not $l->{IS_ZERO_TERMINATED}) {
+       if ($l->{IS_CONFORMANT} and (defined($l->{SIZE_IS}) or not $l->{IS_ZERO_TERMINATED})) {
                $self->defer("if ($var_name) {");
                $self->defer_indent;
                my $size = ParseExprExt($l->{SIZE_IS}, $env, $e->{ORIGINAL},
@@ -364,7 +370,7 @@ sub ParseArrayPullHeader($$$$$$)
                $self->defer("}");
        }
 
-       if ($l->{IS_VARYING} and not $l->{IS_ZERO_TERMINATED}) {
+       if ($l->{IS_VARYING} and (defined($l->{LENGTH_IS}) or not $l->{IS_ZERO_TERMINATED})) {
                $self->defer("if ($var_name) {");
                $self->defer_indent;
                my $length = ParseExprExt($l->{LENGTH_IS}, $env, $e->{ORIGINAL}, 
@@ -775,7 +781,7 @@ sub ParseElementPrint($$$$$)
                                $var_name = get_pointer_to($var_name); 
                        }
                        
-                       if ($l->{IS_ZERO_TERMINATED}) {
+                       if ($l->{IS_ZERO_TERMINATED} and not defined($l->{LENGTH_IS})) {
                                $length = "ndr_string_length($var_name, sizeof(*$var_name))";
                        } else {
                                $length = ParseExprExt($l->{LENGTH_IS}, $env, $e->{ORIGINAL}, 
@@ -1273,6 +1279,9 @@ sub ParseStructPushPrimitives($$$$$)
                                } else {
                                        $size = "ndr_string_length($varname->$e->{NAME}, sizeof(*$varname->$e->{NAME}))";
                                }
+                               if (defined($e->{LEVELS}[0]->{SIZE_IS})) {
+                                       $size = ParseExpr($e->{LEVELS}[0]->{SIZE_IS}, $env, $e->{ORIGINAL});
+                               }
                        } else {
                                $size = ParseExpr($e->{LEVELS}[0]->{SIZE_IS}, $env, $e->{ORIGINAL});
                        }