r24518: get rid of using ->{ORIGINAL} and move stuff
authorStefan Metzmacher <metze@samba.org>
Fri, 17 Aug 2007 13:01:51 +0000 (13:01 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 20:02:08 +0000 (15:02 -0500)
into subfunctions

metze
(This used to be commit ff7fa11e70018e9691441d824483b803781943a7)

source4/pidl/lib/Parse/Pidl/Samba4.pm

index 326ac837513f46d6d985c8268b650e2297d976b8..ebe74d488da130cbcda6235b4efff96cb9fa6f4c 100644 (file)
@@ -10,6 +10,7 @@ require Exporter;
 @EXPORT = qw(is_intree choose_header DeclLong);
 
 use Parse::Pidl::Util qw(has_property is_constant);
+use Parse::Pidl::NDR qw(GetNextLevel);
 use Parse::Pidl::Typelist qw(mapTypeName scalar_is_reference);
 use strict;
 
@@ -34,40 +35,84 @@ sub choose_header($$)
        return "#include <$out>";
 }
 
+sub NumStars($;$)
+{
+       my ($e, $d) = @_;
+       $d = 0 unless defined($d);
+       my $n = 0;
+
+       foreach my $l (@{$e->{LEVELS}}) {
+               next unless ($l->{TYPE} eq "POINTER");
+
+               my $nl = GetNextLevel($e, $l);
+               next if (defined($nl) and $nl->{TYPE} eq "ARRAY");
+
+               $n++;
+       }
+
+       if ($n >= 1) {
+               $n-- if (scalar_is_reference($e->{TYPE}));
+       }
+
+       foreach my $l (@{$e->{LEVELS}}) {
+               next unless ($l->{TYPE} eq "ARRAY");
+               next if ($l->{IS_FIXED}) and not has_property($e, "charset");
+               $n++;
+       }
+
+       fatal($e->{ORIGINAL}, "Too few pointers $n < $d") if ($n < $d);
+
+       $n -= $d;
+
+       return $n;
+}
+
+sub ElementStars($;$)
+{
+       my ($e, $d) = @_;
+       my $res = "";
+       my $n = 0;
+
+       $n = NumStars($e, $d);
+       $res .= "*" foreach (1..$n);
+
+       return $res;
+}
+
+sub ArrayBrackets($)
+{
+       my ($e) = @_;
+       my $res = "";
+
+       foreach my $l (@{$e->{LEVELS}}) {
+               next unless ($l->{TYPE} eq "ARRAY");
+               next unless ($l->{IS_FIXED}) and not has_property($e, "charset");
+               $res .= "[$l->{SIZE_IS}]";
+       }
+
+       return $res;
+}
+
 sub DeclLong($)
 {
-       my($element) = shift;
-       my $ret = "";
+       my ($e, $d) = shift;
+       my $res = "";
 
-       if (has_property($element, "represent_as")) {
-               $ret.=mapTypeName($element->{PROPERTIES}->{represent_as})." ";
+       if (has_property($e, "represent_as")) {
+               $res .= mapTypeName($e->{PROPERTIES}->{represent_as})." ";
        } else {
-               if (has_property($element, "charset")) {
-                       $ret.="const char";
+               if (has_property($e, "charset")) {
+                       $res .= "const char ";
                } else {
-                       $ret.=mapTypeName($element->{TYPE});
+                       $res .= mapTypeName($e->{TYPE})." ";
                }
 
-               $ret.=" ";
-               my $numstar = $element->{ORIGINAL}->{POINTERS};
-               if ($numstar >= 1) {
-                       $numstar-- if scalar_is_reference($element->{TYPE});
-               }
-               foreach (@{$element->{ORIGINAL}->{ARRAY_LEN}})
-               {
-                       next if is_constant($_) and 
-                               not has_property($element, "charset");
-                       $numstar++;
-               }
-               $ret.="*" foreach (1..$numstar);
-       }
-       $ret.=$element->{NAME};
-       foreach (@{$element->{ORIGINAL}->{ARRAY_LEN}}) {
-               next unless (is_constant($_) and not has_property($element, "charset"));
-               $ret.="[$_]";
+               $res .= ElementStars($e);
        }
+       $res .= $e->{NAME};
+       $res .= ArrayBrackets($e);
 
-       return $ret;
+       return $res;
 }
 
 1;