my($enum) = shift;
my($name) = shift;
- util::register_enum($enum, $name);
-
pidl "\nenum $name {\n";
$tab_depth++;
my $els = \@{$enum->{ELEMENTS}};
my($bitmap) = shift;
my($name) = shift;
- util::register_bitmap($bitmap, $name);
-
pidl "\n/* bitmap $name */\n";
my $els = \@{$bitmap->{ELEMENTS}};
HeaderUnion($data, $name);
return;
}
+
+ my $dt = $NdrParser::typedefs{$e->{TYPE}}->{DATA};
+
if ($data =~ "string") {
pidl "const char *";
- } elsif (util::is_enum($e->{TYPE})) {
- pidl "enum $data";
- } elsif (util::is_bitmap($e->{TYPE})) {
- my $bitmap = util::get_bitmap($e->{TYPE});
- pidl util::bitmap_type_decl($bitmap);
- } elsif (NdrParser::is_scalar_type($data)) {
- pidl util::map_type($data);
- } elsif (util::has_property($e, "switch_is")) {
- pidl "union $data";
- } else {
+ } elsif (not defined($dt->{TYPE})) {
pidl "struct $data";
- }
-}
-
-#####################################################################
-# parse a declare
-sub HeaderDeclare($)
-{
- my($declare) = shift;
-
- if ($declare->{DATA}->{TYPE} eq "ENUM") {
- util::register_enum($declare, $declare->{NAME});
- } elsif ($declare->{DATA}->{TYPE} eq "BITMAP") {
- util::register_bitmap($declare, $declare->{NAME});
+ } else {
+ if ($dt->{TYPE} eq "ENUM") {
+ pidl "enum $data";
+ } elsif ($dt->{TYPE} eq "BITMAP") {
+ pidl util::bitmap_type_decl($dt);
+ } elsif ($dt->{TYPE} eq "SCALAR") {
+ pidl util::map_type($data);
+ } elsif ($dt->{TYPE} eq "UNION") {
+ pidl "union $data";
+ } elsif ($dt->{TYPE} eq "STRUCT") {
+ pidl "struct $data";
+ } else {
+ print "Unknown data type type $dt->{TYPE}\n";
+ }
}
}
foreach my $d (@{$data}) {
($d->{TYPE} eq "CONST") &&
HeaderConst($d);
- ($d->{TYPE} eq "DECLARE") &&
- HeaderDeclare($d);
($d->{TYPE} eq "TYPEDEF") &&
HeaderTypedef($d);
($d->{TYPE} eq "TYPEDEF") &&
my($idl) = shift;
$tab_depth = 0;
+ NdrParser::Load($idl);
+
$res = "";
pidl "/* header auto-generated by pidl */\n\n";
foreach my $x (@{$idl}) {
my $idl = $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
foreach my $x (@{$idl}) {
- # Add [in] ORPCTHIS *this, [out] ORPCTHAT *that
- # for 'object' interfaces
- if (util::has_property($x, "object")) {
- foreach my $e (@{$x->{DATA}}) {
- if($e->{TYPE} eq "FUNCTION") {
- $e->{PROPERTIES}->{object} = 1;
- unshift(@{$e->{ELEMENTS}},
- { 'NAME' => 'ORPCthis',
- 'POINTERS' => 0,
- 'PROPERTIES' => { 'in' => '1' },
- 'TYPE' => 'ORPCTHIS'
- });
- unshift(@{$e->{ELEMENTS}},
- { 'NAME' => 'ORPCthat',
- 'POINTERS' => 0,
- 'PROPERTIES' => { 'out' => '1' },
- 'TYPE' => 'ORPCTHAT'
- });
- }
- }
- }
-
+ NdrParser::InterfaceORPC($x);
+
# Do the inheritance
if (defined($x->{BASE}) and $x->{BASE} ne "") {
my $parent = util::get_interface($idl, $x->{BASE});
my $idl = $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error );
foreach my $x (@{$idl}) {
- # Add [in] ORPCTHIS *this, [out] ORPCTHAT *that
- # for 'object' interfaces
- if (util::has_property($x, "object")) {
- foreach my $e (@{$x->{DATA}}) {
- if($e->{TYPE} eq "FUNCTION") {
- $e->{PROPERTIES}->{object} = 1;
- unshift(@{$e->{ELEMENTS}},
- { 'NAME' => 'ORPCthis',
- 'POINTERS' => 0,
- 'PROPERTIES' => { 'in' => '1' },
- 'TYPE' => 'ORPCTHIS'
- });
- unshift(@{$e->{ELEMENTS}},
- { 'NAME' => 'ORPCthat',
- 'POINTERS' => 0,
- 'PROPERTIES' => { 'out' => '1' },
- 'TYPE' => 'ORPCTHAT'
- });
- }
- }
- }
-
+ NdrParser::InterfaceORPC($x);
+
# Do the inheritance
if (defined($x->{BASE}) and $x->{BASE} ne "") {
my $parent = util::get_interface($idl, $x->{BASE});
use needed;
# list of known types
-my %typedefs;
+our %typedefs;
my %type_alignments =
(
{
my $type = shift;
- return 1 if (defined($typedefs{$type}) and $typedefs{$type}->{DATA}->{TYPE} eq "SCALAR");
- return 1 if (util::is_enum($type));
- return 1 if (util::is_bitmap($type));
+ if (my $dt = $typedefs{$type}->{DATA}->{TYPE}) {
+ return 1 if ($dt eq "SCALAR");
+ return 1 if ($dt eq "ENUM");
+ return 1 if ($dt eq "BITMAP");
+ }
return 0;
}
{
my $e = shift;
- unless (defined($typedefs{$e})) {
+ unless (defined($typedefs{$e}) && defined($typedefs{$e}->{DATA}->{TYPE})) {
# it must be an external type - all we can do is guess
# print "Warning: assuming alignment of unknown type '$e' is 4\n";
return 4;
} elsif($dt->{TYPE} eq "UNION") {
$dt->{ALIGN} = struct_alignment($dt);
} elsif ($dt->{TYPE} eq "ENUM") {
- $dt->{ALIGN} = align_type(util::enum_type_fn(util::get_enum($e)));
+ $dt->{ALIGN} = align_type(util::enum_type_fn($typedefs{$e}->{DATA}));
} elsif ($dt->{TYPE} eq "BITMAP") {
- $dt->{ALIGN} = align_type(util::bitmap_type_fn(util::get_bitmap($e)));
+ $dt->{ALIGN} = align_type(util::bitmap_type_fn($typedefs{$e}->{DATA}));
}
if (not defined($dt->{ALIGN})) {
}
}
-
#####################################################################
# parse scalars in a structure element
sub ParseElementPushScalar($$$)
my $e2 = find_sibling($e, $switch);
my $type_decl = util::map_type($e2->{TYPE});
pidl "\tif (($ndr_flags) & NDR_SCALARS) {\n";
- if (util::is_enum($e2->{TYPE})) {
+ if ($typedefs{$e2->{TYPE}}->{DATA}->{TYPE} eq "ENUM") {
$type_decl = util::enum_type_decl($e2);
- } elsif (util::is_bitmap($e2->{TYPE})) {
+ } elsif ($typedefs{$e2->{TYPE}}->{DATA}->{TYPE} eq "BITMAP") {
$type_decl = util::bitmap_type_decl($e2);
}
pidl "\t\t$type_decl _level;\n";
}
foreach my $d (@{$x->{DATA}}) {
- if ($d->{TYPE} eq "DECLARE" or $d->{TYPE} eq "TYPEDEF") {
+ if (($d->{TYPE} eq "DECLARE") or ($d->{TYPE} eq "TYPEDEF")) {
$typedefs{$d->{NAME}} = $d;
if ($d->{DATA}->{TYPE} eq "STRUCT" or $d->{DATA}->{TYPE} eq "UNION") {
CheckPointerTypes($d->{DATA}, $x->{PROPERTIES}->{pointer_default});
}
}
+# Add ORPC specific bits to an interface.
+sub InterfaceORPC($)
+{
+ my $x = shift;
+ # Add [in] ORPCTHIS *this, [out] ORPCTHAT *that
+ # for 'object' interfaces
+ if (util::has_property($x, "object")) {
+ foreach my $e (@{$x->{DATA}}) {
+ if($e->{TYPE} eq "FUNCTION") {
+ $e->{PROPERTIES}->{object} = 1;
+ unshift(@{$e->{ELEMENTS}},
+ { 'NAME' => 'ORPCthis',
+ 'POINTERS' => 0,
+ 'PROPERTIES' => { 'in' => '1' },
+ 'TYPE' => 'ORPCTHIS'
+ });
+ unshift(@{$e->{ELEMENTS}},
+ { 'NAME' => 'ORPCthat',
+ 'POINTERS' => 0,
+ 'PROPERTIES' => { 'out' => '1' },
+ 'TYPE' => 'ORPCTHAT'
+ });
+ }
+ }
+ }
+}
+
sub Load($)
{
my $idl = shift;
my %enum_list;
-sub register_enum($$)
-{
- my $enum = shift;
- my $name = shift;
- $enum_list{$name} = $enum;
-}
-
-sub is_enum($)
-{
- my $name = shift;
- return defined $enum_list{$name}
-}
-
-sub get_enum($)
-{
- my $name = shift;
- return $enum_list{$name};
-}
-
sub enum_type_decl($)
{
my $enum = shift;
my %bitmap_list;
-sub register_bitmap($$)
-{
- my $bitmap = shift;
- my $name = shift;
- $bitmap_list{$name} = $bitmap;
-}
-
-sub is_bitmap($)
-{
- my $name = shift;
- return defined $bitmap_list{$name};
-}
-
-sub get_bitmap($)
-{
- my $name = shift;
- return $bitmap_list{$name};
-}
-
sub bitmap_type_fn($)
{
my $bitmap = shift;
{
uint32_t ptr = 0;
if (p) {
- /* we do this to ensure that we generate unique ref ids,
- which means we can handle the case where a MS programmer
- forgot to mark a pointer as unique */
ndr->ptr_count++;
ptr = ndr->ptr_count;
}