svn commit: samba r9441 - in branches/SAMBA_4_0/source: build/pidl/Parse/Pidl/Samba build/pidl/Parse/Pidl/Samba/NDR librpc/ndr

jelmer at samba.org jelmer at samba.org
Sun Aug 21 01:59:42 GMT 2005


Author: jelmer
Date: 2005-08-21 01:59:41 +0000 (Sun, 21 Aug 2005)
New Revision: 9441

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

Log:
Use "const char *" for fixed-size arrays with charset() because 
these can require more elements in the local charset (usually UTF8) then 
in the wire one.

Modified:
   branches/SAMBA_4_0/source/build/pidl/Parse/Pidl/Samba/Header.pm
   branches/SAMBA_4_0/source/build/pidl/Parse/Pidl/Samba/NDR/Parser.pm
   branches/SAMBA_4_0/source/librpc/ndr/ndr_string.c


Changeset:
Modified: branches/SAMBA_4_0/source/build/pidl/Parse/Pidl/Samba/Header.pm
===================================================================
--- branches/SAMBA_4_0/source/build/pidl/Parse/Pidl/Samba/Header.pm	2005-08-21 00:07:51 UTC (rev 9440)
+++ branches/SAMBA_4_0/source/build/pidl/Parse/Pidl/Samba/Header.pm	2005-08-21 01:59:41 UTC (rev 9441)
@@ -59,14 +59,16 @@
 	my $numstar = $element->{POINTERS};
 	foreach (@{$element->{ARRAY_LEN}})
 	{
-		next if is_constant($_);
+		next if is_constant($_) and 
+			not has_property($element, "charset");
 		$numstar++;
 	}
 	$numstar-- if Parse::Pidl::Typelist::scalar_is_reference($element->{TYPE});
 	pidl "*" foreach (1..$numstar);
 	pidl $element->{NAME};
 	foreach (@{$element->{ARRAY_LEN}}) {
-		next unless is_constant($_);
+		next unless (is_constant($_) and 
+			not has_property($element, "charset"));
 		pidl "[$_]";
 	}
 
@@ -199,11 +201,7 @@
 	}
 
 	if (has_property($e, "charset")) {
-		if ($e->{POINTERS} > 0) {
-			pidl "const char";
-		} else {
-			pidl "char";
-		}
+		pidl "const char";
 	} else {
 		pidl mapType($e->{TYPE});
 	}

Modified: branches/SAMBA_4_0/source/build/pidl/Parse/Pidl/Samba/NDR/Parser.pm
===================================================================
--- branches/SAMBA_4_0/source/build/pidl/Parse/Pidl/Samba/NDR/Parser.pm	2005-08-21 00:07:51 UTC (rev 9440)
+++ branches/SAMBA_4_0/source/build/pidl/Parse/Pidl/Samba/NDR/Parser.pm	2005-08-21 01:59:41 UTC (rev 9441)
@@ -61,6 +61,19 @@
 	return ($t->{NAME} eq "uint8") or ($t->{NAME} eq "string");
 }
 
+sub is_charset_array($$)
+{
+	my ($e,$l) = @_;
+
+	return 0 if ($l->{TYPE} ne "ARRAY");
+
+	my $nl = GetNextLevel($e,$l);
+
+	return 0 unless ($nl->{TYPE} eq "DATA");
+
+	return has_property($e, "charset");
+}
+
 sub get_pointer_to($)
 {
 	my $var_name = shift;
@@ -333,7 +346,7 @@
 		defer "}"
 	}
 
-	if (!$l->{IS_FIXED}) {
+	if (not $l->{IS_FIXED} and not is_charset_array($e, $l)) {
 		AllocateArrayLevel($e,$l,$ndr,$env,$size);
 	}
 
@@ -545,7 +558,8 @@
 
 	my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred);
 
