From 42ef2f8e7b114ee5620921a2f51566cdefd7afe9 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 9 Feb 2005 21:53:25 +0000 Subject: r5288: Make alignment code more generic (This used to be commit 5c2f0df566804cf0b8879504f5e41a8100a7fd40) --- source4/build/pidl/parser.pm | 74 +++++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 32 deletions(-) (limited to 'source4/build') diff --git a/source4/build/pidl/parser.pm b/source4/build/pidl/parser.pm index f1942cef73..755e0a1a68 100644 --- a/source4/build/pidl/parser.pm +++ b/source4/build/pidl/parser.pm @@ -1,5 +1,5 @@ ################################################### -# Samba4 parser generator for IDL structures +# Samba4 NDR parser generator for IDL structures # Copyright tridge@samba.org 2000-2003 # Copyright tpot@samba.org 2001 # Copyright jelmer@samba.org 2004 @@ -10,8 +10,8 @@ package IdlParser; use strict; use needed; -# the list of needed functions -my %structs; +# list of known types +my %typedefs; sub pidl($) { @@ -184,20 +184,7 @@ sub struct_alignment for my $e (@{$s->{ELEMENTS}}) { my $a = 1; - if (!util::need_wire_pointer($e) - && defined $structs{$e->{TYPE}}) { - if ($structs{$e->{TYPE}}->{DATA}->{TYPE} eq "STRUCT") { - $a = struct_alignment($structs{$e->{TYPE}}->{DATA}); - } elsif ($structs{$e->{TYPE}}->{DATA}->{TYPE} eq "UNION") { - if (defined $structs{$e->{TYPE}}->{DATA}) { - $a = union_alignment($structs{$e->{TYPE}}->{DATA}); - } - } elsif ($structs{$e->{TYPE}}->{DATA}->{TYPE} eq "ENUM") { - $a = util::type_align($e); - } - } else { - $a = util::type_align($e); - } + $a = align_type($e); if ($align < $a) { $align = $a; @@ -222,17 +209,7 @@ sub union_alignment next; } - if (!util::need_wire_pointer($e) - && defined $structs{$e->{DATA}->{TYPE}}) { - my $s = $structs{$e->{DATA}->{TYPE}}; - if ($s->{DATA}->{TYPE} eq "STRUCT") { - $a = struct_alignment($s->{DATA}); - } elsif ($s->{DATA}->{TYPE} eq "UNION") { - $a = union_alignment($s->{DATA}); - } - } else { - $a = util::type_align($e->{DATA}); - } + $a = align_type($e->{DATA}); if ($align < $a) { $align = $a; @@ -242,6 +219,28 @@ sub union_alignment return $align; } +##################################################################### +# align a type +sub align_type +{ + my $e = shift; + + if (!util::need_wire_pointer($e) + && defined $typedefs{$e->{TYPE}}) { + if ($typedefs{$e->{TYPE}}->{DATA}->{TYPE} eq "STRUCT") { + return struct_alignment($typedefs{$e->{TYPE}}->{DATA}); + } elsif ($typedefs{$e->{TYPE}}->{DATA}->{TYPE} eq "UNION") { + if (defined $typedefs{$e->{TYPE}}->{DATA}) { + return union_alignment($typedefs{$e->{TYPE}}->{DATA}); + } + } elsif ($typedefs{$e->{TYPE}}->{DATA}->{TYPE} eq "ENUM") { + return util::type_align($e); + } + } else { + return util::type_align($e); + } +} + ##################################################################### # parse an array - push side sub ParseArrayPush($$$) @@ -457,7 +456,7 @@ sub ParseElementPullSwitch($$$$) my $cprefix = util::c_pull_prefix($e); - my $utype = $structs{$e->{TYPE}}; + my $utype = $typedefs{$e->{TYPE}}; check_null_pointer($switch_var); @@ -511,7 +510,7 @@ sub ParseElementPushSwitch($$$$) check_null_pointer($switch_var); - my $utype = $structs{$e->{TYPE}}; + my $utype = $typedefs{$e->{TYPE}}; if (!defined $utype || !util::has_property($utype, "nodiscriminant")) { my $e2 = find_sibling($e, $switch); @@ -1713,10 +1712,10 @@ sub ParseInterface($) foreach my $d (@{$data}) { if ($d->{TYPE} eq "DECLARE") { - $structs{$d->{NAME}} = $d; + $typedefs{$d->{NAME}} = $d; } if ($d->{TYPE} eq "TYPEDEF") { - $structs{$d->{NAME}} = $d; + $typedefs{$d->{NAME}} = $d; } } @@ -1812,3 +1811,14 @@ sub Parse($$) } 1; + +#Each type can: +# +#- Generate push fn +#- Generate pull fn +#- Generate print fn +#- Generate push array fn +#- Generate pull array fn +#- Generate print fn +#- align size +#- "push prefix" -- cgit