diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2008-10-21 14:51:13 +0200 |
---|---|---|
committer | Jelmer Vernooij <jelmer@samba.org> | 2008-10-21 14:51:13 +0200 |
commit | 5209a846a9157e649fcdcb561f7eaf19c8c0e465 (patch) | |
tree | b0a7e52b5646c8eec182dbc391e7934b6804488c /source4/pidl/lib/Parse/Pidl/Typelist.pm | |
parent | 625359b2e266105022309df8985720108ecd6f67 (diff) | |
parent | 2ee8d29d22bcb1c350ab59d71b0aee548489bc9c (diff) | |
download | samba-5209a846a9157e649fcdcb561f7eaf19c8c0e465.tar.gz samba-5209a846a9157e649fcdcb561f7eaf19c8c0e465.tar.bz2 samba-5209a846a9157e649fcdcb561f7eaf19c8c0e465.zip |
Merge branch 'master' of ssh://git.samba.org/data/git/samba into regsrv
Conflicts:
source4/lib/registry/ldb.c
source4/rpc_server/winreg/rpc_winreg.c
Diffstat (limited to 'source4/pidl/lib/Parse/Pidl/Typelist.pm')
-rw-r--r-- | source4/pidl/lib/Parse/Pidl/Typelist.pm | 294 |
1 files changed, 0 insertions, 294 deletions
diff --git a/source4/pidl/lib/Parse/Pidl/Typelist.pm b/source4/pidl/lib/Parse/Pidl/Typelist.pm deleted file mode 100644 index 8ba1ae47af..0000000000 --- a/source4/pidl/lib/Parse/Pidl/Typelist.pm +++ /dev/null @@ -1,294 +0,0 @@ -################################################### -# Samba4 parser generator for IDL structures -# Copyright jelmer@samba.org 2005 -# released under the GNU GPL - -package Parse::Pidl::Typelist; - -require Exporter; -@ISA = qw(Exporter); -@EXPORT_OK = qw(hasType getType resolveType mapTypeName scalar_is_reference expandAlias - mapScalarType addType typeIs is_scalar enum_type_fn - bitmap_type_fn mapType typeHasBody -); -use vars qw($VERSION); -$VERSION = '0.01'; - -use Parse::Pidl::Util qw(has_property); -use strict; - -my %types = (); - -my @reference_scalars = ( - "string", "string_array", "nbt_string", - "wrepl_nbt_name", "ipv4address" -); - -# a list of known scalar types -my %scalars = ( - "void" => "void", - "char" => "char", - "int8" => "int8_t", - "uint8" => "uint8_t", - "int16" => "int16_t", - "uint16" => "uint16_t", - "int32" => "int32_t", - "uint32" => "uint32_t", - "hyper" => "uint64_t", - "dlong" => "int64_t", - "udlong" => "uint64_t", - "udlongr" => "uint64_t", - "pointer" => "void*", - "DATA_BLOB" => "DATA_BLOB", - "string" => "const char *", - "string_array" => "const char **", - "time_t" => "time_t", - "NTTIME" => "NTTIME", - "NTTIME_1sec" => "NTTIME", - "NTTIME_hyper" => "NTTIME", - "WERROR" => "WERROR", - "NTSTATUS" => "NTSTATUS", - "COMRESULT" => "COMRESULT", - "nbt_string" => "const char *", - "wrepl_nbt_name"=> "struct nbt_name *", - "ipv4address" => "const char *", -); - -my %aliases = ( - "error_status_t" => "uint32", - "boolean8" => "uint8", - "boolean32" => "uint32", - "DWORD" => "uint32", - "uint" => "uint32", - "int" => "int32", - "WORD" => "uint16", - "char" => "uint8", - "long" => "int32", - "short" => "int16", - "HYPER_T" => "hyper", - "HRESULT" => "COMRESULT", -); - -sub expandAlias($) -{ - my $name = shift; - - return $aliases{$name} if defined($aliases{$name}); - - return $name; -} - -# 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} if defined($scalars{$name}); - - die("Unknown scalar type $name"); -} - -sub addType($) -{ - my $t = shift; - $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; - return ($t) if (ref($t) eq "HASH" and not defined($t->{NAME})); - return undef if not hasType($t); - return $types{$t->{NAME}} if (ref($t) eq "HASH"); - return $types{$t}; -} - -sub typeIs($$) -{ - my ($t,$tt) = @_; - - if (ref($t) eq "HASH") { - return 1 if ($t->{TYPE} eq $tt); - return 0; - } - return 1 if (hasType($t) and getType($t)->{TYPE} eq "TYPEDEF" and - getType($t)->{DATA}->{TYPE} eq $tt); - return 0; -} - -sub hasType($) -{ - my $t = shift; - if (ref($t) eq "HASH") { - return 1 if (not defined($t->{NAME})); - return 1 if (defined($types{$t->{NAME}}) and - $types{$t->{NAME}}->{TYPE} eq $t->{TYPE}); - return 0; - } - return 1 if defined($types{$t}); - return 0; -} - -sub is_scalar($) -{ - sub is_scalar($); - my $type = shift; - - 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"); - return 1 if ($dt->{TYPE} eq "SCALAR" or $dt->{TYPE} eq "ENUM" or - $dt->{TYPE} eq "BITMAP"); - } - - return 0; -} - -sub scalar_is_reference($) -{ - my $name = shift; - - return 1 if (grep(/^$name$/, @reference_scalars)); - return 0; -} - -sub RegisterScalars() -{ - foreach (keys %scalars) { - addType({ - NAME => $_, - TYPE => "TYPEDEF", - DATA => { - TYPE => "SCALAR", - NAME => $_ - } - } - ); - } -} - -sub enum_type_fn($) -{ - my $enum = shift; - $enum->{TYPE} eq "ENUM" or die("not an enum"); - - # 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"; - } - return "uint16"; -} - -sub bitmap_type_fn($) -{ - my $bitmap = shift; - - $bitmap->{TYPE} eq "BITMAP" or die("not a bitmap"); - - if (has_property($bitmap, "bitmap8bit")) { - return "uint8"; - } elsif (has_property($bitmap, "bitmap16bit")) { - return "uint16"; - } elsif (has_property($bitmap, "bitmap64bit")) { - return "hyper"; - } - 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 mapScalarType($n) if ($t->{TYPE} eq "SCALAR"); - return "enum $n" if ($t->{TYPE} eq "ENUM"); - return "struct $n" if ($t->{TYPE} eq "STRUCT"); - return "union $n" if ($t->{TYPE} eq "UNION"); - return mapScalarType(bitmap_type_fn($t)) if ($t->{TYPE} eq "BITMAP"); - die("Unknown type $t->{TYPE}"); -} - -sub mapTypeName($) -{ - my $t = shift; - return "void" unless defined($t); - my $dt; - $t = expandAlias($t); - - unless ($dt or ($dt = getType($t))) { - # Best guess - return "struct $t"; - } - - return mapType($dt, $dt->{NAME}); -} - -sub LoadIdl($) -{ - my ($idl) = @_; - - foreach my $x (@{$idl}) { - next if $x->{TYPE} ne "INTERFACE"; - - foreach my $y (@{$x->{DATA}}) { - addType($y) 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"); - } - } -} - -sub GenerateTypeLib() -{ - return Parse::Pidl::Util::MyDumper(\%types); -} - -RegisterScalars(); - -1; |