1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00

r356: Start of auto-generated client functions. Tridge can you take a look

and tell me what you think?  Output does not compile yet.
This commit is contained in:
Tim Potter 2004-04-25 22:58:18 +00:00 committed by Gerald (Jerry) Carter
parent 0be7a866dc
commit 65692c9a93
3 changed files with 136 additions and 1 deletions

View File

@ -0,0 +1,127 @@
###################################################
# clientfs boilerplate generator
# Copyright tpot@samba.org 2004
# released under the GNU GPL
package IdlClientFns;
use strict;
my($res);
sub pidl($)
{
$res .= shift;
}
use Data::Dumper;
#####################################################################
# produce boilerplate code for a interface
sub Boilerplate_ClientFns($)
{
my($interface) = shift;
my($data) = $interface->{DATA};
my $name = $interface->{NAME};
foreach my $d (@{$data}) {
if ($d->{TYPE} eq "FUNCTION") {
pidl "/*\n";
pidl Dumper($d);
pidl "\n*/\n\n";
pidl "$d->{RETURN_TYPE} $d->{NAME}(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx";
my $count = 0, my $i = 0;
foreach my $a (@{$d->{DATA}}) {
$count++;
}
pidl ", ", if $count > 0;
foreach my $a (@{$d->{DATA}}) {
pidl "/* [";
if ($a->{PROPERTIES}->{in}) {
pidl "in";
if ($a->{PROPERTIES}->{out} or
$a->{PROPERTIES}->{ref}) {
pidl ",";
}
}
if ($a->{PROPERTIES}->{out}) {
pidl "out";
if ($a->{PROPERTIES}->{ref}) {
pidl ",";
}
}
if ($a->{PROPERTIES}->{ref}) {
pidl "ref";
}
pidl "] */ ";
pidl "struct ", if $a->{TYPE} eq "policy_handle";
pidl "$a->{TYPE} ";
if ($a->{PROPERTIES}->{out}) {
pidl "*";
}
if (!$a->{PROPERTIES}->{ref}) {
pidl "*", if $a->{POINTERS};
}
pidl "$a->{NAME}";
$i++;
pidl ", ", if $i < $count;
}
pidl ")\n";
pidl "{\n";
pidl "\tstruct $d->{NAME} r;\n";
pidl "\tNTSTATUS status;\n";
pidl "\n";
foreach $a (@{$d->{DATA}}) {
if ($a->{PROPERTIES}->{in}) {
pidl "\tr.in.$a->{NAME} = $a->{NAME};\n";
}
if ($a->{PROPERTIES}->{out}) {
pidl "\tr.out.$a->{NAME} = $a->{NAME};\n";
}
}
pidl "\n";
pidl "\tstatus = dcerpc_$d->{NAME}(p, mem_ctx, &r);\n";
pidl "\n";
pidl "\treturn NT_STATUS_OK;\n";
pidl "}\n\n";
}
}
}
#####################################################################
# parse a parsed IDL structure back into an IDL file
sub Parse($)
{
my($idl) = shift;
$res = "/* dcerpc client functions generated by pidl */\n\n";
$res .= "#include \"includes.h\"\n\n";
foreach my $x (@{$idl}) {
if ($x->{TYPE} eq "INTERFACE") {
Boilerplate_ClientFns($x);
}
}
return $res;
}
1;

View File

@ -17,6 +17,7 @@ use idl;
use dump;
use header;
use server;
use clientfns;
use parser;
use eparser;
use validator;
@ -31,6 +32,7 @@ my($opt_header) = 0;
my($opt_template) = 0;
my($opt_server) = 0;
my($opt_parser) = 0;
my($opt_clientfns) = 0;
my($opt_eparser) = 0;
my($opt_keep) = 0;
my($opt_output);
@ -84,6 +86,7 @@ GetOptions (
'server' => \$opt_server,
'template' => \$opt_template,
'parser' => \$opt_parser,
'clientfns' => \$opt_clientfns,
'eparser' => \$opt_eparser,
'diff' => \$opt_diff,
'keep' => \$opt_keep
@ -142,6 +145,11 @@ sub process_file($)
IdlParser::Parse($pidl, $parser);
}
if ($opt_clientfns) {
my($clientfns) = util::ChangeExtension($output, "_c.c");
util::FileSave($clientfns, IdlClientFns::Parse($pidl));
}
if ($opt_eparser) {
my($parser) = util::ChangeExtension($output, ".c");
util::FileSave($parser, IdlEParser::Parse($pidl));

View File

@ -4,7 +4,7 @@ FULLBUILD=$1
[ -d librpc/gen_ndr ] || mkdir -p librpc/gen_ndr || exit 1
PIDL="./build/pidl/pidl.pl --output librpc/gen_ndr/ndr_ --parse --header --parser --server"
PIDL="./build/pidl/pidl.pl --output librpc/gen_ndr/ndr_ --parse --header --parser --server --clientfns"
TABLES="./build/pidl/tables.pl --output librpc/gen_ndr/tables"
if [ x$FULLBUILD = xFULL ]; then