diff options
author | Andrew Tridgell <tridge@samba.org> | 2005-07-08 03:33:32 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:19:20 -0500 |
commit | 7fded3c856735050e7d72972da8bc2cd19f01cd8 (patch) | |
tree | d04267c6eb16b1006b54384158712b38bde62178 /source4/build/pidl | |
parent | 1e1a96eea6c340eb0fd867f942f176c13d856c5f (diff) | |
download | samba-7fded3c856735050e7d72972da8bc2cd19f01cd8.tar.gz samba-7fded3c856735050e7d72972da8bc2cd19f01cd8.tar.bz2 samba-7fded3c856735050e7d72972da8bc2cd19f01cd8.zip |
r8215: switched the pull side of the ejs generator over to the recursive LEVELS based approach.
This allows for much more complex structure mappings to be generated.
(This used to be commit 49fc14d13291b02f7b16ab0eefe7bfb26f51b1c8)
Diffstat (limited to 'source4/build/pidl')
-rw-r--r-- | source4/build/pidl/ejs.pm | 88 |
1 files changed, 57 insertions, 31 deletions
diff --git a/source4/build/pidl/ejs.pm b/source4/build/pidl/ejs.pm index db8db00014..1b5c34510c 100644 --- a/source4/build/pidl/ejs.pm +++ b/source4/build/pidl/ejs.pm @@ -90,60 +90,87 @@ sub get_value_of($) ########################### # pull a scalar element -sub EjsPullScalar($$) +sub EjsPullScalar($$$$$) { - my $e = shift; - my $env = shift; - my $var = util::ParseExpr($e->{NAME}, $env); - my $ptr = get_pointer_to($var); - pidl "\tNDR_CHECK(ejs_pull_$e->{TYPE}(ejs, v, \"$e->{NAME}\", $ptr));\n"; + my ($e, $l, $var, $name, $env) = @_; + $var = get_pointer_to($var); + pidl "\tNDR_CHECK(ejs_pull_$e->{TYPE}(ejs, v, $name, $var));\n"; +} + +########################### +# pull a pointer element +sub EjsPullPointer($$$$$) +{ + my ($e, $l, $var, $name, $env) = @_; + pidl "EJS_ALLOC(ejs, $var);\n"; + $var = get_value_of($var); + EjsPullElement($e, Ndr::GetNextLevel($e, $l), $var, $name, $env); } ########################### # pull a string element -sub EjsPullString($$$) +sub EjsPullString($$$$$) { - my $e = shift; - my $l = shift; - my $env = shift; - my $var = util::ParseExpr($e->{NAME}, $env); - my $ptr = get_pointer_to($var); - pidl "\tNDR_CHECK(ejs_pull_string(ejs, v, \"$e->{NAME}\", $ptr));\n"; + my ($e, $l, $var, $name, $env) = @_; + $var = get_pointer_to($var); + pidl "\tNDR_CHECK(ejs_pull_string(ejs, v, $name, $var));\n"; } ########################### # pull an arrar element -# only handles a very limited range of array types so far -sub EjsPullArray($$$) +sub EjsPullArray($$$$$) { - my $e = shift; - my $l = shift; - my $env = shift; + my ($e, $l, $var, $name, $env) = @_; my $length = util::ParseExpr($l->{LENGTH_IS}, $env); - my $var = util::ParseExpr($e->{NAME}, $env); - my $ptr = get_pointer_to($var); - pidl "\tNDR_CHECK(ejs_pull_array(ejs, v, \"$e->{NAME}\", $length, sizeof($var\[0]), (void **)$ptr, (ejs_pull_t)ejs_pull_$e->{TYPE}));\n"; + pidl "{ uint32_t i; EJS_ALLOC_N(ejs, $var, $length); for (i=0;i<$length;i++) {\n"; + pidl "\tconst char *id = talloc_asprintf(ejs, \"%s.%u\", $name, i);\n"; + EjsPullElement($e, Ndr::GetNextLevel($e, $l), $var . "[i]", "id", $env); + pidl "}\nejs_push_uint32(ejs, v, $name \".length\", &i); }\n"; +} + +########################### +# pull a switch element +sub EjsPullSwitch($$$$$) +{ + my ($e, $l, $var, $name, $env) = @_; + my $switch_var = util::ParseExpr($l->{SWITCH_IS}, $env); + pidl "ejs_set_switch(ejs, $switch_var);\n"; + EjsPullElement($e, Ndr::GetNextLevel($e, $l), $var, $name, $env); } ########################### # pull a structure element -sub EjsPullElement($$) +sub EjsPullElement($$$$$) { - my $e = shift; - my $env = shift; - my $l = $e->{LEVELS}[0]; + my ($e, $l, $var, $name, $env) = @_; if (util::has_property($e, "charset")) { - EjsPullString($e, $l, $env); + EjsPullString($e, $l, $var, $name, $env); } elsif ($l->{TYPE} eq "ARRAY") { - EjsPullArray($e, $l, $env); + EjsPullArray($e, $l, $var, $name, $env); } elsif ($l->{TYPE} eq "DATA") { - EjsPullScalar($e, $env); + EjsPullScalar($e, $l, $var, $name, $env); + } elsif (($l->{TYPE} eq "POINTER")) { + EjsPullPointer($e, $l, $var, $name, $env); + } elsif (($l->{TYPE} eq "SWITCH")) { + EjsPullSwitch($e, $l, $var, $name, $env); } else { pidl "return ejs_panic(ejs, \"unhandled pull type $l->{TYPE}\");\n"; } } +############################################# +# pull a structure/union element at top level +sub EjsPullElementTop($$) +{ + my $e = shift; + my $env = shift; + my $l = $e->{LEVELS}[0]; + my $var = util::ParseExpr($e->{NAME}, $env); + my $name = "\"$e->{NAME}\""; + EjsPullElement($e, $l, $var, $name, $env); +} + ########################### # pull a struct sub EjsStructPull($$) @@ -154,7 +181,7 @@ sub EjsStructPull($$) pidl "\nstatic NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, struct $name *r)\n{\n"; pidl "\tNDR_CHECK(ejs_pull_struct_start(ejs, &v, name));\n"; foreach my $e (@{$d->{ELEMENTS}}) { - EjsPullElement($e, $env); + EjsPullElementTop($e, $env); } pidl "\treturn NT_STATUS_OK;\n"; pidl "}\n\n"; @@ -227,7 +254,7 @@ sub EjsPullFunction($) foreach my $e (@{$d->{ELEMENTS}}) { next unless (grep(/in/, @{$e->{DIRECTION}})); - EjsPullElement($e, $env); + EjsPullElementTop($e, $env); } pidl "\treturn NT_STATUS_OK;\n"; @@ -274,7 +301,6 @@ sub EjsPushSwitch($$$$$) ########################### # push an arrar element -# only handles a very limited range of array types so far sub EjsPushArray($$$$$) { my ($e, $l, $var, $name, $env) = @_; |