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