r6973: Merge new version of pidl into the main SAMBA_4_0 branch.
[sfrench/samba-autobuild/.git] / source4 / build / pidl / typelist.pm
index 8559878a694f6d2e2baeaf49bd1b1cf0002eb64e..f5a06500061bb0bdb0904325cefffef6b000ec3e 100644 (file)
@@ -9,147 +9,6 @@ use strict;
 
 my %typedefs = ();
 
-# a list of known scalar types
-my $scalars = {
-       # 0 byte types
-       "void"          => {
-                               C_TYPE          => "void",
-                               NDR_ALIGN       => 0
-                       },
-
-       # 1 byte types
-       "char"          => {
-                               C_TYPE          => "char",
-                               NDR_ALIGN       => 1
-                       },
-       "int8"          => {
-                               C_TYPE          => "int8_t",
-                               NDR_ALIGN       => 1
-                       },
-       "uint8"         => {
-                               C_TYPE          => "uint8_t",
-                               NDR_ALIGN       => 1
-                       },
-
-       # 2 byte types
-       "int16"         => {
-                               C_TYPE          => "int16_t",
-                               NDR_ALIGN       => 2
-                       },
-       "uint16"        => {    C_TYPE          => "uint16_t",
-                               NDR_ALIGN       => 2
-                       },
-
-       # 4 byte types
-       "int32"         => {
-                               C_TYPE          => "int32_t",
-                               NDR_ALIGN       => 4
-                       },
-       "uint32"        => {    C_TYPE          => "uint32_t",
-                               NDR_ALIGN       => 4
-                       },
-
-       # 8 byte types
-       "int64"         => {
-                               C_TYPE          => "int64_t",
-                               NDR_ALIGN       => 8
-                       },
-       "hyper"         => {
-                               C_TYPE          => "uint64_t",
-                               NDR_ALIGN       => 8
-                       },
-       "dlong"         => {
-                               C_TYPE          => "int64_t",
-                               NDR_ALIGN       => 4
-                       },
-       "udlong"        => {
-                               C_TYPE          => "uint64_t",
-                               NDR_ALIGN       => 4
-                       },
-       "udlongr"       => {
-                               C_TYPE          => "uint64_t",
-                               NDR_ALIGN       => 4
-                       },
-
-       # DATA_BLOB types
-       "DATA_BLOB"     => {
-                               C_TYPE          => "DATA_BLOB",
-                               NDR_ALIGN       => 4
-                       },
-
-       # string types
-       "string"        => {
-                               C_TYPE          => "const char *",
-                               NDR_ALIGN       => 4 #???
-                       },
-       "string_array"  => {
-                               C_TYPE          => "const char **",
-                               NDR_ALIGN       => 4 #???
-                       },
-
-       # time types
-       "time_t"        => {
-                               C_TYPE          => "time_t",
-                               NDR_ALIGN       => 4
-                       },
-       "NTTIME"        => {
-                               C_TYPE          => "NTTIME",
-                               NDR_ALIGN       => 4
-                       },
-       "NTTIME_1sec"   => {
-                               C_TYPE          => "NTTIME",
-                               NDR_ALIGN       => 4
-                       },
-       "NTTIME_hyper"  => {
-                               C_TYPE          => "NTTIME",
-                               NDR_ALIGN       => 8
-                       },
-
-
-       # error code types
-       "WERROR"        => {
-                               C_TYPE          => "WERROR",
-                               NDR_ALIGN       => 4
-                       },
-       "NTSTATUS"      => {
-                               C_TYPE          => "NTSTATUS",
-                               NDR_ALIGN       => 4
-                       },
-
-       # special types
-       "nbt_string"    => {
-                               C_TYPE          => "const char *",
-                               NDR_ALIGN       => 4 #???
-                       },
-       "ipv4address"   => {
-                               C_TYPE          => "const char *",
-                               NDR_ALIGN       => 4
-                       }
-};
-
-# map from a IDL type to a C header type
-sub mapScalarType($)
-{
-       my $name = shift;
-
-       # it's a bug when a type is not in the list
-       # of known scalars or has no mapping
-       return $scalars->{$name}{C_TYPE} if defined($scalars->{$name}) and defined($scalars->{$name}{C_TYPE});
-
-       die("Unknown scalar type $name");
-}
-
-sub getScalarAlignment($)
-{
-       my $name = shift;
-
-       # it's a bug when a type is not in the list
-       # of known scalars or has no mapping
-       return $scalars->{$name}{NDR_ALIGN} if defined($scalars->{$name}) and defined($scalars->{$name}{NDR_ALIGN});
-
-       die("Unknown scalar type $name");
-}
-
 sub addType($)
 {
        my $t = shift;
@@ -159,7 +18,7 @@ sub addType($)
 sub getType($)
 {
        my $t = shift;
-       return undef unless(defined($typedefs{$t}));
+       return undef if not hasType($t);
        return $typedefs{$t};
 }
 
@@ -179,9 +38,17 @@ sub hasType($)
        return 0;
 }
 
