Rev 11527: Generate actual typedefs in C for typedefs in IDL. in
file:///home/jelmer/bzr.samba/4.0-nestedpidl/
Jelmer Vernooij
jelmer at samba.org
Sun Feb 18 23:10:40 GMT 2007
At file:///home/jelmer/bzr.samba/4.0-nestedpidl/
------------------------------------------------------------
revno: 11527
revision-id: jelmer at samba.org-20070218231003-2dwn5ej5vc81o0im
parent: jelmer at samba.org-20070218214326-4t343pbsgy3ap9cl
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 4.0-nestedpidl
timestamp: Mon 2007-02-19 00:10:03 +0100
message:
Generate actual typedefs in C for typedefs in IDL.
modified:
source/pidl/lib/Parse/Pidl/Samba4/Header.pm svn-v2:12463 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0-source%2fpidl%2flib%2fParse%2fPidl%2fSamba4%2fHeader.pm
source/pidl/tests/header.pl svn-v2:21253 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0-source%2fpidl%2ftests%2fheader.pl
=== modified file 'source/pidl/lib/Parse/Pidl/Samba4/Header.pm'
--- a/source/pidl/lib/Parse/Pidl/Samba4/Header.pm 2007-02-18 18:44:56 +0000
+++ b/source/pidl/lib/Parse/Pidl/Samba4/Header.pm 2007-02-18 23:10:03 +0000
@@ -57,7 +57,7 @@
if (has_property($element, "represent_as")) {
pidl mapTypeName($element->{PROPERTIES}->{represent_as})." ";
} else {
- HeaderType($element, $element->{TYPE}, "");
+ HeaderType($element, $element->{TYPE});
pidl " ";
my $numstar = $element->{POINTERS};
if ($numstar >= 1) {
@@ -87,38 +87,42 @@
#####################################################################
# parse a struct
-sub HeaderStruct($$)
+sub HeaderStruct($)
{
- my($struct,$name) = @_;
- pidl "struct $name {\n";
- $tab_depth++;
- my $el_count=0;
+ my($struct) = @_;
+ pidl "struct $struct->{NAME}";
+
if (defined $struct->{ELEMENTS}) {
+ pidl " {\n";
+ $tab_depth++;
+ my $el_count=0;
foreach (@{$struct->{ELEMENTS}}) {
HeaderElement($_);
$el_count++;
}
- }
- if ($el_count == 0) {
- # some compilers can't handle empty structures
- pidl tabs()."char _empty_;\n";
- }
- $tab_depth--;
- pidl tabs()."}";
- if (defined $struct->{PROPERTIES}) {
- HeaderProperties($struct->{PROPERTIES}, []);
+ if ($el_count == 0) {
+ # some compilers can't handle empty structures
+ pidl tabs()."char _empty_;\n";
+ }
+ $tab_depth--;
+ pidl tabs()."}";
+ if (defined $struct->{PROPERTIES}) {
+ HeaderProperties($struct->{PROPERTIES}, []);
+ }
}
}
#####################################################################
# parse a enum
-sub HeaderEnum($$)
+sub HeaderEnum($)
{
- my($enum,$name) = @_;
+ my($enum) = @_;
+ unless (defined($enum->{ELEMENTS})) { pidl "enum $enum->{NAME} "; return; }
+
my $first = 1;
- pidl "#ifndef USE_UINT_ENUMS\n";
- pidl "enum $name {\n";
+ pidl "\n#ifndef USE_UINT_ENUMS\n";
+ pidl "enum $enum->{NAME} {\n";
$tab_depth++;
foreach my $e (@{$enum->{ELEMENTS}}) {
unless ($first) { pidl ",\n"; }
@@ -131,7 +135,7 @@
pidl "};\n";
pidl "#else\n";
my $count = 0;
- pidl "enum $name { __donnot_use_enum_$name=0x7FFFFFFF};\n";
+ pidl "enum $enum->{NAME} { __donnot_use_enum_$enum->{NAME}=0x7FFFFFFF};\n";
my $with_val = 0;
my $without_val = 0;
foreach my $e (@{$enum->{ELEMENTS}}) {
@@ -159,23 +163,25 @@
#####################################################################
# parse a bitmap
-sub HeaderBitmap($$)
+sub HeaderBitmap($)
{
- my($bitmap,$name) = @_;
+ my($bitmap) = @_;
- pidl "/* bitmap $name */\n";
+ pidl "/* bitmap $bitmap->{NAME} */\n";
pidl "#define $_\n" foreach (@{$bitmap->{ELEMENTS}});
pidl "\n";
}
#####################################################################
# parse a union
-sub HeaderUnion($$)
+sub HeaderUnion($)
{
- my($union,$name) = @_;
+ my ($union) = @_;
my %done = ();
- pidl "union $name {\n";
+ pidl "union $union->{NAME}";
+ return if not defined($union->{ELEMENTS});
+ pidl " {\n";
$tab_depth++;
foreach my $e (@{$union->{ELEMENTS}}) {
if ($e->{TYPE} ne "EMPTY") {
@@ -195,18 +201,16 @@
#####################################################################
# parse a type
-sub HeaderType($$$)
+sub HeaderType($$)
{
- my($e,$data,$name) = @_;
+ my($e,$data) = @_;
+
if (ref($data) eq "HASH") {
- ($data->{TYPE} eq "ENUM") && HeaderEnum($data, $name);
- ($data->{TYPE} eq "BITMAP") && HeaderBitmap($data, $name);
- ($data->{TYPE} eq "STRUCT") && HeaderStruct($data, $name);
- ($data->{TYPE} eq "UNION") && HeaderUnion($data, $name);
- return;
- }
-
- if (has_property($e, "charset")) {
+ ($data->{TYPE} eq "ENUM") && HeaderEnum($data);
+ ($data->{TYPE} eq "BITMAP") && HeaderBitmap($data);
+ ($data->{TYPE} eq "STRUCT") && HeaderStruct($data);
+ ($data->{TYPE} eq "UNION") && HeaderUnion($data);
+ } elsif (has_property($e, "charset")) {
pidl "const char";
} else {
pidl mapTypeName($e->{TYPE});
@@ -217,8 +221,11 @@
# parse a typedef
sub HeaderTypedef($)
{
- my($typedef) = shift;
- HeaderType($typedef, $typedef->{DATA}, $typedef->{NAME});
+ my ($typedef) = @_;
+
+ pidl "typedef ";
+ HeaderType($typedef, $typedef->{DATA});
+ pidl "$typedef->{NAME}";
}
#####################################################################
@@ -353,10 +360,10 @@
foreach my $d (@{$interface->{DATA}}) {
HeaderTypedef($d) if ($d->{TYPE} eq "TYPEDEF");
- HeaderStruct($d, $d->{NAME}) if ($d->{TYPE} eq "STRUCT");
- HeaderUnion($d, $d->{NAME}) if ($d->{TYPE} eq "UNION");
- HeaderEnum($d, $d->{NAME}) if ($d->{TYPE} eq "ENUM");
- HeaderBitmap($d, $d->{NAME}) if ($d->{TYPE} eq "BITMAP");
+ HeaderStruct($d) if ($d->{TYPE} eq "STRUCT");
+ HeaderUnion($d) if ($d->{TYPE} eq "UNION");
+ HeaderEnum($d) if ($d->{TYPE} eq "ENUM");
+ HeaderBitmap($d) if ($d->{TYPE} eq "BITMAP");
pidl ";\n\n";
}
=== modified file 'source/pidl/tests/header.pl'
--- a/source/pidl/tests/header.pl 2007-02-18 16:21:28 +0000
+++ b/source/pidl/tests/header.pl 2007-02-18 23:10:03 +0000
@@ -24,7 +24,7 @@
like(parse_idl("interface p { typedef struct { int y; } x; };"),
qr/.*#ifndef _HEADER_p\n#define _HEADER_p\n.+\n#endif \/\* _HEADER_p \*\/.*/ms, "ifdefs are created");
like(parse_idl("interface p { typedef struct { int y; } x; };"),
- qr/struct x.*{.*int32_t y;.*}.*;/sm, "interface member generated properly");
+ qr/typedef struct.*{.*int32_t y;.*}.*x;/sm, "interface member generated properly");
like(parse_idl("interface x { void foo (void); };"),
qr/struct foo.*{\s+int _dummy_element;\s+};/sm, "void fn contains dummy element");
like(parse_idl("interface x { void foo ([in] uint32 x); };"),
More information about the samba-cvs
mailing list