svn commit: samba r11061 - in branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba3: .

jelmer at samba.org jelmer at samba.org
Fri Oct 14 16:40:48 GMT 2005


Author: jelmer
Date: 2005-10-14 16:40:47 +0000 (Fri, 14 Oct 2005)
New Revision: 11061

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=11061

Log:
Samba3 parser generator fixes:
* Add (limited) support for [string]
* Don't generate (and set) header elements for top level ref pointers as 
they don't appear on the wire

Modified:
   branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba3/Header.pm
   branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba3/Parser.pm
   branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba3/Types.pm


Changeset:
Modified: branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba3/Header.pm
===================================================================
--- branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba3/Header.pm	2005-10-14 16:07:00 UTC (rev 11060)
+++ branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba3/Header.pm	2005-10-14 16:40:47 UTC (rev 11061)
@@ -9,7 +9,7 @@
 use Parse::Pidl::Typelist qw(hasType getType);
 use Parse::Pidl::Util qw(has_property ParseExpr);
 use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred);
-use Parse::Pidl::Samba3::Types qw(DeclShort);
+use Parse::Pidl::Samba3::Types qw(DeclShort StringType);
 
 use vars qw($VERSION);
 $VERSION = '0.01';
@@ -28,11 +28,15 @@
 
 	foreach my $l (@{$e->{LEVELS}}) {
 		if ($l->{TYPE} eq "POINTER") {
-			return if ($l->{POINTER_TYPE} eq "ref" and $l->{LEVEL} eq "top");
+			next if ($l->{POINTER_TYPE} eq "ref" and $l->{LEVEL} eq "TOP");
 			pidl "\tuint32 ptr$l->{POINTER_INDEX}_$e->{NAME};";
 		} elsif ($l->{TYPE} eq "SWITCH") {
 		} elsif ($l->{TYPE} eq "DATA") {
 			pidl "\t" . DeclShort($e) . ";";
+		} elsif ($l->{TYPE} eq "ARRAY" and $l->{IS_ZERO_TERMINATED}) {
+			my ($t,$f) = StringType($e,$l);
+			pidl "\t" . uc($t) . " $e->{NAME};";
+			return;
 		} elsif ($l->{TYPE} eq "ARRAY") {
 			if ($l->{IS_CONFORMANT}) {
 				pidl "\tuint32 size_$e->{NAME};";

Modified: branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba3/Parser.pm
===================================================================
--- branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba3/Parser.pm	2005-10-14 16:07:00 UTC (rev 11060)
+++ branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba3/Parser.pm	2005-10-14 16:40:47 UTC (rev 11061)
@@ -9,7 +9,7 @@
 use Parse::Pidl::Typelist qw(hasType getType mapType);
 use Parse::Pidl::Util qw(has_property ParseExpr);
 use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred);
-use Parse::Pidl::Samba3::Types qw(DeclShort DeclLong InitType DissectType);
+use Parse::Pidl::Samba3::Types qw(DeclShort DeclLong InitType DissectType StringType);
 
 use vars qw($VERSION);
 $VERSION = '0.01';
@@ -27,7 +27,7 @@
 #TODO:
 # - Add some security checks (array sizes, memory alloc == NULL, etc)
 # - Don't add seperate _p and _d functions if there is no deferred data
-# - [string]
+# - [string] with non-varying arrays
 # - subcontext()
 # - DATA_BLOB
 
@@ -58,7 +58,7 @@
 				next if ($l->{IS_DEFERRED} and $what == PRIMITIVES);
 				next if (not $l->{IS_DEFERRED} and $what == DEFERRED);
 			}
-			if ($l->{TYPE} eq "ARRAY") {
+			if ($l->{TYPE} eq "ARRAY" and not $l->{IS_ZERO_TERMINATED}) {
 				pidl "uint32 i_$e->{NAME}_$l->{LEVEL_INDEX};";
 				$output = 1;
 			}
@@ -90,9 +90,14 @@
 	my ($e,$l,$nl,$env,$varname,$what,$align) = @_;
 
 	if ($l->{IS_ZERO_TERMINATED}) {
-		fatal($e, "[string] attribute not supported for Samba3 yet");
-		
-		#FIXME
+		my ($t,$f) = StringType($e,$l);
+
+		pidl "if (!prs_io_$t(\"$e->{VARNAME}\", ps, depth, $varname))";
+		pidl "\treturn False;";
+		pidl "";
+
+		$$align = 0;
+		return;
 	}
 
 	my $len = ParseExpr($l->{LENGTH_IS}, $env);
@@ -228,7 +233,9 @@
 			indent;
 		}
 
-		pidl ParseExpr("ptr$l->{POINTER_INDEX}_$e->{NAME}", $env) . " = 1;";
+		unless ($l->{POINTER_TYPE} eq "ref" and $l->{LEVEL} eq "TOP") {
+			pidl ParseExpr("ptr$l->{POINTER_INDEX}_$e->{NAME}", $env) . " = 1;";
+		}
 		InitLevel($e, GetNextLevel($e,$l), "*$varname", $env);
 		
 		if ($l->{POINTER_TYPE} ne "ref") {
@@ -237,6 +244,9 @@
 			pidl "\t" . ParseExpr("ptr$l->{POINTER_INDEX}_$e->{NAME}", $env) . " = 0;";
 			pidl "}";
 		}
+	} elsif ($l->{TYPE} eq "ARRAY" and $l->{IS_ZERO_TERMINATED}) {
+		my ($t,$f) = StringType($e,$l);
+		pidl "init_$t(" . ParseExpr($e->{NAME}, $env) . ", $varname, $f);"; 
 	} elsif ($l->{TYPE} eq "ARRAY") {
 		pidl ParseExpr($e->{NAME}, $env) . " = $varname;";
 	} elsif ($l->{TYPE} eq "DATA") {
@@ -256,7 +266,7 @@
 		} elsif ($l->{TYPE} eq "POINTER") {
 			$env->{"ptr$l->{POINTER_INDEX}_$e->{NAME}"} = "v->ptr$l->{POINTER_INDEX}_$e->{NAME}";
 		} elsif ($l->{TYPE} eq "SWITCH") {
-		} elsif ($l->{TYPE} eq "ARRAY") {
+		} elsif ($l->{TYPE} eq "ARRAY" and not $l->{IS_ZERO_TERMINATED}) {
 			$env->{"length_$e->{NAME}"} = "v->length_$e->{NAME}";
 			$env->{"size_$e->{NAME}"} = "v->size_$e->{NAME}";
 			$env->{"offset_$e->{NAME}"} = "v->offset_$e->{NAME}";
@@ -360,7 +370,7 @@
 		} elsif ($l->{TYPE} eq "POINTER") {
 			$env->{"ptr$l->{POINTER_INDEX}_$e->{NAME}"} = "v->ptr$l->{POINTER_INDEX}";
 		} elsif ($l->{TYPE} eq "SWITCH") {
-		} elsif ($l->{TYPE} eq "ARRAY") {
+		} elsif ($l->{TYPE} eq "ARRAY" and not $l->{IS_ZERO_TERMINATED}) {
 			$env->{"length_$e->{NAME}"} = "v->length";
 			$env->{"size_$e->{NAME}"} = "v->size";
 			$env->{"offset_$e->{NAME}"} = "v->offset";

Modified: branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba3/Types.pm
===================================================================
--- branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba3/Types.pm	2005-10-14 16:07:00 UTC (rev 11060)
+++ branches/SAMBA_4_0/source/pidl/lib/Parse/Pidl/Samba3/Types.pm	2005-10-14 16:40:47 UTC (rev 11061)
@@ -7,7 +7,7 @@
 
 require Exporter;
 @ISA = qw(Exporter);
- at EXPORT_OK = qw(DeclShort DeclLong InitType DissectType AddType);
+ at EXPORT_OK = qw(DeclShort DeclLong InitType DissectType AddType StringType);
 
 use strict;
 use Parse::Pidl::Util qw(has_property ParseExpr property_matches);
@@ -104,6 +104,20 @@
 	return "smb_io_$t(\"$e->{NAME}\", &$n, 1, ps, depth)";
 }
 
+sub StringType($$)
+{
+	my ($e,$l) = @_;
+	my $nl = GetNextLevel($e,$l);
+
+	if ($l->{IS_VARYING} and $l->{IS_CONFORMANT} and $nl->{DATA_TYPE} eq "uint16") {
+		return ("unistr2", 0);
+	} elsif ($l->{IS_CONFORMANT} and $l->{IS_VARYING} and $nl->{DATA_TYPE} eq "uint8") {
+		return ("string2", 0);
+	} else {
+		fatal($e, "[string] non-varying string not supported for Samba3 yet");
+	}
+}
+
 my $known_types = 
 {
 	uint8 => 



More information about the samba-cvs mailing list