mirror of
https://github.com/samba-team/samba.git
synced 2024-12-24 21:34:56 +03:00
r18471: Remove other Samba3 parser generator support as well - it's no
longer necessary as we can use libndr now.
(This used to be commit 22142a9f3d
)
This commit is contained in:
parent
e26ed8b3e2
commit
0eb9794e9f
@ -1,223 +0,0 @@
|
||||
###################################################
|
||||
# Samba3 NDR header generator for IDL structures
|
||||
# Copyright jelmer@samba.org 2005
|
||||
# released under the GNU GPL
|
||||
|
||||
package Parse::Pidl::Samba3::Header;
|
||||
|
||||
use strict;
|
||||
use Parse::Pidl::Typelist qw(hasType getType);
|
||||
use Parse::Pidl::Util qw(has_property ParseExpr);
|
||||
use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred);
|
||||
use Parse::Pidl::Samba3::Types qw(DeclShort StringType);
|
||||
|
||||
use vars qw($VERSION);
|
||||
$VERSION = '0.01';
|
||||
|
||||
my $res = "";
|
||||
my $tabs = "";
|
||||
sub indent() { $tabs.="\t"; }
|
||||
sub deindent() { $tabs = substr($tabs, 1); }
|
||||
sub pidl($) { $res .= $tabs.(shift)."\n"; }
|
||||
sub fatal($$) { my ($e,$s) = @_; die("$e->{ORIGINAL}->{FILE}:$e->{ORIGINAL}->{LINE}: $s\n"); }
|
||||
sub warning($$) { my ($e,$s) = @_; warn("$e->{ORIGINAL}->{FILE}:$e->{ORIGINAL}->{LINE}: $s\n"); }
|
||||
|
||||
sub ParseElement($)
|
||||
{
|
||||
my $e = shift;
|
||||
|
||||
foreach my $l (@{$e->{LEVELS}}) {
|
||||
if ($l->{TYPE} eq "POINTER") {
|
||||
next if ($l->{POINTER_TYPE} eq "ref" and $l->{LEVEL} eq "TOP");
|
||||
pidl "\tuint32 ptr$l->{POINTER_INDEX}_$e->{NAME};";
|
||||
} elsif ($l->{TYPE} eq "SWITCH") {
|
||||
} elsif ($l->{TYPE} eq "DATA") {
|
||||
my $n = DeclShort($e);
|
||||
pidl "\t$n;" if ($n);
|
||||
} elsif ($l->{TYPE} eq "ARRAY" and $l->{IS_ZERO_TERMINATED}) {
|
||||
my ($t,$f) = StringType($e,$l);
|
||||
pidl "\t" . uc($t) . " $e->{NAME};";
|
||||
return;
|
||||
} elsif ($l->{TYPE} eq "ARRAY") {
|
||||
if ($l->{IS_CONFORMANT}) {
|
||||
pidl "\tuint32 size_$e->{NAME};";
|
||||
}
|
||||
if ($l->{IS_VARYING}) {
|
||||
pidl "\tuint32 length_$e->{NAME};";
|
||||
pidl "\tuint32 offset_$e->{NAME};";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub CreateStruct($$$$)
|
||||
{
|
||||
my ($if,$fn,$n,$t) = @_;
|
||||
|
||||
pidl "typedef struct $n {";
|
||||
ParseElement($_) foreach (@$t);
|
||||
|
||||
if (not @$t) {
|
||||
# Some compilers don't like empty structs
|
||||
pidl "\tuint32 dummy;";
|
||||
}
|
||||
|
||||
pidl "} " . uc($n) . ";";
|
||||
pidl "";
|
||||
}
|
||||
|
||||
sub ParseFunction($$)
|
||||
{
|
||||
my ($if,$fn) = @_;
|
||||
|
||||
my @in = ();
|
||||
my @out = ();
|
||||
|
||||
foreach (@{$fn->{ELEMENTS}}) {
|
||||
push (@in, $_) if (grep(/in/, @{$_->{DIRECTION}}));
|
||||
push (@out, $_) if (grep(/out/, @{$_->{DIRECTION}}));
|
||||
}
|
||||
|
||||
if (defined($fn->{RETURN_TYPE})) {
|
||||
push (@out, {
|
||||
NAME => "status",
|
||||
TYPE => $fn->{RETURN_TYPE},
|
||||
LEVELS => [
|
||||
{
|
||||
TYPE => "DATA",
|
||||
DATA_TYPE => $fn->{RETURN_TYPE}
|
||||
}
|
||||
]
|
||||
} );
|
||||
}
|
||||
|
||||
# define Q + R structures for functions
|
||||
|
||||
CreateStruct($if, $fn, "$if->{NAME}_q_$fn->{NAME}", \@in);
|
||||
CreateStruct($if, $fn, "$if->{NAME}_r_$fn->{NAME}", \@out);
|
||||
}
|
||||
|
||||
sub ParseStruct($$$)
|
||||
{
|
||||
my ($if,$s,$n) = @_;
|
||||
|
||||
CreateStruct($if, $s, "$if->{NAME}_$n", $s->{ELEMENTS});
|
||||
}
|
||||
|
||||
sub ParseUnion($$$)
|
||||
{
|
||||
my ($if,$u,$n) = @_;
|
||||
|
||||
my $extra = {
|
||||
switch_value => $u->{SWITCH_TYPE}
|
||||
};
|
||||
|
||||
if (not defined($extra->{switch_value})) {
|
||||
$extra->{switch_value} = "uint32";
|
||||
}
|
||||
|
||||
foreach my $e (@{$u->{ELEMENTS}}) {
|
||||
foreach my $l (@{$e->{LEVELS}}) {
|
||||
if ($l->{TYPE} eq "ARRAY") {
|
||||
if ($l->{IS_CONFORMANT}) {
|
||||
$extra->{"size"} = "uint32";
|
||||
}
|
||||
if ($l->{IS_VARYING}) {
|
||||
$extra->{"length"} = $extra->{"offset"} = "uint32";
|
||||
}
|
||||
} elsif ($l->{TYPE} eq "POINTER") {
|
||||
$extra->{"ptr$l->{POINTER_INDEX}"} = "uint32";
|
||||
} elsif ($l->{TYPE} eq "SWITCH") {
|
||||
$extra->{"level"} = "uint32";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pidl "typedef struct $if->{NAME}_$n\_ctr {";
|
||||
indent;
|
||||
pidl "$extra->{$_} $_;" foreach (keys %$extra);
|
||||
pidl "union $if->{NAME}_$n {";
|
||||
indent;
|
||||
foreach (@{$u->{ELEMENTS}}) {
|
||||
next if ($_->{TYPE} eq "EMPTY");
|
||||
pidl "\t" . DeclShort($_) . ";";
|
||||
}
|
||||
deindent;
|
||||
pidl "} u;";
|
||||
deindent;
|
||||
pidl "} ".uc("$if->{NAME}_$n\_ctr") .";";
|
||||
pidl "";
|
||||
}
|
||||
|
||||
sub ParseEnum($$$)
|
||||
{
|
||||
my ($if,$s,$n) = @_;
|
||||
|
||||
pidl "typedef enum {";
|
||||
pidl "$_," foreach (@{$s->{ELEMENTS}});
|
||||
pidl "} $n;";
|
||||
}
|
||||
|
||||
sub ParseBitmap($$$)
|
||||
{
|
||||
my ($if,$s,$n) = @_;
|
||||
|
||||
pidl "#define $_" foreach (@{$s->{ELEMENTS}});
|
||||
}
|
||||
|
||||
sub ParseInterface($)
|
||||
{
|
||||
my $if = shift;
|
||||
|
||||
my $def = "_RPC_" . uc($if->{NAME}) . "_H";
|
||||
|
||||
pidl "";
|
||||
|
||||
pidl "\#ifndef $def";
|
||||
pidl "\#define $def";
|
||||
|
||||
pidl "";
|
||||
|
||||
foreach (@{$if->{FUNCTIONS}}) {
|
||||
pidl "\#define " . uc($_->{NAME}) . " $_->{OPNUM}" ;
|
||||
}
|
||||
|
||||
pidl "";
|
||||
|
||||
foreach (@{$if->{TYPES}}) {
|
||||
ParseStruct($if, $_->{DATA}, $_->{NAME}) if ($_->{DATA}->{TYPE} eq "STRUCT");
|
||||
ParseEnum($if, $_->{DATA}, $_->{NAME}) if ($_->{DATA}->{TYPE} eq "ENUM");
|
||||
ParseBitmap($if, $_->{DATA}, $_->{NAME}) if ($_->{DATA}->{TYPE} eq "BITMAP");
|
||||
ParseUnion($if, $_->{DATA}, $_->{NAME}) if ($_->{DATA}->{TYPE} eq "UNION");
|
||||
}
|
||||
|
||||
ParseFunction($if, $_) foreach (@{$if->{FUNCTIONS}});
|
||||
|
||||
foreach (@{$if->{CONSTS}}) {
|
||||
pidl "$_->{NAME} ($_->{VALUE})";
|
||||
}
|
||||
|
||||
pidl "\#endif /* $def */";
|
||||
}
|
||||
|
||||
sub Parse($$)
|
||||
{
|
||||
my($ndr,$filename) = @_;
|
||||
|
||||
$res = "";
|
||||
$tabs = "";
|
||||
|
||||
pidl "/*";
|
||||
pidl " * Unix SMB/CIFS implementation.";
|
||||
pidl " * header auto-generated by pidl. DO NOT MODIFY!";
|
||||
pidl " */";
|
||||
pidl "";
|
||||
|
||||
# Loop over interfaces
|
||||
foreach (@{$ndr}) {
|
||||
ParseInterface($_) if ($_->{TYPE} eq "INTERFACE");
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
1;
|
@ -1,603 +0,0 @@
|
||||
###################################################
|
||||
# Samba3 NDR parser generator for IDL structures
|
||||
# Copyright jelmer@samba.org 2005
|
||||
# released under the GNU GPL
|
||||
|
||||
package Parse::Pidl::Samba3::Parser;
|
||||
|
||||
use strict;
|
||||
use Parse::Pidl::Typelist qw(hasType getType mapType);
|
||||
use Parse::Pidl::Util qw(has_property ParseExpr);
|
||||
use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred);
|
||||
use Parse::Pidl::Samba3::Types qw(DeclShort DeclLong InitType DissectType StringType);
|
||||
|
||||
use vars qw($VERSION);
|
||||
$VERSION = '0.01';
|
||||
|
||||
use constant PRIMITIVES => 1;
|
||||
use constant DEFERRED => 2;
|
||||
|
||||
my $res = "";
|
||||
my $tabs = "";
|
||||
sub indent() { $tabs.="\t"; }
|
||||
sub deindent() { $tabs = substr($tabs, 1); }
|
||||
sub pidl($) { $res .= $tabs.(shift)."\n"; }
|
||||
sub fatal($$) { my ($e,$s) = @_; die("$e->{ORIGINAL}->{FILE}:$e->{ORIGINAL}->{LINE}: $s\n"); }
|
||||
|
||||
#TODO:
|
||||
# - Add some security checks (array sizes, memory alloc == NULL, etc)
|
||||
# - Don't add seperate _p and _d functions if there is no deferred data
|
||||
# - [string] with non-varying arrays and "surrounding" strings
|
||||
# - subcontext()
|
||||
# - DATA_BLOB
|
||||
|
||||
sub Align($$)
|
||||
{
|
||||
my ($a,$b) = @_;
|
||||
|
||||
# Only align if previous element was smaller than current one
|
||||
if ($$a < $b) {
|
||||
pidl "if (!prs_align_custom(ps, $b))";
|
||||
pidl "\treturn False;";
|
||||
pidl "";
|
||||
}
|
||||
|
||||
$$a = $b;
|
||||
}
|
||||
|
||||
sub DeclareArrayVariables
|
||||
{
|
||||
my $es = shift;
|
||||
my $what = shift;
|
||||
|
||||
my $output = 0;
|
||||
|
||||
foreach my $e (@$es) {
|
||||
foreach my $l (@{$e->{LEVELS}}) {
|
||||
if ($what) {
|
||||
next if ($l->{IS_DEFERRED} and $what == PRIMITIVES);
|
||||
next if (not $l->{IS_DEFERRED} and $what == DEFERRED);
|
||||
}
|
||||
if ($l->{TYPE} eq "ARRAY" and not $l->{IS_ZERO_TERMINATED}) {
|
||||
pidl "uint32 i_$e->{NAME}_$l->{LEVEL_INDEX};";
|
||||
$output = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
pidl "" if $output;
|
||||
}
|
||||
|
||||
sub ParseElementLevelData($$$$$$$)
|
||||
{
|
||||
my ($e,$l,$nl,$env,$varname,$what,$align) = @_;
|
||||
|
||||
my $c = DissectType($e,$l,$varname,$what,$align);
|
||||
return if not $c;
|
||||
|
||||
if (defined($e->{ALIGN})) {
|
||||
Align($align, $e->{ALIGN});
|
||||
} else {
|
||||
# Default to 4
|
||||
Align($align, 4);
|
||||
}
|
||||
|
||||
pidl "if (!$c)";
|
||||
pidl "\treturn False;";
|
||||
}
|
||||
|
||||
sub ParseElementLevelArray($$$$$$$)
|
||||
{
|
||||
my ($e,$l,$nl,$env,$varname,$what,$align) = @_;
|
||||
|
||||
if ($l->{IS_ZERO_TERMINATED}) {
|
||||
return if ($what == DEFERRED);
|
||||
|
||||
my ($t,$f) = StringType($e,$l);
|
||||
|
||||
Align($align, 4);
|
||||
pidl "if (!smb_io_$t(\"$e->{NAME}\", &$varname, 1, ps, depth))";
|
||||
pidl "\treturn False;";
|
||||
|
||||
$$align = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
my $len = ParseExpr($l->{LENGTH_IS}, $env);
|
||||
my $size = ParseExpr($l->{SIZE_IS}, $env);
|
||||
|
||||
if ($what == PRIMITIVES) {
|
||||
# Fetch headers
|
||||
if ($l->{IS_CONFORMANT} and not $l->{IS_SURROUNDING}) {
|
||||
Align($align, 4);
|
||||
pidl "if (!prs_uint32(\"size_$e->{NAME}\", ps, depth, &" . ParseExpr("size_$e->{NAME}", $env) . "))";
|
||||
pidl "\treturn False;";
|
||||
pidl "";
|
||||
}
|
||||
|
||||
if ($l->{IS_VARYING}) {
|
||||
Align($align, 4);
|
||||
pidl "if (!prs_uint32(\"offset_$e->{NAME}\", ps, depth, &" . ParseExpr("offset_$e->{NAME}", $env) . "))";
|
||||
pidl "\treturn False;";
|
||||
pidl "";
|
||||
|
||||
pidl "if (!prs_uint32(\"length_$e->{NAME}\", ps, depth, &" . ParseExpr("length_$e->{NAME}", $env) . "))";
|
||||
pidl "\treturn False;";
|
||||
pidl "";
|
||||
}
|
||||
}
|
||||
|
||||
# Everything but fixed arrays have to be allocated
|
||||
if (!$l->{IS_FIXED} and $what == PRIMITIVES) {
|
||||
pidl "if (UNMARSHALLING(ps)) {";
|
||||
indent;
|
||||
pidl "$varname = (void *)PRS_ALLOC_MEM_VOID(ps,sizeof(*$varname)*$size);";
|
||||
deindent;
|
||||
pidl "}";
|
||||
}
|
||||
|
||||
return if ($what == DEFERRED and not ContainsDeferred($e,$l));
|
||||
|
||||
my $i = "i_$e->{NAME}_$l->{LEVEL_INDEX}";
|
||||
pidl "for ($i=0; $i<$len;$i++) {";
|
||||
indent;
|
||||
ParseElementLevel($e,$nl,$env,$varname."[$i]",$what,$align);
|
||||
deindent;
|
||||
pidl "}";
|
||||
}
|
||||
|
||||
sub ParseElementLevelSwitch($$$$$$$)
|
||||
{
|
||||
my ($e,$l,$nl,$env,$varname,$what,$align) = @_;
|
||||
|
||||
ParseElementLevel($e,$nl,$env,$varname,$what,$align);
|
||||
}
|
||||
|
||||
sub ParseElementLevelPtr($$$$$$$)
|
||||
{
|
||||
my ($e,$l,$nl,$env,$varname,$what,$align) = @_;
|
||||
|
||||
if ($what == PRIMITIVES) {
|
||||
if (($l->{POINTER_TYPE} eq "ref") and ($l->{LEVEL} eq "EMBEDDED")) {
|
||||
# Ref pointers always have to be non-NULL
|
||||
pidl "if (MARSHALLING(ps) && !" . ParseExpr("ptr$l->{POINTER_INDEX}_$e->{NAME}", $env) . ")";
|
||||
pidl "\treturn False;";
|
||||
pidl "";
|
||||
}
|
||||
|
||||
unless ($l->{POINTER_TYPE} eq "ref" and $l->{LEVEL} eq "TOP") {
|
||||
Align($align, 4);
|
||||
pidl "if (!prs_uint32(\"ptr$l->{POINTER_INDEX}_$e->{NAME}\", ps, depth, &" . ParseExpr("ptr$l->{POINTER_INDEX}_$e->{NAME}", $env) . "))";
|
||||
pidl "\treturn False;";
|
||||
pidl "";
|
||||
}
|
||||
}
|
||||
|
||||
if ($l->{POINTER_TYPE} eq "relative") {
|
||||
fatal($e, "relative pointers not supported for Samba 3");
|
||||
#FIXME
|
||||
}
|
||||
|
||||
if ($what == DEFERRED) {
|
||||
if ($l->{POINTER_TYPE} ne "ref") {
|
||||
pidl "if (" . ParseExpr("ptr$l->{POINTER_INDEX}_$e->{NAME}", $env) . ") {";
|
||||
indent;
|
||||
}
|
||||
ParseElementLevel($e,$nl,$env,$varname,PRIMITIVES,$align);
|
||||
ParseElementLevel($e,$nl,$env,$varname,DEFERRED,$align);
|
||||
if ($l->{POINTER_TYPE} ne "ref") {
|
||||
deindent;
|
||||
pidl "}";
|
||||
}
|
||||
$$align = 0;
|
||||
}
|
||||
}
|
||||
|
||||
sub ParseElementLevelSubcontext($$$$$$$)
|
||||
{
|
||||
my ($e,$l,$nl,$env,$varname,$what,$align) = @_;
|
||||
|
||||
fatal($e, "subcontext() not supported for Samba 3");
|
||||
#FIXME
|
||||
}
|
||||
|
||||
sub ParseElementLevel($$$$$$)
|
||||
{
|
||||
my ($e,$l,$env,$varname,$what,$align) = @_;
|
||||
|
||||
{
|
||||
DATA => \&ParseElementLevelData,
|
||||
SUBCONTEXT => \&ParseElementLevelSubcontext,
|
||||
POINTER => \&ParseElementLevelPtr,
|
||||
SWITCH => \&ParseElementLevelSwitch,
|
||||
ARRAY => \&ParseElementLevelArray
|
||||
}->{$l->{TYPE}}->($e,$l,GetNextLevel($e,$l),$env,$varname,$what,$align);
|
||||
}
|
||||
|
||||
sub ParseElement($$$$)
|
||||
{
|
||||
my ($e,$env,$what,$align) = @_;
|
||||
|
||||
ParseElementLevel($e, $e->{LEVELS}[0], $env, ParseExpr($e->{NAME}, $env), $what, $align);
|
||||
}
|
||||
|
||||
sub InitLevel($$$$)
|
||||
{
|
||||
sub InitLevel($$$$);
|
||||
my ($e,$l,$varname,$env) = @_;
|
||||
|
||||
if ($l->{TYPE} eq "POINTER") {
|
||||
if ($l->{POINTER_TYPE} eq "ref") {
|
||||
pidl "if (!$varname)";
|
||||
pidl "\treturn False;";
|
||||
pidl "";
|
||||
} else {
|
||||
pidl "if ($varname) {";
|
||||
indent;
|
||||
}
|
||||
|
||||
unless ($l->{POINTER_TYPE} eq "ref" and $l->{LEVEL} eq "TOP") {
|
||||
pidl ParseExpr("ptr$l->{POINTER_INDEX}_$e->{NAME}", $env) . " = 1;";
|
||||
}
|
||||
InitLevel($e, GetNextLevel($e,$l), "*$varname", $env);
|
||||
|
||||
if ($l->{POINTER_TYPE} ne "ref") {
|
||||
deindent;
|
||||
pidl "} else {";
|
||||
pidl "\t" . ParseExpr("ptr$l->{POINTER_INDEX}_$e->{NAME}", $env) . " = 0;";
|
||||
pidl "}";
|
||||
}
|
||||
} elsif ($l->{TYPE} eq "ARRAY" and $l->{IS_ZERO_TERMINATED}) {
|
||||
my ($t,$f) = StringType($e,$l);
|
||||
pidl "init_$t(&" . ParseExpr($e->{NAME}, $env) . ", ".substr($varname, 1) . ", $f);";
|
||||
} elsif ($l->{TYPE} eq "ARRAY") {
|
||||
pidl ParseExpr($e->{NAME}, $env) . " = $varname;";
|
||||
} elsif ($l->{TYPE} eq "DATA") {
|
||||
pidl InitType($e, $l, ParseExpr($e->{NAME}, $env), $varname);
|
||||
} elsif ($l->{TYPE} eq "SWITCH") {
|
||||
InitLevel($e, GetNextLevel($e,$l), $varname, $env);
|
||||
pidl ParseExpr($e->{NAME}, $env) . ".switch_value = " . ParseExpr($l->{SWITCH_IS}, $env) . ";";
|
||||
}
|
||||
}
|
||||
|
||||
sub GenerateEnvElement($$)
|
||||
{
|
||||
my ($e,$env) = @_;
|
||||
foreach my $l (@{$e->{LEVELS}}) {
|
||||
if ($l->{TYPE} eq "DATA") {
|
||||
$env->{$e->{NAME}} = "v->$e->{NAME}";
|
||||
} elsif ($l->{TYPE} eq "POINTER") {
|
||||
$env->{"ptr$l->{POINTER_INDEX}_$e->{NAME}"} = "v->ptr$l->{POINTER_INDEX}_$e->{NAME}";
|
||||
} elsif ($l->{TYPE} eq "SWITCH") {
|
||||
} elsif ($l->{TYPE} eq "ARRAY" and not $l->{IS_ZERO_TERMINATED}) {
|
||||
$env->{"length_$e->{NAME}"} = "v->length_$e->{NAME}";
|
||||
$env->{"size_$e->{NAME}"} = "v->size_$e->{NAME}";
|
||||
$env->{"offset_$e->{NAME}"} = "v->offset_$e->{NAME}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub ParseStruct($$$)
|
||||
{
|
||||
my ($if,$s,$n) = @_;
|
||||
|
||||
my $fn = "$if->{NAME}_io_$n";
|
||||
my $sn = uc("$if->{NAME}_$n");
|
||||
my $ifn = "init_$if->{NAME}_$n";
|
||||
|
||||
my $args = "";
|
||||
foreach (@{$s->{ELEMENTS}}) {
|
||||
$args .= ", " . DeclLong($_);
|
||||
}
|
||||
|
||||
my $env = { "this" => "v" };
|
||||
GenerateEnvElement($_, $env) foreach (@{$s->{ELEMENTS}});
|
||||
|
||||
pidl "BOOL $ifn($sn *v$args)";
|
||||
pidl "{";
|
||||
indent;
|
||||
pidl "DEBUG(5,(\"$ifn\\n\"));";
|
||||
pidl "";
|
||||
# Call init for all arguments
|
||||
foreach (@{$s->{ELEMENTS}}) {
|
||||
InitLevel($_, $_->{LEVELS}[0], $_->{NAME}, $env);
|
||||
pidl "";
|
||||
}
|
||||
pidl "return True;";
|
||||
deindent;
|
||||
pidl "}";
|
||||
pidl "";
|
||||
|
||||
my $pfn = "$fn\_p";
|
||||
my $dfn = "$fn\_d";
|
||||
|
||||
pidl "BOOL $pfn(const char *desc, $sn *v, prs_struct *ps, int depth)";
|
||||
pidl "{";
|
||||
indent;
|
||||
DeclareArrayVariables($s->{ELEMENTS}, PRIMITIVES);
|
||||
pidl "if (v == NULL)";
|
||||
pidl "\treturn False;";
|
||||
pidl "";
|
||||
pidl "prs_debug(ps, depth, desc, \"$pfn\");";
|
||||
pidl "depth++;";
|
||||
|
||||
my $align = 8;
|
||||
if ($s->{SURROUNDING_ELEMENT}) {
|
||||
pidl "if (!prs_uint32(\"size_$s->{SURROUNDING_ELEMENT}->{NAME}\", ps, depth, &" . ParseExpr("size_$s->{SURROUNDING_ELEMENT}->{NAME}", $env) . "))";
|
||||
pidl "\treturn False;";
|
||||
pidl "";
|
||||
$align = 4;
|
||||
|
||||
}
|
||||
|
||||
foreach (@{$s->{ELEMENTS}}) {
|
||||
ParseElement($_, $env, PRIMITIVES, \$align);
|
||||
pidl "";
|
||||
}
|
||||
|
||||
pidl "return True;";
|
||||
deindent;
|
||||
pidl "}";
|
||||
pidl "";
|
||||
|
||||
pidl "BOOL $dfn(const char *desc, $sn *v, prs_struct *ps, int depth)";
|
||||
pidl "{";
|
||||
indent;
|
||||
DeclareArrayVariables($s->{ELEMENTS}, DEFERRED);
|
||||
pidl "if (v == NULL)";
|
||||
pidl "\treturn False;";
|
||||
pidl "";
|
||||
pidl "prs_debug(ps, depth, desc, \"$dfn\");";
|
||||
pidl "depth++;";
|
||||
|
||||
$align = 0;
|
||||
foreach (@{$s->{ELEMENTS}}) {
|
||||
ParseElement($_, $env, DEFERRED, \$align);
|
||||
pidl "";
|
||||
}
|
||||
|
||||
pidl "return True;";
|
||||
deindent;
|
||||
pidl "}";
|
||||
pidl "";
|
||||
}
|
||||
|
||||
sub UnionGenerateEnvElement($)
|
||||
{
|
||||
my $e = shift;
|
||||
my $env = {};
|
||||
|
||||
foreach my $l (@{$e->{LEVELS}}) {
|
||||
if ($l->{TYPE} eq "DATA") {
|
||||
$env->{$e->{NAME}} = "v->u.$e->{NAME}";
|
||||
} elsif ($l->{TYPE} eq "POINTER") {
|
||||
$env->{"ptr$l->{POINTER_INDEX}_$e->{NAME}"} = "v->ptr$l->{POINTER_INDEX}";
|
||||
} elsif ($l->{TYPE} eq "SWITCH") {
|
||||
} elsif ($l->{TYPE} eq "ARRAY" and not $l->{IS_ZERO_TERMINATED}) {
|
||||
$env->{"length_$e->{NAME}"} = "v->length";
|
||||
$env->{"size_$e->{NAME}"} = "v->size";
|
||||
$env->{"offset_$e->{NAME}"} = "v->offset";
|
||||
}
|
||||
}
|
||||
|
||||
return $env;
|
||||
}
|
||||
|
||||
sub ParseUnion($$$)
|
||||
{
|
||||
my ($if,$u,$n) = @_;
|
||||
|
||||
my $fn = "$if->{NAME}_io_$n";
|
||||
my $sn = uc("$if->{NAME}_$n\_ctr");
|
||||
|
||||
my $pfn = "$fn\_p";
|
||||
my $dfn = "$fn\_d";
|
||||
|
||||
pidl "BOOL $pfn(const char *desc, $sn* v, prs_struct *ps, int depth)";
|
||||
pidl "{";
|
||||
indent;
|
||||
DeclareArrayVariables($u->{ELEMENTS});
|
||||
|
||||
if (defined ($u->{SWITCH_TYPE})) {
|
||||
pidl "if (!prs_$u->{SWITCH_TYPE}(\"switch_value\", ps, depth, &v->switch_value))";
|
||||
pidl "\treturn False;";
|
||||
pidl "";
|
||||
}
|
||||
|
||||
# Maybe check here that level and v->switch_value are equal?
|
||||
|
||||
pidl "switch (v->switch_value) {";
|
||||
indent;
|
||||
|
||||
foreach (@{$u->{ELEMENTS}}) {
|
||||
pidl "$_->{CASE}:";
|
||||
indent;
|
||||
if ($_->{TYPE} ne "EMPTY") {
|
||||
pidl "depth++;";
|
||||
my $env = UnionGenerateEnvElement($_);
|
||||
my $align = 8;
|
||||
ParseElement($_, $env, PRIMITIVES, \$align);
|
||||
pidl "depth--;";
|
||||
}
|
||||
pidl "break;";
|
||||
deindent;
|
||||
pidl "";
|
||||
}
|
||||
|
||||
unless ($u->{HAS_DEFAULT}) {
|
||||
pidl "default:";
|
||||
pidl "\treturn False;";
|
||||
pidl "";
|
||||
}
|
||||
|
||||
deindent;
|
||||
pidl "}";
|
||||
pidl "";
|
||||
pidl "return True;";
|
||||
deindent;
|
||||
pidl "}";
|
||||
pidl "";
|
||||
|
||||
pidl "BOOL $dfn(const char *desc, $sn* v, prs_struct *ps, int depth)";
|
||||
pidl "{";
|
||||
indent;
|
||||
DeclareArrayVariables($u->{ELEMENTS});
|
||||
|
||||
if (defined($u->{SWITCH_TYPE})) {
|
||||
pidl "switch (v->switch_value) {";
|
||||
} else {
|
||||
pidl "switch (level) {";
|
||||
}
|
||||
indent;
|
||||
|
||||
foreach (@{$u->{ELEMENTS}}) {
|
||||
pidl "$_->{CASE}:";
|
||||
indent;
|
||||
if ($_->{TYPE} ne "EMPTY") {
|
||||
pidl "depth++;";
|
||||
my $env = UnionGenerateEnvElement($_);
|
||||
my $align = 0;
|
||||
ParseElement($_, $env, DEFERRED, \$align);
|
||||
pidl "depth--;";
|
||||
}
|
||||
pidl "break;";
|
||||
deindent;
|
||||
pidl "";
|
||||
}
|
||||
|
||||
deindent;
|
||||
pidl "}";
|
||||
pidl "";
|
||||
pidl "return True;";
|
||||
deindent;
|
||||
pidl "}";
|
||||
|
||||
}
|
||||
|
||||
sub CreateFnDirection($$$$$)
|
||||
{
|
||||
my ($fn,$ifn,$s,$all,$es) = @_;
|
||||
|
||||
my $args = "";
|
||||
foreach (@$all) { $args .= ", " . DeclLong($_); }
|
||||
|
||||
my $env = { };
|
||||
GenerateEnvElement($_, $env) foreach (@$es);
|
||||
|
||||
pidl "BOOL $ifn($s *v$args)";
|
||||
pidl "{";
|
||||
indent;
|
||||
pidl "DEBUG(5,(\"$ifn\\n\"));";
|
||||
pidl "";
|
||||
# Call init for all arguments
|
||||
foreach (@$es) {
|
||||
InitLevel($_, $_->{LEVELS}[0], $_->{NAME}, $env);
|
||||
pidl "";
|
||||
}
|
||||
pidl "return True;";
|
||||
deindent;
|
||||
pidl "}";
|
||||
pidl "";
|
||||
|
||||
pidl "BOOL $fn(const char *desc, $s *v, prs_struct *ps, int depth)";
|
||||
pidl "{";
|
||||
indent;
|
||||
DeclareArrayVariables($es);
|
||||
pidl "if (v == NULL)";
|
||||
pidl "\treturn False;";
|
||||
pidl "";
|
||||
pidl "prs_debug(ps, depth, desc, \"$fn\");";
|
||||
pidl "depth++;";
|
||||
|
||||
my $align = 8;
|
||||
foreach (@$es) {
|
||||
ParseElement($_, $env, PRIMITIVES, \$align);
|
||||
ParseElement($_, $env, DEFERRED, \$align);
|
||||
pidl "";
|
||||
}
|
||||
|
||||
pidl "return True;";
|
||||
deindent;
|
||||
pidl "}";
|
||||
pidl "";
|
||||
}
|
||||
|
||||
sub ParseFunction($$)
|
||||
{
|
||||
my ($if,$fn) = @_;
|
||||
|
||||
my @in = ();
|
||||
my @out = ();
|
||||
my @all = @{$fn->{ELEMENTS}};
|
||||
|
||||
foreach (@{$fn->{ELEMENTS}}) {
|
||||
push (@in, $_) if (grep(/in/, @{$_->{DIRECTION}}));
|
||||
push (@out, $_) if (grep(/out/, @{$_->{DIRECTION}}));
|
||||
}
|
||||
|
||||
if (defined($fn->{RETURN_TYPE})) {
|
||||
my $status = {
|
||||
NAME => "status",
|
||||
TYPE => $fn->{RETURN_TYPE},
|
||||
LEVELS => [
|
||||
{
|
||||
TYPE => "DATA",
|
||||
DATA_TYPE => $fn->{RETURN_TYPE}
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
push (@out, $status);
|
||||
push (@all, $status);
|
||||
}
|
||||
|
||||
CreateFnDirection("$if->{NAME}_io_q_$fn->{NAME}",
|
||||
"init_$if->{NAME}_q_$fn->{NAME}",
|
||||
uc("$if->{NAME}_q_$fn->{NAME}"),
|
||||
\@in, \@in);
|
||||
CreateFnDirection("$if->{NAME}_io_r_$fn->{NAME}",
|
||||
"init_$if->{NAME}_r_$fn->{NAME}",
|
||||
uc("$if->{NAME}_r_$fn->{NAME}"),
|
||||
\@all, \@out);
|
||||
}
|
||||
|
||||
sub ParseInterface($)
|
||||
{
|
||||
my $if = shift;
|
||||
|
||||
# Structures first
|
||||
pidl "/* $if->{NAME} structures */";
|
||||
foreach (@{$if->{TYPES}}) {
|
||||
ParseStruct($if, $_->{DATA}, $_->{NAME}) if ($_->{DATA}->{TYPE} eq "STRUCT");
|
||||
ParseUnion($if, $_->{DATA}, $_->{NAME}) if ($_->{DATA}->{TYPE} eq "UNION");
|
||||
}
|
||||
|
||||
pidl "/* $if->{NAME} functions */";
|
||||
ParseFunction($if, $_) foreach (@{$if->{FUNCTIONS}});
|
||||
}
|
||||
|
||||
sub Parse($$)
|
||||
{
|
||||
my($ndr,$filename) = @_;
|
||||
|
||||
$tabs = "";
|
||||
$res = "";
|
||||
|
||||
pidl "/*";
|
||||
pidl " * Unix SMB/CIFS implementation.";
|
||||
pidl " * parser auto-generated by pidl. DO NOT MODIFY!";
|
||||
pidl " */";
|
||||
pidl "";
|
||||
pidl "#include \"includes.h\"";
|
||||
pidl "";
|
||||
pidl "#undef DBGC_CLASS";
|
||||
pidl "#define DBGC_CLASS DBGC_RPC_PARSE";
|
||||
pidl "";
|
||||
|
||||
foreach (@$ndr) {
|
||||
ParseInterface($_) if ($_->{TYPE} eq "INTERFACE");
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
1;
|
@ -1,82 +0,0 @@
|
||||
###################################################
|
||||
# Samba3 NDR client generator for IDL structures
|
||||
# Copyright jelmer@samba.org 2005
|
||||
# released under the GNU GPL
|
||||
|
||||
package Parse::Pidl::Samba3::Template;
|
||||
|
||||
use strict;
|
||||
use Parse::Pidl::Typelist qw(hasType getType mapType);
|
||||
use Parse::Pidl::Util qw(has_property ParseExpr);
|
||||
use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred);
|
||||
|
||||
use vars qw($VERSION);
|
||||
$VERSION = '0.01';
|
||||
|
||||
my $res;
|
||||
sub pidl($) { my $x = shift; $res.="$x\n"; }
|
||||
|
||||
sub ParseInterface($)
|
||||
{
|
||||
my $if = shift;
|
||||
|
||||
foreach (@{$if->{FUNCTIONS}}) {
|
||||
my $ret = $_->{RETURN_TYPE};
|
||||
if (not $ret) { $ret = "void"; }
|
||||
pidl "$ret _$_->{NAME}(pipes_struct *p, " . uc($if->{NAME}) . "_Q_" . uc($_->{NAME}) . " *q_u, " . uc($if->{NAME}) . "_R_" . uc($_->{NAME}) . " *r_u)";
|
||||
pidl "{";
|
||||
pidl "\t/* FIXME: Implement your code here */";
|
||||
if (not defined($_->{RETURN_TYPE})) {
|
||||
} elsif ($_->{RETURN_TYPE} eq "WERROR") {
|
||||
pidl "\treturn WERR_NOT_SUPPORTED;";
|
||||
} elsif ($_->{RETURN_TYPE} eq "NTSTATUS") {
|
||||
pidl "\treturn NT_STATUS_NOT_IMPLEMENTED;";
|
||||
} elsif ($_->{RETURN_TYPE} eq "uint32") {
|
||||
pidl "\treturn 0;";
|
||||
}
|
||||
pidl "}";
|
||||
pidl "";
|
||||
}
|
||||
}
|
||||
|
||||
sub Parse($$)
|
||||
{
|
||||
my($ndr,$filename) = @_;
|
||||
|
||||
$res = "";
|
||||
|
||||
pidl "/*
|
||||
* Unix SMB/CIFS implementation.
|
||||
**** template auto-generated by pidl. Modify to your needs ****
|
||||
* RPC Pipe client / server routines
|
||||
* Copyright (C) YOUR NAME YEAR.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include \"includes.h\"
|
||||
|
||||
#undef DBGC_CLASS
|
||||
#define DBGC_CLASS DBGC_MSRPC
|
||||
";
|
||||
|
||||
foreach (@$ndr) {
|
||||
ParseInterface($_) if ($_->{TYPE} eq "INTERFACE");
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
1;
|
@ -1,403 +0,0 @@
|
||||
###################################################
|
||||
# Samba3 type-specific declarations / initialization / marshalling
|
||||
# Copyright jelmer@samba.org 2005
|
||||
# released under the GNU GPL
|
||||
|
||||
package Parse::Pidl::Samba3::Types;
|
||||
|
||||
require Exporter;
|
||||
@ISA = qw(Exporter);
|
||||
@EXPORT_OK = qw(DeclShort DeclLong InitType DissectType AddType StringType);
|
||||
|
||||
use strict;
|
||||
use Parse::Pidl::Util qw(has_property ParseExpr property_matches);
|
||||
use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred ContainsString);
|
||||
|
||||
use vars qw($VERSION);
|
||||
$VERSION = '0.01';
|
||||
|
||||
# TODO: Find external types somehow?
|
||||
|
||||
sub warning($$) { my ($e,$s) = @_; print STDERR "$e->{ORIGINAL}->{FILE}:$e->{ORIGINAL}->{LINE}: $s\n"; }
|
||||
|
||||
sub init_scalar($$$$)
|
||||
{
|
||||
my ($e,$l,$n,$v) = @_;
|
||||
|
||||
return "$n = $v;";
|
||||
}
|
||||
|
||||
sub dissect_scalar($$$$$)
|
||||
{
|
||||
my ($e,$l,$n,$w,$a) = @_;
|
||||
|
||||
my $t = lc($e->{TYPE});
|
||||
|
||||
return "prs_$t(\"$e->{NAME}\", ps, depth, &$n)";
|
||||
}
|
||||
|
||||
sub decl_string($)
|
||||
{
|
||||
my $e = shift;
|
||||
|
||||
my $is_conformant = property_matches($e, "flag", ".*STR_SIZE4.*");
|
||||
my $is_varying = property_matches($e, "flag", ".*STR_LEN4.*");
|
||||
my $is_ascii = property_matches($e, "flag", ".*STR_ASCII.*");
|
||||
|
||||
return "STRING2" if ($is_conformant and $is_varying and $is_ascii);
|
||||
|
||||
return "UNISTR2" if ($is_conformant and $is_varying);
|
||||
return "UNISTR3" if ($is_varying);
|
||||
# We don't do UNISTR4, as we have lsa_String for that in Samba4's IDL
|
||||
|
||||
die("Don't know what string type to use");
|
||||
}
|
||||
|
||||
sub contains_pointer($)
|
||||
{
|
||||
my $e = shift;
|
||||
|
||||
foreach my $l (@{$e->{LEVELS}}) {
|
||||
return 1 if ($l->{TYPE} eq "POINTER");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub ext_decl_string($)
|
||||
{
|
||||
my $e = shift;
|
||||
|
||||
# One pointer is sufficient..
|
||||
return "const char" if (contains_pointer($e));
|
||||
return "const char *";
|
||||
}
|
||||
|
||||
sub init_string($$$$)
|
||||
{
|
||||
my ($e,$l,$n,$v) = @_;
|
||||
|
||||
my $t = lc(decl_string($e));
|
||||
|
||||
my $flags;
|
||||
if (property_matches($e, "flag", ".*STR_NULLTERM.*")) {
|
||||
$flags = "UNI_STR_TERMINATE";
|
||||
} elsif (property_matches($e, "flag", ".*STR_NOTERM.*")) {
|
||||
$flags = "UNI_STR_NOTERM";
|
||||
} else {
|
||||
$flags = "UNI_FLAGS_NONE";
|
||||
}
|
||||
|
||||
# One pointer is sufficient
|
||||
if (substr($v, 0, 1) eq "*") { $v = substr($v, 1); }
|
||||
|
||||
return "init_$t(&$n, $v, $flags);";
|
||||
}
|
||||
|
||||
sub dissect_string($$$$$)
|
||||
{
|
||||
my ($e,$l,$n,$w,$a) = @_;
|
||||
|
||||
my $t = lc(decl_string($e));
|
||||
|
||||
$$a = 1;
|
||||
return "smb_io_$t(\"$e->{NAME}\", &$n, 1, ps, depth)";
|
||||
}
|
||||
|
||||
sub StringType($$)
|
||||
{
|
||||
my ($e,$l) = @_;
|
||||
my $nl = GetNextLevel($e,$l);
|
||||
|
||||
if ($l->{IS_VARYING} and $l->{IS_CONFORMANT} and $nl->{DATA_TYPE} eq "uint16") {
|
||||
return ("unistr2", "UNI_FLAGS_NONE");
|
||||
} elsif ($l->{IS_CONFORMANT} and $l->{IS_VARYING} and $nl->{DATA_TYPE} eq "uint8") {
|
||||
return ("string2", 0);
|
||||
} else {
|
||||
fatal($e, "[string] non-varying string not supported for Samba3 yet");
|
||||
}
|
||||
}
|
||||
|
||||
my $known_types =
|
||||
{
|
||||
uint8 =>
|
||||
{
|
||||
DECL => "uint8",
|
||||
INIT => \&init_scalar,
|
||||
DISSECT_P => \&dissect_scalar,
|
||||
},
|
||||
uint16 =>
|
||||
{
|
||||
DECL => "uint16",
|
||||
INIT => \&init_scalar,
|
||||
DISSECT_P => \&dissect_scalar,
|
||||
},
|
||||
uint32 =>
|
||||
{
|
||||
DECL => "uint32",
|
||||
INIT => \&init_scalar,
|
||||
DISSECT_P => \&dissect_scalar,
|
||||
},
|
||||
uint64 =>
|
||||
{
|
||||
DECL => "uint64",
|
||||
INIT => \&init_scalar,
|
||||
DISSECT_P => \&dissect_scalar,
|
||||
},
|
||||
int32 =>
|
||||
{
|
||||
DECL => "int32",
|
||||
INIT => \&init_scalar,
|
||||
DISSECT_P => \&dissect_scalar,
|
||||
},
|
||||
string =>
|
||||
{
|
||||
DECL => \&decl_string,
|
||||
EXT_DECL => \&ext_decl_string,
|
||||
INIT => \&init_string,
|
||||
DISSECT_P => \&dissect_string,
|
||||
},
|
||||
NTSTATUS =>
|
||||
{
|
||||
DECL => "NTSTATUS",
|
||||
INIT => \&init_scalar,
|
||||
DISSECT_P => \&dissect_scalar,
|
||||
},
|
||||
WERROR =>
|
||||
{
|
||||
DECL => "WERROR",
|
||||
INIT => \&init_scalar,
|
||||
DISSECT_P => \&dissect_scalar,
|
||||
},
|
||||
GUID =>
|
||||
{
|
||||
DECL => "struct uuid",
|
||||
INIT => "",
|
||||
DISSECT_P => sub {
|
||||
my ($e,$l,$n) = @_;
|
||||
return "smb_io_uuid(\"$e->{NAME}\", &$n, ps, depth)";
|
||||
}
|
||||
},
|
||||
NTTIME =>
|
||||
{
|
||||
DECL => "NTTIME",
|
||||
INIT => "",
|
||||
DISSECT_P => sub {
|
||||
my ($e,$l,$n,$w,$a) = @_;
|
||||
return "smb_io_nttime(\"$e->{NAME}\", &n, ps, depth)";
|
||||
}
|
||||
},
|
||||
dom_sid =>
|
||||
{
|
||||
DECL => "DOM_SID",
|
||||
INIT => "",
|
||||
DISSECT_P => sub {
|
||||
my ($e,$l,$n,$w,$a) = @_;
|
||||
return "smb_io_dom_sid(\"$e->{NAME}\", &n, ps, depth)";
|
||||
}
|
||||
},
|
||||
policy_handle =>
|
||||
{
|
||||
DECL => "POLICY_HND",
|
||||
INIT => "",
|
||||
DISSECT_P => sub {
|
||||
my ($e,$l,$n,$w,$a) = @_;
|
||||
return "smb_io_pol_hnd(\"$e->{NAME}\", &n, ps, depth)";
|
||||
}
|
||||
},
|
||||
security_descriptor =>
|
||||
{
|
||||
DECL => "SEC_DESC",
|
||||
INIT => "",
|
||||
DISSECT_P => sub {
|
||||
my ($e,$l,$n,$w,$a) = @_;
|
||||
return "sec_io_desc(\"$e->{NAME}\", &n, ps, depth)";
|
||||
}
|
||||
},
|
||||
hyper =>
|
||||
{
|
||||
DECL => "uint64",
|
||||
INIT => "",
|
||||
DISSECT_P => sub {
|
||||
my ($e,$l,$n,$w,$a) = @_;
|
||||
return "prs_uint64(\"$e->{NAME}\", ps, depth, &$n)";
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
sub AddType($$)
|
||||
{
|
||||
my ($t,$d) = @_;
|
||||
|
||||
warn("Reregistering type $t") if (defined($known_types->{$t}));
|
||||
|
||||
$known_types->{$t} = $d;
|
||||
}
|
||||
|
||||
# Return type without special stuff, as used in
|
||||
# declarations for internal structs
|
||||
sub DeclShort($)
|
||||
{
|
||||
my $e = shift;
|
||||
|
||||
my $t = $known_types->{$e->{TYPE}};
|
||||
|
||||
if (not $t) {
|
||||
warning($e, "Can't declare unknown type `$e->{TYPE}'");
|
||||
return undef;
|
||||
}
|
||||
|
||||
my $p;
|
||||
|
||||
# DECL can be a function
|
||||
if (ref($t->{DECL}) eq "CODE") {
|
||||
$p = $t->{DECL}->($e);
|
||||
} else {
|
||||
$p = $t->{DECL};
|
||||
}
|
||||
|
||||
my $prefixes = "";
|
||||
my $suffixes = "";
|
||||
foreach my $l (@{$e->{LEVELS}}) {
|
||||
if ($l->{TYPE} eq "ARRAY" and not $l->{IS_FIXED}) {
|
||||
$prefixes = "*$prefixes";
|
||||
} elsif ($l->{TYPE} eq "ARRAY" and $l->{IS_FIXED}) {
|
||||
$suffixes.="[$l->{SIZE_IS}]";
|
||||
}
|
||||
}
|
||||
|
||||
return "$p $prefixes$e->{NAME}$suffixes";
|
||||
}
|
||||
|
||||
# Return type including special stuff (pointers, etc).
|
||||
sub DeclLong($)
|
||||
{
|
||||
my $e = shift;
|
||||
|
||||
my $t = $known_types->{$e->{TYPE}};
|
||||
|
||||
if (not $t) {
|
||||
warning($e, "Can't declare unknown type `$e->{TYPE}'");
|
||||
return undef;
|
||||
}
|
||||
|
||||
my $p;
|
||||
|
||||
if (defined($t->{EXT_DECL})) {
|
||||
$p = $t->{EXT_DECL}
|
||||
} else {
|
||||
$p = $t->{DECL};
|
||||
}
|
||||
|
||||
if (ref($p) eq "CODE") {
|
||||
$p = $p->($e);
|
||||
}
|
||||
|
||||
my $prefixes = "";
|
||||
my $suffixes = "";
|
||||
|
||||
foreach my $l (@{$e->{LEVELS}}) {
|
||||
if ($l->{TYPE} eq "ARRAY" and $l->{IS_ZERO_TERMINATED}) {
|
||||
$p = "const char";
|
||||
last;
|
||||
} elsif ($l->{TYPE} eq "ARRAY" and not $l->{IS_FIXED}) {
|
||||
$prefixes = "*$prefixes";
|
||||
} elsif ($l->{TYPE} eq "ARRAY" and $l->{IS_FIXED}) {
|
||||
$suffixes.="[$l->{SIZE_IS}]";
|
||||
} elsif ($l->{TYPE} eq "POINTER") {
|
||||
$prefixes = "*$prefixes";
|
||||
}
|
||||
}
|
||||
|
||||
return "$p $prefixes$e->{NAME}$suffixes";
|
||||
}
|
||||
|
||||
sub InitType($$$$)
|
||||
{
|
||||
my ($e, $l, $varname, $value) = @_;
|
||||
|
||||
my $t = $known_types->{$l->{DATA_TYPE}};
|
||||
|
||||
if (not $t) {
|
||||
warning($e, "Don't know how to initialize type $l->{DATA_TYPE}");
|
||||
return undef;
|
||||
}
|
||||
|
||||
# INIT can be a function
|
||||
if (ref($t->{INIT}) eq "CODE") {
|
||||
return $t->{INIT}->($e, $l, $varname, $value);
|
||||
} else {
|
||||
return $t->{INIT};
|
||||
}
|
||||
}
|
||||
|
||||
sub DissectType($$$$$)
|
||||
{
|
||||
my ($e,$l,$varname,$what,$align) = @_;
|
||||
|
||||
my $t = $known_types->{$l->{DATA_TYPE}};
|
||||
|
||||
if (not $t) {
|
||||
warning($e, "Don't know how to dissect type $l->{DATA_TYPE}");
|
||||
return undef;
|
||||
}
|
||||
|
||||
my $dissect;
|
||||
if ($what == 1) { #primitives
|
||||
$dissect = $t->{DISSECT_P};
|
||||
} elsif ($what == 2) {
|
||||
$dissect = $t->{DISSECT_D};
|
||||
}
|
||||
|
||||
return "" if not defined($dissect);
|
||||
|
||||
# DISSECT can be a function
|
||||
if (ref($dissect) eq "CODE") {
|
||||
return $dissect->($e,$l,$varname,$what,$align);
|
||||
} else {
|
||||
return $dissect;
|
||||
}
|
||||
}
|
||||
|
||||
sub LoadTypes($)
|
||||
{
|
||||
my $ndr = shift;
|
||||
foreach my $if (@{$ndr}) {
|
||||
next unless ($if->{TYPE} eq "INTERFACE");
|
||||
|
||||
foreach my $td (@{$if->{TYPES}}) {
|
||||
my $decl = uc("$if->{NAME}_$td->{NAME}");
|
||||
|
||||
my $init = sub {
|
||||
my ($e,$l,$n,$v) = @_;
|
||||
return "$n = $v;";
|
||||
};
|
||||
|
||||
my $dissect_d;
|
||||
my $dissect_p;
|
||||
if ($td->{DATA}->{TYPE} eq "UNION") {
|
||||
$decl.="_CTR";
|
||||
}
|
||||
|
||||
$dissect_p = sub {
|
||||
my ($e,$l,$n,$w,$a) = @_;
|
||||
|
||||
return "$if->{NAME}_io_$td->{NAME}_p(\"$e->{NAME}\", &$n, ps, depth)";
|
||||
};
|
||||
$dissect_d = sub {
|
||||
my ($e,$l,$n,$w,$a) = @_;
|
||||
|
||||
return "$if->{NAME}_io_$td->{NAME}_d(\"$e->{NAME}\", &$n, ps, depth)";
|
||||
};
|
||||
|
||||
AddType($td->{NAME}, {
|
||||
DECL => $decl,
|
||||
INIT => $init,
|
||||
DISSECT_D => $dissect_d,
|
||||
DISSECT_P => $dissect_p
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
@ -17,7 +17,7 @@ pidl - An IDL compiler written in Perl
|
||||
|
||||
pidl --help
|
||||
|
||||
pidl [--outputdir[=OUTNAME]] [--parse-idl-tree] [--dump-idl-tree] [--dump-ndr-tree] [--header[=OUTPUT]] [--ejs[=OUTPUT]] [--swig[=OUTPUT]] [--uint-enums] [--ndr-parser[=OUTPUT]] [--client] [--server] [--dcom-proxy] [--com-header] [--warn-compat] [--quiet] [--verbose] [--template] [--ws-parser[=OUTPUT]] [--diff] [--dump-idl] [--tdr-parser[=OUTPUT]] [--samba3-header[=OUTPUT]] [--samba3-parser=[OUTPUT]] [--samba3-server=[OUTPUT]] [--samba3-template[=OUTPUT]] [--samba3-client[=OUTPUT]] [--samba3-ndr-client[=OUTPUT]] [<idlfile>.idl]...
|
||||
pidl [--outputdir[=OUTNAME]] [--parse-idl-tree] [--dump-idl-tree] [--dump-ndr-tree] [--header[=OUTPUT]] [--ejs[=OUTPUT]] [--swig[=OUTPUT]] [--uint-enums] [--ndr-parser[=OUTPUT]] [--client] [--server] [--dcom-proxy] [--com-header] [--warn-compat] [--quiet] [--verbose] [--template] [--ws-parser[=OUTPUT]] [--diff] [--dump-idl] [--tdr-parser[=OUTPUT]] [--samba3-ndr-client[=OUTPUT]] [<idlfile>.idl]...
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
@ -120,30 +120,6 @@ file the to disk. Useful for debugging pidl.
|
||||
Tell pidl to dump the internal NDR information tree it generated
|
||||
from the IDL file to disk. Useful for debugging pidl.
|
||||
|
||||
=item I<--samba3-header>
|
||||
|
||||
Generate Samba3-style RPC header file. Filename defaults to rpc_BASENAME.h.
|
||||
|
||||
=item I<--samba3-parser>
|
||||
|
||||
Generate parser file for Samba3, to be placed in rpc_parse/. Filename defaults
|
||||
to parse_BASENAME.c.
|
||||
|
||||
=item I<--samba3-server>
|
||||
|
||||
Generate server file for Samba3, to be placed in rpc_server/. Filename defaults
|
||||
to srv_BASENAME.c.
|
||||
|
||||
=item I<--samba3-template>
|
||||
|
||||
Generate template for server-side implementation in Samba3, to be placed in
|
||||
rpc_server/. Filename defaults to srv_BASENAME_nt.c
|
||||
|
||||
=item I<--samba3-client>
|
||||
|
||||
Generate client calls for Samba 3, to be placed in rpc_client/. Filename
|
||||
defaults to cli_BASENAME.c.
|
||||
|
||||
=item I<--samba3-ndr-client>
|
||||
|
||||
Generate client calls for Samba3, to be placed in rpc_client/. Instead of
|
||||
@ -376,7 +352,7 @@ usesgetlasterror, vararg, vi_progid, wire_marshal.
|
||||
$ ./pidl --tdr-parser --header -- regf.idl
|
||||
|
||||
# Generating a Samba3 parser, client and server
|
||||
$ ./pidl --samba3-parser --samba3-server --samba3-client -- dfs.idl
|
||||
$ ./pidl --samba3-ndr-client -- dfs.idl
|
||||
|
||||
# Generating a Samba4 NDR parser, client and server
|
||||
$ ./pidl --ndr-parser --ndr-client --ndr-server -- samr.idl
|
||||
@ -469,7 +445,6 @@ my($opt_header);
|
||||
my($opt_samba3_header);
|
||||
my($opt_samba3_parser);
|
||||
my($opt_samba3_server);
|
||||
my($opt_samba3_template);
|
||||
my($opt_samba3_ndr_client);
|
||||
my($opt_template) = 0;
|
||||
my($opt_client);
|
||||
@ -524,11 +499,6 @@ Samba 4 output:
|
||||
--com-header[=OUTFILE] create header for COM [com_BASENAME.h]
|
||||
|
||||
Samba 3 output:
|
||||
--samba3-header[=OUTF] create Samba3-style header [rpc_BASENAME.h]
|
||||
--samba3-parser[=OUTF] create parser for Samba3 [parse_BASENAME.c]
|
||||
--samba3-template[=OUTF]create template implementation [srv_BASENAME_nt.c]
|
||||
--samba3-server[=OUTF] create server side wrappers for Samba3 [srv_BASENAME.c]
|
||||
--samba3-client[=OUTF] create client calls for Samba3 [cli_BASENAME.c]
|
||||
--samba3-ndr-client[=OUTF] create client calls for Samba3
|
||||
using Samba4's NDR code [cli_BASENAME.c]
|
||||
|
||||
@ -547,10 +517,6 @@ my $result = GetOptions (
|
||||
'parse-idl-tree' => \$opt_parse_idl_tree,
|
||||
'dump-ndr-tree:s' => \$opt_dump_ndr_tree,
|
||||
'uint-enums' => \$opt_uint_enums,
|
||||
'samba3-header:s' => \$opt_samba3_header,
|
||||
'samba3-parser:s' => \$opt_samba3_parser,
|
||||
'samba3-server:s' => \$opt_samba3_server,
|
||||
'samba3-template:s' => \$opt_samba3_template,
|
||||
'samba3-ndr-client:s' => \$opt_samba3_ndr_client,
|
||||
'header:s' => \$opt_header,
|
||||
'server:s' => \$opt_server,
|
||||
@ -653,7 +619,6 @@ sub process_file($)
|
||||
defined($opt_ndr_parser) or defined($opt_ejs) or
|
||||
defined($opt_dump_ndr_tree) or defined($opt_samba3_header) or
|
||||
defined($opt_samba3_parser) or defined($opt_samba3_server) or
|
||||
defined($opt_samba3_template) or
|
||||
defined($opt_swig) or defined($opt_samba3_ndr_client)) {
|
||||
require Parse::Pidl::NDR;
|
||||
$ndr = Parse::Pidl::NDR::Parse($pidl);
|
||||
@ -765,37 +730,6 @@ $dcom
|
||||
print Parse::Pidl::Samba4::Template::Parse($pidl);
|
||||
}
|
||||
|
||||
if (defined($opt_samba3_header) or defined($opt_samba3_parser) or
|
||||
defined($opt_samba3_server) or
|
||||
defined($opt_samba3_ndr_client) or defined($opt_samba3_template)) {
|
||||
require Parse::Pidl::Samba3::Types;
|
||||
Parse::Pidl::Samba3::Types::LoadTypes($ndr);
|
||||
}
|
||||
|
||||
if (defined($opt_samba3_header)) {
|
||||
my $header = ($opt_samba3_header or "$outputdir/rpc_$basename.h");
|
||||
require Parse::Pidl::Samba3::Header;
|
||||
FileSave($header, Parse::Pidl::Samba3::Header::Parse($ndr, $basename));
|
||||
}
|
||||
|
||||
if (defined($opt_samba3_parser)) {
|
||||
my $header = ($opt_samba3_parser or "$outputdir/parse_$basename.c");
|
||||
require Parse::Pidl::Samba3::Parser;
|
||||
FileSave($header, Parse::Pidl::Samba3::Parser::Parse($ndr, $basename));
|
||||
}
|
||||
|
||||
if (defined($opt_samba3_server)) {
|
||||
my $header = ($opt_samba3_server or "$outputdir/srv_$basename.c");
|
||||
require Parse::Pidl::Samba3::Server;
|
||||
FileSave($header, Parse::Pidl::Samba3::Server::Parse($ndr, $basename));
|
||||
}
|
||||
|
||||
if (defined($opt_samba3_template)) {
|
||||
my $header = ($opt_samba3_template or "$outputdir/srv_$basename\_nt.c");
|
||||
require Parse::Pidl::Samba3::Template;
|
||||
FileSave($header, Parse::Pidl::Samba3::Template::Parse($ndr, $basename));
|
||||
}
|
||||
|
||||
if (defined($opt_samba3_ndr_client)) {
|
||||
my $client = ($opt_samba3_ndr_client or "$outputdir/cli_$basename.c");
|
||||
my $header = $client; $header =~ s/\.c$/\.h/;
|
||||
|
Loading…
Reference in New Issue
Block a user