-sub RegisterScalars()
+sub RegisterPrimitives()
 {
-       foreach my $k (keys %{$scalars}) {
+       my @primitives = (
+               "char", "int8", "uint8", "short", "wchar_t", 
+               "int16", "uint16", "long", "int32", "uint32", 
+               "dlong", "udlong", "udlongr", "NTTIME", "NTTIME_1sec", 
+               "time_t", "DATA_BLOB", "error_status_t", "WERROR", 
+               "NTSTATUS", "boolean32", "unsigned32", "ipv4address", 
+               "hyper", "NTTIME_hyper");
+               
+       foreach my $k (@primitives) {
                $typedefs{$k} = {
                        NAME => $k,
                        TYPE => "TYPEDEF",
@@ -218,25 +85,66 @@ sub bitmap_type_fn($)
        return "uint32";
 }
 
+# provide mappings between IDL base types and types in our headers
+my %scalar_type_mappings = 
+    (
+     "int8"         => "int8_t",
+     "uint8"        => "uint8_t",
+     "short"        => "int16_t",
+     "wchar_t"      => "uint16_t",
+     "int16"        => "int16_t",
+     "uint16"       => "uint16_t",
+     "int32"        => "int32_t",
+     "uint32"       => "uint32_t",
+     "int64"        => "int64_t",
+     "dlong"        => "int64_t",
+     "udlong"       => "uint64_t",
+     "udlongr"      => "uint64_t",
+     "hyper"        => "uint64_t",
+     "NTTIME"       => "NTTIME",
+     "NTTIME_1sec"  => "NTTIME",
+     "time_t"       => "time_t",
+     "NTTIME_hyper" => "NTTIME",
+     "NTSTATUS"     => "NTSTATUS",
+     "WERROR"       => "WERROR",
+     "DATA_BLOB"    => "DATA_BLOB",
+     "ipv4address"  => "const char *",
+     "nbt_string"   => "const char *"
+     );
+
+# map from a IDL type to a C header type
+sub mapScalarType($)
+{
+       my $name = shift;
+       die("Undef passed to mapScalarType") unless defined($name);
+       if (defined($scalar_type_mappings{$name})) {
+               return $scalar_type_mappings{$name};
+       }
+       die("Tried to map non-scalar type $name");
+}
+
 sub mapType($)
 {
-       my $e = shift;
+       my $t = shift;
+       die("Undef passed to mapType") unless defined($t);
        my $dt;
 
-       if ($e->{TYPE} eq "ENUM" or $e->{TYPE} eq "BITMAP") {
-               $dt = getType($e->{PARENT}->{NAME});
-       }
-       
-       unless ($dt or $dt = getType($e->{TYPE})) {
+       return "void" if ($t eq "void");
+       return "const char *" if ($t =~ "string");
+
+       unless ($dt or ($dt = getType($t))) {
                # Best guess
-               return "struct $e->{TYPE}";
+               return "struct $t";
        }
-       return mapScalarType($e->{TYPE}) if ($dt->{DATA}->{TYPE} eq "SCALAR");
+       return mapScalarType($t) if ($dt->{DATA}->{TYPE} eq "SCALAR");
        return "enum $dt->{NAME}" if ($dt->{DATA}->{TYPE} eq "ENUM");
        return "struct $dt->{NAME}" if ($dt->{DATA}->{TYPE} eq "STRUCT");
        return "struct $dt->{NAME}" if ($dt->{DATA}->{TYPE} eq "INTERFACE");
        return "union $dt->{NAME}" if ($dt->{DATA}->{TYPE} eq "UNION");
-       return mapScalarType(bitmap_type_fn($dt->{DATA})) if ($dt->{DATA}->{TYPE} eq "BITMAP");
+
+       if ($dt->{DATA}->{TYPE} eq "BITMAP") {
+               return mapScalarType(bitmap_type_fn($dt->{DATA}));
+       }
 
        die("Unknown type $dt->{DATA}->{TYPE}");
 }
@@ -258,11 +166,12 @@ sub LoadIdl($)
                foreach my $y (@{$x->{DATA}}) {
                        addType($y) if (
                                $y->{TYPE} eq "TYPEDEF" 
-                        or $y->{TYPE} eq "DECLARE");
+                            or $y->{TYPE} eq "DECLARE");
                }
        }
 }
 
-RegisterScalars();
+RegisterPrimitives();
+
 
 1;