SCALAR => IS_FIXED
[metze/samba/wip.git] / pidl / lib / Parse / Pidl / Typelist.pm
index a89b1a74eb495c66bb26daa517ed2d2544cd471c..100082d8f5044c073b358d70e8dbdcae9fa6365d 100644 (file)
@@ -8,8 +8,8 @@ package Parse::Pidl::Typelist;
 require Exporter;
 @ISA = qw(Exporter);
 @EXPORT_OK = qw(hasType getType resolveType mapTypeName scalar_is_reference expandAlias
-                           mapScalarType addType typeIs is_signed is_scalar enum_type_fn
-                               bitmap_type_fn mapType typeHasBody
+       mapScalarType addType typeIs is_signed is_scalar enum_type_fn
+       bitmap_type_fn mapType typeHasBody is_fixed_size_scalar
 );
 use vars qw($VERSION);
 $VERSION = '0.01';
@@ -21,7 +21,13 @@ my %types = ();
 
 my @reference_scalars = (
        "string", "string_array", "nbt_string", "dns_string",
-       "wrepl_nbt_name", "ipv4address", "ipv6address"
+       "wrepl_nbt_name", "dnsp_name", "dnsp_string",
+       "ipv4address", "ipv6address"
+);
+
+my @non_fixed_size_scalars = (
+       "string", "string_array", "nbt_string", "dns_string",
+       "wrepl_nbt_name", "dnsp_name", "dnsp_string"
 );
 
 # a list of known scalar types
@@ -48,10 +54,13 @@ my %scalars = (
        "string"        => "const char *",
        "string_array"  => "const char **",
        "time_t"        => "time_t",
+       "uid_t"         => "uid_t",
+       "gid_t"         => "gid_t",
        "NTTIME"        => "NTTIME",
        "NTTIME_1sec"   => "NTTIME",
        "NTTIME_hyper"  => "NTTIME",
        "WERROR"        => "WERROR",
+       "HRESULT"       => "HRESULT",
        "NTSTATUS"      => "NTSTATUS",
        "COMRESULT" => "COMRESULT",
        "dns_string"    => "const char *",
@@ -75,7 +84,7 @@ my %aliases = (
        "long" => "int32",
        "short" => "int16",
        "HYPER_T" => "hyper",
-       "HRESULT" => "COMRESULT",
+        "mode_t"        => "uint32",
 );
 
 sub expandAlias($)
@@ -188,6 +197,15 @@ sub is_scalar($)
        return 0;
 }
 
+sub is_fixed_size_scalar($)
+{
+       my $name = shift;
+
+       return 0 unless is_scalar($name);
+       return 0 if (grep(/^$name$/, @non_fixed_size_scalars));
+       return 1;
+}
+
 sub scalar_is_reference($)
 {
        my $name = shift;
@@ -198,14 +216,18 @@ sub scalar_is_reference($)
 
 sub RegisterScalars()
 {
-       foreach (keys %scalars) {
+       foreach my $t (keys %scalars) {
+               my $is_fixed = 1;
+               $is_fixed = 0 if (grep(/^$t$/, @non_fixed_size_scalars));
+
                addType({
-                       NAME => $_,
+                       NAME => $t,
                        TYPE => "TYPEDEF",
                        BASEFILE => "<builtin>",
                        DATA => {
                                TYPE => "SCALAR",
-                               NAME => $_
+                               NAME => $t,
+                               IS_FIXED => $is_fixed,
                        }
                }
                );
@@ -274,6 +296,7 @@ sub mapType($$)
        return "struct $n" if ($t->{TYPE} eq "STRUCT" or $t->{TYPE} eq "INTERFACE");
        return "union $n" if ($t->{TYPE} eq "UNION");
        return mapScalarType(bitmap_type_fn($t)) if ($t->{TYPE} eq "BITMAP");
+       return "struct $n" if ($t->{TYPE} eq "PIPE");
        die("Unknown type $t->{TYPE}");
 }
 
@@ -312,11 +335,12 @@ sub LoadIdl($;$)
                        }) if (has_property($x, "object"));
 
                foreach my $y (@{$x->{DATA}}) {
-                       if ($y->{TYPE} eq "TYPEDEF" 
-                               or $y->{TYPE} eq "UNION"
-                               or $y->{TYPE} eq "STRUCT"
-                       or $y->{TYPE} eq "ENUM"
-                       or $y->{TYPE} eq "BITMAP") {
+                       if ($y->{TYPE} eq "TYPEDEF"
+                           or $y->{TYPE} eq "UNION"
+                           or $y->{TYPE} eq "STRUCT"
+                           or $y->{TYPE} eq "ENUM"
+                           or $y->{TYPE} eq "BITMAP"
+                           or $y->{TYPE} eq "PIPE") {
                                $y->{BASEFILE} = $basename;
                                addType($y);
                        }