mirror of
https://github.com/samba-team/samba.git
synced 2025-01-12 09:18:10 +03:00
r11061: Samba3 parser generator fixes:
* Add (limited) support for [string]
* Don't generate (and set) header elements for top level ref pointers as
they don't appear on the wire
(This used to be commit 765adaf19b
)
This commit is contained in:
parent
ebe6f9ea49
commit
6f3caf73e1
@ -9,7 +9,7 @@ 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);
|
||||
use Parse::Pidl::Samba3::Types qw(DeclShort StringType);
|
||||
|
||||
use vars qw($VERSION);
|
||||
$VERSION = '0.01';
|
||||
@ -28,11 +28,15 @@ sub ParseElement($)
|
||||
|
||||
foreach my $l (@{$e->{LEVELS}}) {
|
||||
if ($l->{TYPE} eq "POINTER") {
|
||||
return if ($l->{POINTER_TYPE} eq "ref" and $l->{LEVEL} eq "top");
|
||||
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") {
|
||||
pidl "\t" . DeclShort($e) . ";";
|
||||
} 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};";
|
||||
|
@ -9,7 +9,7 @@ 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);
|
||||
use Parse::Pidl::Samba3::Types qw(DeclShort DeclLong InitType DissectType StringType);
|
||||
|
||||
use vars qw($VERSION);
|
||||
$VERSION = '0.01';
|
||||
@ -27,7 +27,7 @@ sub fatal($$) { my ($e,$s) = @_; die("$e->{FILE}:$e->{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]
|
||||
# - [string] with non-varying arrays
|
||||
# - subcontext()
|
||||
# - DATA_BLOB
|
||||
|
||||
@ -58,7 +58,7 @@ sub DeclareArrayVariables
|
||||
next if ($l->{IS_DEFERRED} and $what == PRIMITIVES);
|
||||
next if (not $l->{IS_DEFERRED} and $what == DEFERRED);
|
||||
}
|
||||
if ($l->{TYPE} eq "ARRAY") {
|
||||
if ($l->{TYPE} eq "ARRAY" and not $l->{IS_ZERO_TERMINATED}) {
|
||||
pidl "uint32 i_$e->{NAME}_$l->{LEVEL_INDEX};";
|
||||
$output = 1;
|
||||
}
|
||||
@ -90,9 +90,14 @@ sub ParseElementLevelArray($$$$$$$)
|
||||
my ($e,$l,$nl,$env,$varname,$what,$align) = @_;
|
||||
|
||||
if ($l->{IS_ZERO_TERMINATED}) {
|
||||
fatal($e, "[string] attribute not supported for Samba3 yet");
|
||||
|
||||
#FIXME
|
||||
my ($t,$f) = StringType($e,$l);
|
||||
|
||||
pidl "if (!prs_io_$t(\"$e->{VARNAME}\", ps, depth, $varname))";
|
||||
pidl "\treturn False;";
|
||||
pidl "";
|
||||
|
||||
$$align = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
my $len = ParseExpr($l->{LENGTH_IS}, $env);
|
||||
@ -228,7 +233,9 @@ sub InitLevel($$$$)
|
||||
indent;
|
||||
}
|
||||
|
||||
pidl ParseExpr("ptr$l->{POINTER_INDEX}_$e->{NAME}", $env) . " = 1;";
|
||||
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") {
|
||||
@ -237,6 +244,9 @@ sub InitLevel($$$$)
|
||||
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) . ", $varname, $f);";
|
||||
} elsif ($l->{TYPE} eq "ARRAY") {
|
||||
pidl ParseExpr($e->{NAME}, $env) . " = $varname;";
|
||||
} elsif ($l->{TYPE} eq "DATA") {
|
||||
@ -256,7 +266,7 @@ sub GenerateEnvElement($$)
|
||||
} 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") {
|
||||
} 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}";
|
||||
@ -360,7 +370,7 @@ sub UnionGenerateEnvElement($)
|
||||
} 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") {
|
||||
} 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";
|
||||
|
@ -7,7 +7,7 @@ package Parse::Pidl::Samba3::Types;
|
||||
|
||||
require Exporter;
|
||||
@ISA = qw(Exporter);
|
||||
@EXPORT_OK = qw(DeclShort DeclLong InitType DissectType AddType);
|
||||
@EXPORT_OK = qw(DeclShort DeclLong InitType DissectType AddType StringType);
|
||||
|
||||
use strict;
|
||||
use Parse::Pidl::Util qw(has_property ParseExpr property_matches);
|
||||
@ -104,6 +104,20 @@ sub dissect_string($$$$$)
|
||||
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", 0);
|
||||
} 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 =>
|
||||
|
Loading…
Reference in New Issue
Block a user