diff options
| -rw-r--r-- | pidl/lib/Parse/Pidl/Compat.pm | 4 | ||||
| -rw-r--r-- | pidl/lib/Parse/Pidl/NDR.pm | 3 | ||||
| -rw-r--r-- | pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm | 17 | 
3 files changed, 21 insertions, 3 deletions
diff --git a/pidl/lib/Parse/Pidl/Compat.pm b/pidl/lib/Parse/Pidl/Compat.pm index 1b49c439c4..c248677747 100644 --- a/pidl/lib/Parse/Pidl/Compat.pm +++ b/pidl/lib/Parse/Pidl/Compat.pm @@ -125,6 +125,10 @@ sub CheckElement($)  		warning($e, "relative() pointer property not supported");  	} +	if (has_property($e, "relative_short")) { +		warning($e, "relative_short() pointer property not supported"); +	} +  	if (has_property($e, "flag")) {  		warning($e, "ignoring flag() property");  	} diff --git a/pidl/lib/Parse/Pidl/NDR.pm b/pidl/lib/Parse/Pidl/NDR.pm index 4e680b336f..d326f67040 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 af28bda108..bd6909361b 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,6 +1175,8 @@ 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}));"); +	} 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 +1197,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 +1478,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;  		}  	}  | 
