pidl/Samba4::NDR::Parser: correctly get the name of an array element
authorStefan Metzmacher <metze@samba.org>
Thu, 31 Jan 2008 13:57:35 +0000 (14:57 +0100)
committerStefan Metzmacher <metze@samba.org>
Sat, 2 Feb 2008 10:16:09 +0000 (11:16 +0100)
When we have "*r->out.ous"
(char ***ous, a pointer to a pointer to an array of pointers).
we need to use "(*r->out.ous)[3]" to access the 3rd
element of the array "*r->out.ous[3]" was generated before,
but that's the same as "*(r->out.ous[3])" which would mean
the array would apply to a different level.

This patch prepares support for:

[out,ref,size_is(,num)] [string,charset(UTF16)] uint16 ***names;

It means a [ref] pointer to a [unique] pointer to an array
of [unique] pointers which point to an UTF16 string.

metze

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

index bd7b16812ce1b7d626d51d82321bfb1bf986b885..9deb6ee1779ab3beac27f24ea734b74f8c8f6266 100644 (file)
@@ -6,7 +6,7 @@ package Parse::Pidl::CUtil;
 
 require Exporter;
 @ISA = qw(Exporter);
-@EXPORT = qw(get_pointer_to get_value_of);
+@EXPORT = qw(get_pointer_to get_value_of get_array_element);
 use vars qw($VERSION);
 $VERSION = '0.01';
 
@@ -36,4 +36,17 @@ sub get_value_of($)
        }
 }
 
+sub get_array_element($$)
+{
+       my ($var_name, $idx) = @_;
+
+       if ($var_name =~ /^\*.*$/) {
+               $var_name = "($var_name)";
+       } elsif ($var_name =~ /^\&.*$/) {
+               $var_name = "($var_name)";
+       }
+
+       return "$var_name"."[$idx]";
+}
+
 1;
index 281018d4ccb9a1214cdda183a01d0bfdb37e1da4..81a8bf88cde648a1d20f95d8bd1180fb36b67f3e 100644 (file)
@@ -14,7 +14,7 @@ require Exporter;
 use strict;
 use Parse::Pidl::Typelist qw(hasType getType mapTypeName typeHasBody);
 use Parse::Pidl::Util qw(has_property ParseExpr ParseExprExt print_uuid);
-use Parse::Pidl::CUtil qw(get_pointer_to get_value_of);
+use Parse::Pidl::CUtil qw(get_pointer_to get_value_of get_array_element);
 use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred is_charset_array);
 use Parse::Pidl::Samba4 qw(is_intree choose_header);
 use Parse::Pidl::Samba4::Header qw(GenerateFunctionInEnv GenerateFunctionOutEnv EnvSubstituteValue GenerateStructEnv);
@@ -584,7 +584,7 @@ sub ParseElementPushLevel
                my $length = ParseExpr($l->{LENGTH_IS}, $env, $e->{ORIGINAL});
                my $counter = "cntr_$e->{NAME}_$l->{LEVEL_INDEX}";
 
-               $var_name = $var_name . "[$counter]";
+               $var_name = get_array_element($var_name, $counter);
 
                if (($primitives and not $l->{IS_DEFERRED}) or ($deferred and $l->{IS_DEFERRED})) {
                        $self->pidl("for ($counter = 0; $counter < $length; $counter++) {");
@@ -779,7 +779,7 @@ sub ParseElementPrint($$$$)
                                $self->pidl("if (idx_$l->{LEVEL_INDEX}) {");
                                $self->indent;
 
-                               $var_name = $var_name . "[$counter]";
+                               $var_name = get_array_element($var_name, $counter);
                        }
                } elsif ($l->{TYPE} eq "DATA") {
                        $self->ParseDataPrint($e, $l, $var_name);
@@ -1048,7 +1048,7 @@ sub ParseElementPullLevel
                my $counter = "cntr_$e->{NAME}_$l->{LEVEL_INDEX}";
                my $array_name = $var_name;
 
-               $var_name = $var_name . "[$counter]";
+               $var_name = get_array_element($var_name, $counter);
 
                $self->ParseMemCtxPullStart($e, $l, $array_name);