[PATCH 1/5] pidl: Introduce new directive: relative_short

Matthieu Patou mat at matws.net
Sat Dec 12 18:58:15 MST 2009


---
 pidl/lib/Parse/Pidl/NDR.pm               |    3 +++
 pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm |   20 ++++++++++++++++----
 2 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/pidl/lib/Parse/Pidl/NDR.pm b/pidl/lib/Parse/Pidl/NDR.pm
index 4e680b3..d326f67 100644
--- a/pidl/lib/Parse/Pidl/NDR.pm
+++ b/pidl/lib/Parse/Pidl/NDR.pm
@@ -351,6 +351,7 @@ sub pointer_type($)
 	return "sptr" if (has_property($e, "sptr"));
 	return "unique" if (has_property($e, "unique"));
 	return "relative" if (has_property($e, "relative"));
+	return "relative_short" if (has_property($e, "relative_short"));
 	return "ignore" if (has_property($e, "ignore"));
 
 	return undef;
@@ -902,6 +903,7 @@ my %property_list = (
 	"unique"		=> ["ELEMENT"],
 	"ignore"		=> ["ELEMENT"],
 	"relative"		=> ["ELEMENT"],
+	"relative_short"	=> ["ELEMENT"],
 	"null_is_ffffffff" => ["ELEMENT"],
 	"relative_base"		=> ["TYPEDEF", "STRUCT", "UNION"],
 
@@ -1059,6 +1061,7 @@ sub ValidElement($)
 		has_property($e, "ptr") or
 		has_property($e, "unique") or
 		has_property($e, "relative") or
+		has_property($e, "relative_short") or
 		has_property($e, "ref"))) {
 		fatal($e, el_name($e) . " : pointer properties on non-pointer element\n");	
 	}
diff --git a/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm b/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
index af28bda..d574495 100644
--- a/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
+++ b/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
@@ -573,6 +573,9 @@ sub ParseElementPushLevel
 			if ($l->{POINTER_TYPE} eq "relative") {
 				$self->pidl("NDR_CHECK(ndr_push_relative_ptr2($ndr, $var_name));");
 			}
+			if ($l->{POINTER_TYPE} eq "relative_short") {
+				$self->pidl("NDR_CHECK(ndr_push_short_relative_ptr2($ndr, $var_name));");
+			}
 		}
 		$var_name = get_value_of($var_name);
 		$self->ParseElementPushLevel($e, GetNextLevel($e, $l), $ndr, $var_name, $env, 1, 1);
@@ -670,6 +673,8 @@ sub ParsePtrPush($$$$$)
 		}
 	} elsif ($l->{POINTER_TYPE} eq "relative") {
 		$self->pidl("NDR_CHECK(ndr_push_relative_ptr1($ndr, $var_name));");
+	} elsif ($l->{POINTER_TYPE} eq "relative_short") {
+		$self->pidl("NDR_CHECK(ndr_push_short_relative_ptr1($ndr, $var_name));");
 	} elsif ($l->{POINTER_TYPE} eq "unique") {
 		$self->pidl("NDR_CHECK(ndr_push_unique_ptr($ndr, $var_name));");
 	} elsif ($l->{POINTER_TYPE} eq "full") {
@@ -1038,7 +1043,7 @@ sub ParseElementPullLevel
 			$self->pidl("if ($var_name) {");
 			$self->indent;
 
-			if ($l->{POINTER_TYPE} eq "relative") {
+			if ($l->{POINTER_TYPE} eq "relative" or $l->{POINTER_TYPE} eq "relative_short") {
 				$self->pidl("uint32_t _relative_save_offset;");
 				$self->pidl("_relative_save_offset = $ndr->offset;");
 				$self->pidl("NDR_CHECK(ndr_pull_relative_ptr2($ndr, $var_name));");
@@ -1170,7 +1175,10 @@ sub ParsePtrPull($$$$$)
 		 ($l->{POINTER_TYPE} eq "relative") or
 		 ($l->{POINTER_TYPE} eq "full")) {
 		$self->pidl("NDR_CHECK(ndr_pull_generic_ptr($ndr, &_ptr_$e->{NAME}));");
-	} else {
+	} elsif ($l->{POINTER_TYPE} eq "relative_short") {
+		$self->pidl("NDR_CHECK(ndr_pull_relative_ptr_short($ndr, &_ptr_$e->{NAME}));");
+  }
+  else {
 		die("Unhandled pointer type $l->{POINTER_TYPE}");
 	}
 
@@ -1190,7 +1198,7 @@ sub ParsePtrPull($$$$$)
 	}
 
 	#$self->pidl("memset($var_name, 0, sizeof($var_name));");
-	if ($l->{POINTER_TYPE} eq "relative") {
+	if ($l->{POINTER_TYPE} eq "relative" or $l->{POINTER_TYPE} eq "relative_short") {
 		$self->pidl("NDR_CHECK(ndr_pull_relative_ptr1($ndr, $var_name, _ptr_$e->{NAME}));");
 	}
 	$self->deindent;
@@ -1471,9 +1479,13 @@ sub DeclarePtrVariables($$)
 {
 	my ($self,$e) = @_;
 	foreach my $l (@{$e->{LEVELS}}) {
+		my $size = 32;
 		if ($l->{TYPE} eq "POINTER" and 
 			not ($l->{POINTER_TYPE} eq "ref" and $l->{LEVEL} eq "TOP")) {
-			$self->pidl("uint32_t _ptr_$e->{NAME};");
+			if ($l->{POINTER_TYPE} eq "relative_short") {
+				$size = 16;
+			}
+			$self->pidl("uint${size}_t _ptr_$e->{NAME};");
 			last;
 		}
 	}
-- 
1.6.3.3


--------------080502050808070106020509
Content-Type: text/x-patch;
 name="0002-ndr-add-supporting-C-functions-for-directive-relativ.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename*0="0002-ndr-add-supporting-C-functions-for-directive-relativ.pa";
 filename*1="tch"



More information about the samba-technical mailing list