diff options
Diffstat (limited to 'source4/pidl')
-rw-r--r-- | source4/pidl/lib/Parse/Pidl/Samba3/Parser.pm | 22 | ||||
-rw-r--r-- | source4/pidl/lib/Parse/Pidl/Samba3/Types.pm | 26 |
2 files changed, 26 insertions, 22 deletions
diff --git a/source4/pidl/lib/Parse/Pidl/Samba3/Parser.pm b/source4/pidl/lib/Parse/Pidl/Samba3/Parser.pm index b65ece5a12..ac7fde69a6 100644 --- a/source4/pidl/lib/Parse/Pidl/Samba3/Parser.pm +++ b/source4/pidl/lib/Parse/Pidl/Samba3/Parser.pm @@ -71,14 +71,7 @@ sub ParseElementLevelData($$$$$$$) { my ($e,$l,$nl,$env,$varname,$what,$align) = @_; - my @args = ($e,$l,$varname,$what); - - if (defined($e->{ALIGN})) { - Align($align, $e->{ALIGN}); - } else { - # Default to 4 - Align($align, 4); - } + my @args = ($e,$l,$varname,$what,$align); # See if we need to add a level argument because we're parsing a union foreach (@{$e->{LEVELS}}) { @@ -89,6 +82,13 @@ sub ParseElementLevelData($$$$$$$) my $c = DissectType(@args); 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;"; } @@ -300,13 +300,15 @@ sub ParseStruct($$$) 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; + } - my $align = 0; foreach (@{$s->{ELEMENTS}}) { ParseElement($_, $env, PRIMITIVES, \$align); pidl ""; @@ -393,7 +395,7 @@ sub ParseUnion($$$) if ($_->{TYPE} ne "EMPTY") { pidl "depth++;"; my $env = UnionGenerateEnvElement($_); - my $align = 0; + my $align = 8; ParseElement($_, $env, PRIMITIVES, \$align); pidl "depth--;"; } diff --git a/source4/pidl/lib/Parse/Pidl/Samba3/Types.pm b/source4/pidl/lib/Parse/Pidl/Samba3/Types.pm index 0c66d2c6ad..8cb09343ac 100644 --- a/source4/pidl/lib/Parse/Pidl/Samba3/Types.pm +++ b/source4/pidl/lib/Parse/Pidl/Samba3/Types.pm @@ -27,9 +27,9 @@ sub init_scalar($$$$) return "$n = $v;"; } -sub dissect_scalar($$$) +sub dissect_scalar($$$$$) { - my ($e,$l,$n) = @_; + my ($e,$l,$n,$w,$a) = @_; my $t = lc($e->{TYPE}); @@ -94,12 +94,13 @@ sub init_string($$$$) return "init_$t(&$n, $v, $flags);"; } -sub dissect_string($$$) +sub dissect_string($$$$$) { - my ($e,$l,$n) = @_; + my ($e,$l,$n,$w,$a) = @_; my $t = lc(decl_string($e)); + $$a = 1; return "smb_io_$t(\"$e->{NAME}\", &$n, 1, ps, depth)"; } @@ -162,7 +163,7 @@ my $known_types = DECL => "NTTIME", INIT => "", DISSECT_P => sub { - my ($e,$l,$n) = @_; + my ($e,$l,$n,$w,$a) = @_; return "smb_io_nttime(\"$e->{NAME}\", &n, ps, depth)"; } }, @@ -171,7 +172,7 @@ my $known_types = DECL => "DOM_SID", INIT => "", DISSECT_P => sub { - my ($e,$l,$n) = @_; + my ($e,$l,$n,$w,$a) = @_; return "smb_io_dom_sid(\"$e->{NAME}\", &n, ps, depth)"; } }, @@ -180,7 +181,7 @@ my $known_types = DECL => "POLICY_HND", INIT => "", DISSECT_P => sub { - my ($e,$l,$n) = @_; + my ($e,$l,$n,$w,$a) = @_; return "smb_io_pol_hnd(\"$e->{NAME}\", &n, ps, depth)"; } }, @@ -189,7 +190,7 @@ my $known_types = DECL => "uint64", INIT => "", DISSECT_P => sub { - my ($e,$l,$n) = @_; + my ($e,$l,$n,$w,$a) = @_; return "prs_uint64(\"$e->{NAME}\", ps, depth, &$n)"; } }, @@ -311,6 +312,7 @@ sub DissectType my $l = shift @_; my $varname = shift @_; my $what = shift @_; + my $align = shift @_; my $t = $known_types->{$l->{DATA_TYPE}}; @@ -355,25 +357,25 @@ sub LoadTypes($) if ($td->{DATA}->{TYPE} eq "UNION") { $decl.="_CTR"; $dissect_p = sub { - my ($e,$l,$n,$w,$s) = @_; + my ($e,$l,$n,$w,$a,$s) = @_; return "$if->{NAME}_io_$td->{NAME}_p(\"$e->{NAME}\", &$n, $s, ps, depth)"; }; $dissect_d = sub { - my ($e,$l,$n,$w,$s) = @_; + my ($e,$l,$n,$w,$a,$s) = @_; return "$if->{NAME}_io_$td->{NAME}_d(\"$e->{NAME}\", &$n, $s, ps, depth)"; }; } else { $dissect_p = sub { - my ($e,$l,$n,$w) = @_; + 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) = @_; + my ($e,$l,$n,$w,$a) = @_; return "$if->{NAME}_io_$td->{NAME}_d(\"$e->{NAME}\", &$n, ps, depth)"; }; |