Parse-Pidl
view release on metacpan or search on metacpan
lib/Parse/Pidl/Samba4/NDR/Parser.pm view on Meta::CPAN
pidl "}";
}
} elsif ($l->{TYPE} eq "ARRAY" and 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}";
$var_name = $var_name . "[$counter]";
if (($primitives and not $l->{IS_DEFERRED}) or ($deferred and $l->{IS_DEFERRED})) {
pidl "for ($counter = 0; $counter < $length; $counter++) {";
indent;
ParseElementPushLevel($e, GetNextLevel($e, $l), $ndr, $var_name, $env, 1, 0);
deindent;
pidl "}";
}
if ($deferred and ContainsDeferred($e, $l)) {
pidl "for ($counter = 0; $counter < $length; $counter++) {";
indent;
ParseElementPushLevel($e, GetNextLevel($e, $l), $ndr, $var_name, $env, 0, 1);
deindent;
pidl "}";
}
} elsif ($l->{TYPE} eq "SWITCH") {
ParseElementPushLevel($e, GetNextLevel($e, $l), $ndr, $var_name, $env, $primitives, $deferred);
}
}
#####################################################################
# parse scalars in a structure element
sub ParseElementPush($$$$$$)
{
my ($e,$ndr,$var_prefix,$env,$primitives,$deferred) = @_;
my $subndr = undef;
my $var_name = $var_prefix.$e->{NAME};
$var_name = append_prefix($e, $var_name);
return unless $primitives or ($deferred and ContainsDeferred($e, $e->{LEVELS}[0]));
start_flags($e);
if (my $value = has_property($e, "value")) {
$var_name = ParseExpr($value, $env);
}
ParseElementPushLevel($e, $e->{LEVELS}[0], $ndr, $var_name, $env, $primitives, $deferred);
end_flags($e);
}
#####################################################################
# parse a pointer in a struct element or function
sub ParsePtrPush($$$)
{
my ($e,$l,$var_name) = @_;
if ($l->{POINTER_TYPE} eq "ref") {
if ($l->{LEVEL} eq "EMBEDDED") {
pidl "NDR_CHECK(ndr_push_ref_ptr(ndr, $var_name));";
} else {
check_null_pointer(get_value_of($var_name));
}
} elsif ($l->{POINTER_TYPE} eq "relative") {
pidl "NDR_CHECK(ndr_push_relative_ptr1(ndr, $var_name));";
} elsif ($l->{POINTER_TYPE} eq "unique") {
pidl "NDR_CHECK(ndr_push_unique_ptr(ndr, $var_name));";
} elsif ($l->{POINTER_TYPE} eq "sptr") {
pidl "NDR_CHECK(ndr_push_sptr_ptr(ndr, $var_name));";
} else {
die("Unhandled pointer type $l->{POINTER_TYPE}");
}
}
#####################################################################
# print scalars in a structure element
sub ParseElementPrint($$$)
{
my($e,$var_name,$env) = @_;
$var_name = append_prefix($e, $var_name);
return if (has_property($e, "noprint"));
if (my $value = has_property($e, "value")) {
$var_name = "(ndr->flags & LIBNDR_PRINT_SET_VALUES)?" . ParseExpr($value,$env) . ":$var_name";
}
foreach my $l (@{$e->{LEVELS}}) {
if ($l->{TYPE} eq "POINTER") {
pidl "ndr_print_ptr(ndr, \"$e->{NAME}\", $var_name);";
pidl "ndr->depth++;";
if ($l->{POINTER_TYPE} ne "ref") {
pidl "if ($var_name) {";
indent;
}
$var_name = get_value_of($var_name);
} elsif ($l->{TYPE} eq "ARRAY") {
my $length;
if ($l->{IS_CONFORMANT} or $l->{IS_VARYING}) {
$var_name = get_pointer_to($var_name);
}
if ($l->{IS_ZERO_TERMINATED}) {
$length = "ndr_string_length($var_name, sizeof(*$var_name))";
} else {
$length = ParseExpr($l->{LENGTH_IS}, $env);
}
if (is_charset_array($e,$l)) {
pidl "ndr_print_string(ndr, \"$e->{NAME}\", $var_name);";
last;
} elsif (has_fast_array($e, $l)) {
my $nl = GetNextLevel($e, $l);
pidl "ndr_print_array_$nl->{DATA_TYPE}(ndr, \"$e->{NAME}\", $var_name, $length);";
last;
} else {
my $counter = "cntr_$e->{NAME}_$l->{LEVEL_INDEX}";
( run in 0.427 second using v1.01-cache-2.11-cpan-71847e10f99 )