mirror of
https://github.com/samba-team/samba.git
synced 2025-02-03 13:47:25 +03:00
pidl: Move Generate*Env functions to Parse::Pidl::Samba4::Header because they only work with the structures generated by that file.
(This used to be commit 9aeb7f31b0fc3b9679e5af07e65e79bc8073c4e1)
This commit is contained in:
parent
be01d08024
commit
a99dff8660
@ -9,7 +9,7 @@ package Parse::Pidl::Samba3::ClientNDR;
|
||||
|
||||
use Exporter;
|
||||
@ISA = qw(Exporter);
|
||||
@EXPORT_OK = qw(GenerateFunctionInEnv ParseFunction $res $res_hdr);
|
||||
@EXPORT_OK = qw(ParseFunction $res $res_hdr);
|
||||
|
||||
use strict;
|
||||
use Parse::Pidl qw(fatal warning);
|
||||
@ -17,7 +17,7 @@ use Parse::Pidl::Typelist qw(hasType getType mapTypeName scalar_is_reference);
|
||||
use Parse::Pidl::Util qw(has_property is_constant ParseExpr);
|
||||
use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred);
|
||||
use Parse::Pidl::Samba4 qw(DeclLong);
|
||||
use Parse::Pidl::Samba4::NDR::Parser qw(GenerateFunctionInEnv);
|
||||
use Parse::Pidl::Samba4::Header qw(GenerateFunctionInEnv);
|
||||
|
||||
use vars qw($VERSION);
|
||||
$VERSION = '0.01';
|
||||
|
@ -15,7 +15,7 @@ use Parse::Pidl::Typelist qw(typeHasBody);
|
||||
use Parse::Pidl::CUtil qw(get_pointer_to get_value_of);
|
||||
use Parse::Pidl::Util qw(has_property ParseExpr);
|
||||
use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel);
|
||||
use Parse::Pidl::Samba4::NDR::Parser qw(GenerateStructEnv GenerateFunctionInEnv
|
||||
use Parse::Pidl::Samba4::Header qw(GenerateStructEnv GenerateFunctionInEnv
|
||||
GenerateFunctionOutEnv);
|
||||
|
||||
use vars qw($VERSION);
|
||||
|
@ -6,10 +6,15 @@
|
||||
|
||||
package Parse::Pidl::Samba4::Header;
|
||||
|
||||
require Exporter;
|
||||
|
||||
@ISA = qw(Exporter);
|
||||
@EXPORT_OK = qw(GenerateFunctionInEnv GenerateFunctionOutEnv EnvSubstituteValue GenerateStructEnv);
|
||||
|
||||
use strict;
|
||||
use Parse::Pidl qw(fatal);
|
||||
use Parse::Pidl::Typelist qw(mapTypeName scalar_is_reference);
|
||||
use Parse::Pidl::Util qw(has_property is_constant unmake_str);
|
||||
use Parse::Pidl::Util qw(has_property is_constant unmake_str ParseExpr);
|
||||
use Parse::Pidl::Samba4 qw(is_intree ElementStars ArrayBrackets choose_header);
|
||||
|
||||
use vars qw($VERSION);
|
||||
@ -406,4 +411,68 @@ sub Parse($)
|
||||
return $res;
|
||||
}
|
||||
|
||||
sub GenerateStructEnv($$)
|
||||
{
|
||||
my ($x, $v) = @_;
|
||||
my %env;
|
||||
|
||||
foreach my $e (@{$x->{ELEMENTS}}) {
|
||||
$env{$e->{NAME}} = "$v->$e->{NAME}";
|
||||
}
|
||||
|
||||
$env{"this"} = $v;
|
||||
|
||||
return \%env;
|
||||
}
|
||||
|
||||
sub EnvSubstituteValue($$)
|
||||
{
|
||||
my ($env,$s) = @_;
|
||||
|
||||
# Substitute the value() values in the env
|
||||
foreach my $e (@{$s->{ELEMENTS}}) {
|
||||
next unless (defined(my $v = has_property($e, "value")));
|
||||
|
||||
$env->{$e->{NAME}} = ParseExpr($v, $env, $e);
|
||||
}
|
||||
|
||||
return $env;
|
||||
}
|
||||
|
||||
sub GenerateFunctionInEnv($;$)
|
||||
{
|
||||
my ($fn, $base) = @_;
|
||||
my %env;
|
||||
|
||||
$base = "r->" unless defined($base);
|
||||
|
||||
foreach my $e (@{$fn->{ELEMENTS}}) {
|
||||
if (grep (/in/, @{$e->{DIRECTION}})) {
|
||||
$env{$e->{NAME}} = $base."in.$e->{NAME}";
|
||||
}
|
||||
}
|
||||
|
||||
return \%env;
|
||||
}
|
||||
|
||||
sub GenerateFunctionOutEnv($;$)
|
||||
{
|
||||
my ($fn, $base) = @_;
|
||||
my %env;
|
||||
|
||||
$base = "r->" unless defined($base);
|
||||
|
||||
foreach my $e (@{$fn->{ELEMENTS}}) {
|
||||
if (grep (/out/, @{$e->{DIRECTION}})) {
|
||||
$env{$e->{NAME}} = $base."out.$e->{NAME}";
|
||||
} elsif (grep (/in/, @{$e->{DIRECTION}})) {
|
||||
$env{$e->{NAME}} = $base."in.$e->{NAME}";
|
||||
}
|
||||
}
|
||||
|
||||
return \%env;
|
||||
}
|
||||
|
||||
|
||||
|
||||
1;
|
||||
|
@ -9,7 +9,7 @@ package Parse::Pidl::Samba4::NDR::Parser;
|
||||
|
||||
require Exporter;
|
||||
@ISA = qw(Exporter);
|
||||
@EXPORT_OK = qw(check_null_pointer GenerateFunctionInEnv GenerateFunctionOutEnv EnvSubstituteValue GenerateStructEnv NeededFunction NeededElement NeededType $res NeededInterface TypeFunctionName ParseElementPrint);
|
||||
@EXPORT_OK = qw(check_null_pointer NeededFunction NeededElement NeededType $res NeededInterface TypeFunctionName ParseElementPrint);
|
||||
|
||||
use strict;
|
||||
use Parse::Pidl::Typelist qw(hasType getType mapTypeName typeHasBody);
|
||||
@ -17,6 +17,7 @@ use Parse::Pidl::Util qw(has_property ParseExpr ParseExprExt print_uuid);
|
||||
use Parse::Pidl::CUtil qw(get_pointer_to get_value_of);
|
||||
use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred);
|
||||
use Parse::Pidl::Samba4 qw(is_intree choose_header);
|
||||
use Parse::Pidl::Samba4::Header qw(GenerateFunctionInEnv GenerateFunctionOutEnv EnvSubstituteValue GenerateStructEnv);
|
||||
use Parse::Pidl qw(warning);
|
||||
|
||||
use vars qw($VERSION);
|
||||
@ -193,68 +194,6 @@ sub end_flags($$)
|
||||
}
|
||||
}
|
||||
|
||||
sub GenerateStructEnv($$)
|
||||
{
|
||||
my ($x, $v) = @_;
|
||||
my %env;
|
||||
|
||||
foreach my $e (@{$x->{ELEMENTS}}) {
|
||||
$env{$e->{NAME}} = "$v->$e->{NAME}";
|
||||
}
|
||||
|
||||
$env{"this"} = $v;
|
||||
|
||||
return \%env;
|
||||
}
|
||||
|
||||
sub EnvSubstituteValue($$)
|
||||
{
|
||||
my ($env,$s) = @_;
|
||||
|
||||
# Substitute the value() values in the env
|
||||
foreach my $e (@{$s->{ELEMENTS}}) {
|
||||
next unless (defined(my $v = has_property($e, "value")));
|
||||
|
||||
$env->{$e->{NAME}} = ParseExpr($v, $env, $e);
|
||||
}
|
||||
|
||||
return $env;
|
||||
}
|
||||
|
||||
sub GenerateFunctionInEnv($;$)
|
||||
{
|
||||
my ($fn, $base) = @_;
|
||||
my %env;
|
||||
|
||||
$base = "r->" unless defined($base);
|
||||
|
||||
foreach my $e (@{$fn->{ELEMENTS}}) {
|
||||
if (grep (/in/, @{$e->{DIRECTION}})) {
|
||||
$env{$e->{NAME}} = $base."in.$e->{NAME}";
|
||||
}
|
||||
}
|
||||
|
||||
return \%env;
|
||||
}
|
||||
|
||||
sub GenerateFunctionOutEnv($;$)
|
||||
{
|
||||
my ($fn, $base) = @_;
|
||||
my %env;
|
||||
|
||||
$base = "r->" unless defined($base);
|
||||
|
||||
foreach my $e (@{$fn->{ELEMENTS}}) {
|
||||
if (grep (/out/, @{$e->{DIRECTION}})) {
|
||||
$env{$e->{NAME}} = $base."out.$e->{NAME}";
|
||||
} elsif (grep (/in/, @{$e->{DIRECTION}})) {
|
||||
$env{$e->{NAME}} = $base."in.$e->{NAME}";
|
||||
}
|
||||
}
|
||||
|
||||
return \%env;
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
# parse the data of an array - push side
|
||||
sub ParseArrayPushHeader($$$$$$)
|
||||
|
@ -4,12 +4,14 @@
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Test::More tests => 16;
|
||||
use Test::More tests => 27;
|
||||
use FindBin qw($RealBin);
|
||||
use lib "$RealBin";
|
||||
use Util;
|
||||
use Parse::Pidl::Util qw(MyDumper);
|
||||
use Parse::Pidl::Samba4::Header;
|
||||
use Parse::Pidl::Samba4::Header qw(
|
||||
GenerateFunctionInEnv GenerateFunctionOutEnv GenerateStructEnv
|
||||
EnvSubstituteValue);
|
||||
use Parse::Pidl::IDL qw(parse_string);
|
||||
use Parse::Pidl::NDR;
|
||||
|
||||
@ -56,3 +58,51 @@ like(parse_idl("interface p { typedef struct x { int p; } x; };"),
|
||||
|
||||
like(parse_idl("cpp_quote(\"some-foo\")"),
|
||||
qr/some-foo/sm, "cpp quote");
|
||||
|
||||
# Make sure GenerateFunctionInEnv and GenerateFunctionOutEnv work
|
||||
my $fn = { ELEMENTS => [ { DIRECTION => ["in"], NAME => "foo" } ] };
|
||||
is_deeply({ "foo" => "r->in.foo" }, GenerateFunctionInEnv($fn));
|
||||
|
||||
$fn = { ELEMENTS => [ { DIRECTION => ["out"], NAME => "foo" } ] };
|
||||
is_deeply({ "foo" => "r->out.foo" }, GenerateFunctionOutEnv($fn));
|
||||
|
||||
$fn = { ELEMENTS => [ { DIRECTION => ["out", "in"], NAME => "foo" } ] };
|
||||
is_deeply({ "foo" => "r->in.foo" }, GenerateFunctionInEnv($fn));
|
||||
|
||||
$fn = { ELEMENTS => [ { DIRECTION => ["out", "in"], NAME => "foo" } ] };
|
||||
is_deeply({ "foo" => "r->out.foo" }, GenerateFunctionOutEnv($fn));
|
||||
|
||||
$fn = { ELEMENTS => [ { DIRECTION => ["in"], NAME => "foo" } ] };
|
||||
is_deeply({ "foo" => "r->in.foo" }, GenerateFunctionOutEnv($fn));
|
||||
|
||||
$fn = { ELEMENTS => [ { DIRECTION => ["out"], NAME => "foo" } ] };
|
||||
is_deeply({ }, GenerateFunctionInEnv($fn));
|
||||
|
||||
$fn = { ELEMENTS => [ { NAME => "foo" }, { NAME => "bar" } ] };
|
||||
is_deeply({ foo => "r->foo", bar => "r->bar", this => "r" },
|
||||
GenerateStructEnv($fn, "r"));
|
||||
|
||||
$fn = { ELEMENTS => [ { NAME => "foo" }, { NAME => "bar" } ] };
|
||||
is_deeply({ foo => "some->complex.variable->foo",
|
||||
bar => "some->complex.variable->bar",
|
||||
this => "some->complex.variable" },
|
||||
GenerateStructEnv($fn, "some->complex.variable"));
|
||||
|
||||
$fn = { ELEMENTS => [ { NAME => "foo", PROPERTIES => { value => 3 }} ] };
|
||||
|
||||
my $env = GenerateStructEnv($fn, "r");
|
||||
EnvSubstituteValue($env, $fn);
|
||||
is_deeply($env, { foo => 3, this => "r" });
|
||||
|
||||
$fn = { ELEMENTS => [ { NAME => "foo" }, { NAME => "bar" } ] };
|
||||
$env = GenerateStructEnv($fn, "r");
|
||||
EnvSubstituteValue($env, $fn);
|
||||
is_deeply($env, { foo => 'r->foo', bar => 'r->bar', this => "r" });
|
||||
|
||||
$fn = { ELEMENTS => [ { NAME => "foo", PROPERTIES => { value => 0 }} ] };
|
||||
|
||||
$env = GenerateStructEnv($fn, "r");
|
||||
EnvSubstituteValue($env, $fn);
|
||||
is_deeply($env, { foo => 0, this => "r" });
|
||||
|
||||
|
||||
|
@ -4,15 +4,14 @@
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Test::More tests => 41;
|
||||
use Test::More tests => 30;
|
||||
use FindBin qw($RealBin);
|
||||
use lib "$RealBin";
|
||||
use Util;
|
||||
use strict;
|
||||
use Parse::Pidl::Util qw(MyDumper);
|
||||
use Parse::Pidl::Samba4::NDR::Parser qw(check_null_pointer
|
||||
GenerateFunctionInEnv GenerateFunctionOutEnv GenerateStructEnv
|
||||
EnvSubstituteValue NeededFunction NeededElement NeededType
|
||||
NeededFunction NeededElement NeededType
|
||||
NeededInterface TypeFunctionName ParseElementPrint);
|
||||
|
||||
my $output;
|
||||
@ -138,52 +137,6 @@ test_warnings("nofile:2: unknown dereferenced expression `r->in.bla'\n",
|
||||
|
||||
is($output, "if (r->in.bla == NULL) return;");
|
||||
|
||||
# Make sure GenerateFunctionInEnv and GenerateFunctionOutEnv work
|
||||
$fn = { ELEMENTS => [ { DIRECTION => ["in"], NAME => "foo" } ] };
|
||||
is_deeply({ "foo" => "r->in.foo" }, GenerateFunctionInEnv($fn));
|
||||
|
||||
$fn = { ELEMENTS => [ { DIRECTION => ["out"], NAME => "foo" } ] };
|
||||
is_deeply({ "foo" => "r->out.foo" }, GenerateFunctionOutEnv($fn));
|
||||
|
||||
$fn = { ELEMENTS => [ { DIRECTION => ["out", "in"], NAME => "foo" } ] };
|
||||
is_deeply({ "foo" => "r->in.foo" }, GenerateFunctionInEnv($fn));
|
||||
|
||||
$fn = { ELEMENTS => [ { DIRECTION => ["out", "in"], NAME => "foo" } ] };
|
||||
is_deeply({ "foo" => "r->out.foo" }, GenerateFunctionOutEnv($fn));
|
||||
|
||||
$fn = { ELEMENTS => [ { DIRECTION => ["in"], NAME => "foo" } ] };
|
||||
is_deeply({ "foo" => "r->in.foo" }, GenerateFunctionOutEnv($fn));
|
||||
|
||||
$fn = { ELEMENTS => [ { DIRECTION => ["out"], NAME => "foo" } ] };
|
||||
is_deeply({ }, GenerateFunctionInEnv($fn));
|
||||
|
||||
$fn = { ELEMENTS => [ { NAME => "foo" }, { NAME => "bar" } ] };
|
||||
is_deeply({ foo => "r->foo", bar => "r->bar", this => "r" },
|
||||
GenerateStructEnv($fn, "r"));
|
||||
|
||||
$fn = { ELEMENTS => [ { NAME => "foo" }, { NAME => "bar" } ] };
|
||||
is_deeply({ foo => "some->complex.variable->foo",
|
||||
bar => "some->complex.variable->bar",
|
||||
this => "some->complex.variable" },
|
||||
GenerateStructEnv($fn, "some->complex.variable"));
|
||||
|
||||
$fn = { ELEMENTS => [ { NAME => "foo", PROPERTIES => { value => 3 }} ] };
|
||||
|
||||
my $env = GenerateStructEnv($fn, "r");
|
||||
EnvSubstituteValue($env, $fn);
|
||||
is_deeply($env, { foo => 3, this => "r" });
|
||||
|
||||
$fn = { ELEMENTS => [ { NAME => "foo" }, { NAME => "bar" } ] };
|
||||
$env = GenerateStructEnv($fn, "r");
|
||||
EnvSubstituteValue($env, $fn);
|
||||
is_deeply($env, { foo => 'r->foo', bar => 'r->bar', this => "r" });
|
||||
|
||||
$fn = { ELEMENTS => [ { NAME => "foo", PROPERTIES => { value => 0 }} ] };
|
||||
|
||||
$env = GenerateStructEnv($fn, "r");
|
||||
EnvSubstituteValue($env, $fn);
|
||||
is_deeply($env, { foo => 0, this => "r" });
|
||||
|
||||
my $needed = {};
|
||||
NeededElement({ TYPE => "foo", REPRESENTATION_TYPE => "foo" }, "pull", $needed);
|
||||
is_deeply($needed, { ndr_pull_foo => 1 });
|
||||
|
@ -10,7 +10,7 @@ use lib "$RealBin";
|
||||
use Util;
|
||||
use Parse::Pidl::Util qw(MyDumper);
|
||||
use Parse::Pidl::Samba3::ClientNDR qw(ParseFunction);
|
||||
use Parse::Pidl::Samba4::NDR::Parser qw(GenerateFunctionInEnv GenerateFunctionOutEnv);
|
||||
use Parse::Pidl::Samba4::Header qw(GenerateFunctionInEnv GenerateFunctionOutEnv);
|
||||
|
||||
# Make sure GenerateFunctionInEnv and GenerateFunctionOutEnv work
|
||||
my $fn = { ELEMENTS => [ { DIRECTION => ["in"], NAME => "foo" } ] };
|
||||
|
Loading…
x
Reference in New Issue
Block a user