diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2005-08-21 23:30:17 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:34:17 -0500 |
commit | 59b13f9a1d684a632c2c73352f0ec08a63bc0913 (patch) | |
tree | 14b0a564e4db3377f7ad2fa1f9671f8e04405962 /source4/pidl/lib/Parse/Pidl/Compat.pm | |
parent | efc03df292aa84edb592c22191dbf86cdf8c32d0 (diff) | |
download | samba-59b13f9a1d684a632c2c73352f0ec08a63bc0913.tar.gz samba-59b13f9a1d684a632c2c73352f0ec08a63bc0913.tar.bz2 samba-59b13f9a1d684a632c2c73352f0ec08a63bc0913.zip |
r9460: - Move pidl to lib/. This fixes standalone installation of pidl.
- Update the README
- Allow building the docs stand-alone
(This used to be commit b56084ce251ab7a35dd1422f38de258e8e1e1477)
Diffstat (limited to 'source4/pidl/lib/Parse/Pidl/Compat.pm')
-rw-r--r-- | source4/pidl/lib/Parse/Pidl/Compat.pm | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/source4/pidl/lib/Parse/Pidl/Compat.pm b/source4/pidl/lib/Parse/Pidl/Compat.pm new file mode 100644 index 0000000000..39cb67fd71 --- /dev/null +++ b/source4/pidl/lib/Parse/Pidl/Compat.pm @@ -0,0 +1,203 @@ +################################################### +# IDL Compatibility checker +# Copyright jelmer@samba.org 2005 +# released under the GNU GPL + +package Parse::Pidl::Compat; + +use Parse::Pidl::Util qw(has_property); +use strict; + +my %supported_properties = ( + # interface + "helpstring" => ["INTERFACE", "FUNCTION"], + "version" => ["INTERFACE"], + "uuid" => ["INTERFACE"], + "endpoint" => ["INTERFACE"], + "pointer_default" => ["INTERFACE"], + + # dcom + "object" => ["INTERFACE"], + "local" => ["INTERFACE", "FUNCTION"], + "iid_is" => ["ELEMENT"], + "call_as" => ["FUNCTION"], + "idempotent" => ["FUNCTION"], + + # function + "in" => ["ELEMENT"], + "out" => ["ELEMENT"], + + # pointer + "ref" => ["ELEMENT"], + "ptr" => ["ELEMENT"], + "unique" => ["ELEMENT"], + "ignore" => ["ELEMENT"], + + "value" => ["ELEMENT"], + + # generic + "public" => ["FUNCTION", "TYPEDEF"], + "nopush" => ["FUNCTION", "TYPEDEF"], + "nopull" => ["FUNCTION", "TYPEDEF"], + "noprint" => ["FUNCTION", "TYPEDEF"], + "noejs" => ["FUNCTION", "TYPEDEF"], + + # union + "switch_is" => ["ELEMENT"], + "switch_type" => ["ELEMENT", "TYPEDEF"], + "case" => ["ELEMENT"], + "default" => ["ELEMENT"], + + # subcontext + "subcontext" => ["ELEMENT"], + "subcontext_size" => ["ELEMENT"], + + # enum + "enum16bit" => ["TYPEDEF"], + "v1_enum" => ["TYPEDEF"], + + # bitmap + "bitmap8bit" => ["TYPEDEF"], + "bitmap16bit" => ["TYPEDEF"], + "bitmap32bit" => ["TYPEDEF"], + "bitmap64bit" => ["TYPEDEF"], + + # array + "range" => ["ELEMENT"], + "size_is" => ["ELEMENT"], + "string" => ["ELEMENT"], + "noheader" => ["ELEMENT"], + "charset" => ["ELEMENT"], + "length_is" => ["ELEMENT"], +); + + +my($res); + +sub warning($$) +{ + my $l = shift; + my $m = shift; + + print "$l->{FILE}:$l->{LINE}:Warning:$m\n"; +} + +sub error($$) +{ + my ($l,$m) = @_; + print "$l->{FILE}:$l->{LINE}:$m\n"; +} + +sub CheckTypedef($) +{ + my $td = shift; + + if (has_property($td, "nodiscriminant")) { + error($td, "nodiscriminant property not supported"); + } + + if ($td->{TYPE} eq "BITMAP") { + warning($td, "converting bitmap to scalar"); + #FIXME + } + + if (has_property($td, "gensize")) { + warning($td, "ignoring gensize() property. "); + } + + if (has_property($td, "enum8bit") and has_property($td, "enum16bit")) { + warning($td, "8 and 16 bit enums not supported, converting to scalar"); + #FIXME + } + + StripProperties($td); +} + +sub CheckElement($) +{ + my $e = shift; + + if (has_property($e, "noheader")) { + error($e, "noheader property not supported"); + return; + } + + if (has_property($e, "subcontext")) { + warning($e, "converting subcontext to byte array"); + #FIXME + } + + if (has_property($e, "compression")) { + error($e, "compression() property not supported"); + } + + if (has_property($e, "obfuscation")) { + error($e, "obfuscation() property not supported"); + } + + if (has_property($e, "sptr")) { + error($e, "sptr() pointer property not supported"); + } + + if (has_property($e, "relative")) { + error($e, "relative() pointer property not supported"); + } + + if (has_property($td, "flag")) { + warning($e, "ignoring flag() property"); + } + + if (has_property($td, "value")) { + warning($e, "ignoring value() property"); + } + + StripProperties($e); +} + +sub CheckFunction($) +{ + my $fn = shift; + + if (has_property($fn, "noopnum")) { + error($fn, "noopnum not converted. Opcodes will be out of sync."); + } + + StripProperties($fn); + + +} + +sub CheckInterface($) +{ + my $if = shift; + + if (has_property($if, "pointer_default_top") and + $if->{PROPERTIES}->{pointer_default_top} ne "ref") { + error($if, "pointer_default_top() is pidl-specific"); + } + + StripProperties($if); + + foreach my $x (@{$if->{DATA}}) { + if ($x->{TYPE} eq "DECLARE") { + warning($if, "the declare keyword is pidl-specific"); + next; + } + } +} + +sub Check($) +{ + my $pidl = shift; + my $nidl = []; + my $res = ""; + + foreach my $x (@{$pidl}) { + push (@$nidl, CheckInterface($x)) + if ($x->{TYPE} eq "INTERFACE"); + } + + return $res; +} + +1; |