diff options
Diffstat (limited to 'source4/build/pidl/typelist.pm')
-rw-r--r-- | source4/build/pidl/typelist.pm | 219 |
1 files changed, 64 insertions, 155 deletions
diff --git a/source4/build/pidl/typelist.pm b/source4/build/pidl/typelist.pm index 8559878a69..f5a0650006 100644 --- a/source4/build/pidl/typelist.pm +++ b/source4/build/pidl/typelist.pm @@ -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; |