Merge branch 'v4-0-test' of ssh://git.samba.org/data/git/samba into v4-0-python
[ira/wip.git] / source4 / pidl / lib / Parse / Pidl / Typelist.pm
index 72c4b18d0bfb7b1ad3068b4bc3ced982d3858356..8ba1ae47afbb3ed6feddc0b7ba2c571bf266cf4e 100644 (file)
@@ -7,9 +7,9 @@ package Parse::Pidl::Typelist;
 
 require Exporter;
 @ISA = qw(Exporter);
-@EXPORT_OK = qw(hasType getType mapTypeName scalar_is_reference expandAlias
+@EXPORT_OK = qw(hasType getType resolveType mapTypeName scalar_is_reference expandAlias
                            mapScalarType addType typeIs is_scalar enum_type_fn
-                               bitmap_type_fn mapType
+                               bitmap_type_fn mapType typeHasBody
 );
 use vars qw($VERSION);
 $VERSION = '0.01';
@@ -59,6 +59,7 @@ my %aliases = (
        "boolean8" => "uint8",
        "boolean32" => "uint32",
        "DWORD" => "uint32",
+       "uint" => "uint32",
        "int" => "int32",
        "WORD" => "uint16",
        "char" => "uint8",
@@ -95,6 +96,20 @@ sub addType($)
        $types{$t->{NAME}} = $t;
 }
 
+sub resolveType($)
+{
+       my ($ctype) = @_;
+
+       if (not hasType($ctype)) {
+               # assume struct typedef
+               return { TYPE => "TYPEDEF", NAME => $ctype, DATA => { TYPE => "STRUCT" } };
+       } else {
+               return getType($ctype);
+       }
+
+       return $ctype;
+}
+
 sub getType($)
 {
        my $t = shift;
@@ -132,9 +147,12 @@ sub hasType($)
 
 sub is_scalar($)
 {
+       sub is_scalar($);
        my $type = shift;
 
-       return 1 if (ref($type) eq "HASH" and $type->{TYPE} eq "SCALAR");
+       return 1 if (ref($type) eq "HASH" and 
+               ($type->{TYPE} eq "SCALAR" or $type->{TYPE} eq "ENUM" or 
+                $type->{TYPE} eq "BITMAP"));
 
        if (my $dt = getType($type)) {
                return is_scalar($dt->{DATA}) if ($dt->{TYPE} eq "TYPEDEF");
@@ -148,7 +166,7 @@ sub is_scalar($)
 sub scalar_is_reference($)
 {
        my $name = shift;
-       
+
        return 1 if (grep(/^$name$/, @reference_scalars));
        return 0;
 }
@@ -172,8 +190,18 @@ sub enum_type_fn($)
 {
        my $enum = shift;
        $enum->{TYPE} eq "ENUM" or die("not an enum");
-       if (has_property($enum->{PARENT}, "enum8bit")) {
+
+       # for typedef enum { } we need to check $enum->{PARENT}
+       if (has_property($enum, "enum8bit")) {
+               return "uint8";
+       } elsif (has_property($enum, "enum16bit")) {
+               return "uint16";
+       } elsif (has_property($enum, "v1_enum")) {
+               return "uint32";
+       } elsif (has_property($enum->{PARENT}, "enum8bit")) {
                return "uint8";
+       } elsif (has_property($enum->{PARENT}, "enum16bit")) {
+               return "uint16";
        } elsif (has_property($enum->{PARENT}, "v1_enum")) {
                return "uint32";
        }
@@ -196,13 +224,25 @@ sub bitmap_type_fn($)
        return "uint32";
 }
 
+sub typeHasBody($)
+{
+       sub typeHasBody($);
+       my ($e) = @_;
+
+       if ($e->{TYPE} eq "TYPEDEF") {
+               return 0 unless(defined($e->{DATA}));
+               return typeHasBody($e->{DATA});
+       }
+
+       return defined($e->{ELEMENTS});
+}
+
 sub mapType($$)
 {
        sub mapType($$);
        my ($t, $n) = @_;
 
        return mapType($t->{DATA}, $n) if ($t->{TYPE} eq "TYPEDEF");
-       return mapType($t->{DATA}, $n) if ($t->{TYPE} eq "DECLARE");
        return mapScalarType($n) if ($t->{TYPE} eq "SCALAR");
        return "enum $n" if ($t->{TYPE} eq "ENUM");
        return "struct $n" if ($t->{TYPE} eq "STRUCT");
@@ -228,7 +268,7 @@ sub mapTypeName($)
 
 sub LoadIdl($)
 {
-       my $idl = shift;
+       my ($idl) = @_;
 
        foreach my $x (@{$idl}) {
                next if $x->{TYPE} ne "INTERFACE";
@@ -236,7 +276,6 @@ sub LoadIdl($)
                foreach my $y (@{$x->{DATA}}) {
                        addType($y) if (
                                $y->{TYPE} eq "TYPEDEF" 
-                            or $y->{TYPE} eq "DECLARE" 
                                 or $y->{TYPE} eq "UNION"
                                 or $y->{TYPE} eq "STRUCT"
                         or $y->{TYPE} eq "ENUM"
@@ -245,6 +284,11 @@ sub LoadIdl($)
        }
 }
 
+sub GenerateTypeLib()
+{
+       return Parse::Pidl::Util::MyDumper(\%types);
+}
+
 RegisterScalars();
 
 1;