-	if ($l->{TYPE} eq "ARRAY" and ($l->{IS_CONFORMANT} or $l->{IS_VARYING})) {
+	if ($l->{TYPE} eq "ARRAY" and ($l->{IS_CONFORMANT} or $l->{IS_VARYING} 
+		or is_charset_array($e, $l))) {
 		$var_name = get_pointer_to($var_name);
 	}
 
@@ -562,8 +576,8 @@
 			my $nl = GetNextLevel($e, $l);
 
 			# Allow speedups for arrays of scalar types
-			if (has_property($e, "charset")) {
-				pidl "NDR_CHECK(ndr_push_charset($ndr, $ndr_flags, $var_name, $length, sizeof(" . Parse::Pidl::Typelist::mapType($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));";
+			if (is_charset_array($e,$l)) {
+				pidl "NDR_CHECK(ndr_push_charset($ndr, $ndr_flags, $var_name, $length, sizeof(" . mapType($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));";
 				return;
 			} elsif (has_fast_array($e,$l)) {
 				pidl "NDR_CHECK(ndr_push_array_$nl->{DATA_TYPE}($ndr, $ndr_flags, $var_name, $length));";
@@ -592,7 +606,7 @@
 			pidl "}";
 		}
 	} elsif ($l->{TYPE} eq "ARRAY" and not has_fast_array($e,$l) and
-		not has_property($e, "charset")) {
+		not is_charset_array($e, $l)) {
 		my $length = ParseExpr($l->{LENGTH_IS}, $env);
 		my $counter = "cntr_$e->{NAME}_$l->{LEVEL_INDEX}";
 
@@ -690,7 +704,8 @@
 		} elsif ($l->{TYPE} eq "ARRAY") {
 			my $length;
 
-			if ($l->{IS_CONFORMANT} or $l->{IS_VARYING}) { 
+			if ($l->{IS_CONFORMANT} or $l->{IS_VARYING} or 
+				is_charset_array($e,$l)) { 
 				$var_name = get_pointer_to($var_name); 
 			}
 			
@@ -700,7 +715,7 @@
 				$length = ParseExpr($l->{LENGTH_IS}, $env);
 			}
 
-			if (has_property($e, "charset")) {
+			if (is_charset_array($e,$l)) {
 				pidl "ndr_print_string(ndr, \"$e->{NAME}\", $var_name);";
 				last;
 			} elsif (has_fast_array($e, $l)) {
@@ -741,7 +756,7 @@
 			}
 			pidl "ndr->depth--;";
 		} elsif (($l->{TYPE} eq "ARRAY")
-			and not has_property($e, "charset")
+			and not is_charset_array($e,$l)
 			and not has_fast_array($e,$l)) {
 			pidl "free(idx_$l->{LEVEL_INDEX});";
 			deindent;
@@ -895,7 +910,8 @@
 
 	my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred);
 
-	if ($l->{TYPE} eq "ARRAY" and ($l->{IS_VARYING} or $l->{IS_CONFORMANT})) {
+	if ($l->{TYPE} eq "ARRAY" and ($l->{IS_VARYING} or $l->{IS_CONFORMANT} 
+		or is_charset_array($e,$l))) {
 		$var_name = get_pointer_to($var_name);
 	}
 
@@ -910,8 +926,8 @@
 
 			my $nl = GetNextLevel($e, $l);
 
-			if (has_property($e, "charset")) {
-				pidl "NDR_CHECK(ndr_pull_charset($ndr, $ndr_flags, ".get_pointer_to($var_name).", $length, sizeof(" . Parse::Pidl::Typelist::mapType($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));";
+			if (is_charset_array($e,$l)) {
+				pidl "NDR_CHECK(ndr_pull_charset($ndr, $ndr_flags, ".get_pointer_to($var_name).", $length, sizeof(" . mapType($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));";
 				return;
 			} elsif (has_fast_array($e, $l)) {
 				pidl "NDR_CHECK(ndr_pull_array_$nl->{DATA_TYPE}($ndr, $ndr_flags, $var_name, $length));";
@@ -958,7 +974,7 @@
 			pidl "}";
 		}
 	} elsif ($l->{TYPE} eq "ARRAY" and 
-			not has_fast_array($e,$l) and not has_property($e, "charset")) {
+			not has_fast_array($e,$l) and not is_charset_array($e, $l)) {
 		my $length = ParseExpr($l->{LENGTH_IS}, $env);
 		my $counter = "cntr_$e->{NAME}_$l->{LEVEL_INDEX}";
 		my $array_name = $var_name;
@@ -1162,7 +1178,7 @@
 {
 	my($enum,$name) = @_;
 	my($type_fn) = $enum->{BASE_TYPE};
-	my($type_v_decl) = Parse::Pidl::Typelist::mapType($type_fn);
+	my($type_v_decl) = mapType($type_fn);
 
 	pidl "$type_v_decl v;";
 	start_flags($enum);
@@ -1237,7 +1253,7 @@
 {
 	my($bitmap,$name) = @_;
 	my $type_fn = $bitmap->{BASE_TYPE};
-	my($type_decl) = Parse::Pidl::Typelist::mapType($bitmap->{BASE_TYPE});
+	my($type_decl) = mapType($bitmap->{BASE_TYPE});
 
 	pidl "$type_decl v;";
 	start_flags($bitmap);
@@ -1252,7 +1268,7 @@
 sub ParseBitmapPrintElement($$$)
 {
 	my($e,$bitmap,$name) = @_;
-	my($type_decl) = Parse::Pidl::Typelist::mapType($bitmap->{BASE_TYPE});
+	my($type_decl) = mapType($bitmap->{BASE_TYPE});
 	my($type_fn) = $bitmap->{BASE_TYPE};
 	my($flag);
 
@@ -1270,7 +1286,7 @@
 sub ParseBitmapPrint($$)
 {
 	my($bitmap,$name) = @_;
-	my($type_decl) = Parse::Pidl::Typelist::mapType($bitmap->{TYPE});
+	my($type_decl) = mapType($bitmap->{TYPE});
 	my($type_fn) = $bitmap->{BASE_TYPE};
 
 	start_flags($bitmap);
@@ -1345,7 +1361,7 @@
 
 	foreach my $l (@{$e->{LEVELS}}) {
 		next if has_fast_array($e,$l);
-		next if has_property($e, "charset");
+		next if is_charset_array($e,$l);
 		if ($l->{TYPE} eq "ARRAY") {
 			pidl "uint32_t cntr_$e->{NAME}_$l->{LEVEL_INDEX};";
 		}
@@ -1358,7 +1374,7 @@
 	my $l = shift;
 
 	return 0 if has_fast_array($e,$l);
-	return 0 if (has_property($e, "charset") and ($l->{TYPE} ne "POINTER"));
+	return 0 if is_charset_array($e,$l);
 	return 1 if (($l->{TYPE} eq "ARRAY") and not $l->{IS_FIXED});
 
 	if (($l->{TYPE} eq "POINTER") and ($l->{POINTER_TYPE} eq "ref")) {
@@ -1639,7 +1655,7 @@
 		if (Parse::Pidl::Typelist::typeIs($switch_type, "ENUM")) {
 			$switch_type = Parse::Pidl::Typelist::enum_type_fn(getType($switch_type));
 		}
-		pidl Parse::Pidl::Typelist::mapType($switch_type) . " _level;";
+		pidl mapType($switch_type) . " _level;";
 	}
 
 	my %double_cases = ();
@@ -1944,8 +1960,6 @@
 {
 	my ($e,$l,$ndr,$env,$size) = @_;
 
-	return if (has_property($e, "charset"));
-
 	my $var = ParseExpr($e->{NAME}, $env);
 
 	check_null_pointer($size);

Modified: branches/SAMBA_4_0/source/librpc/ndr/ndr_string.c
===================================================================
--- branches/SAMBA_4_0/source/librpc/ndr/ndr_string.c	2005-08-21 00:07:51 UTC (rev 9440)
+++ branches/SAMBA_4_0/source/librpc/ndr/ndr_string.c	2005-08-21 01:59:41 UTC (rev 9441)
@@ -647,7 +647,7 @@
 	
 	NDR_PUSH_NEED_BYTES(ndr, required);
 	ret = convert_string(CH_UNIX, chset, 
-			     var, length,
+			     var, strlen(var),
 			     ndr->data+ndr->offset, required);
 	if (ret == -1) {
 		return ndr_push_error(ndr, NDR_ERR_CHARCNV, 



More information about the samba-cvs mailing list