diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2005-07-19 23:02:08 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:29:44 -0500 |
commit | f3a10494db3fe45b73f261b6f53cf43f041ce4ed (patch) | |
tree | ea04e33039e0892e8b5e7d9c5900dcb4cb299c8b /source4/build/pidl | |
parent | 4f3d66b0dfe49d5485eafce52f3abf4c6581bf57 (diff) | |
download | samba-f3a10494db3fe45b73f261b6f53cf43f041ce4ed.tar.gz samba-f3a10494db3fe45b73f261b6f53cf43f041ce4ed.tar.bz2 samba-f3a10494db3fe45b73f261b6f53cf43f041ce4ed.zip |
r8621: Simplify code. Add support for nested structures back into the header generator.
(This used to be commit 5610838385ca00a944fb4765df1854954a3a81bc)
Diffstat (limited to 'source4/build/pidl')
-rw-r--r-- | source4/build/pidl/Parse/Pidl/Samba/NDR/Header.pm | 130 | ||||
-rw-r--r-- | source4/build/pidl/Parse/Pidl/Samba/NDR/Parser.pm | 107 | ||||
-rw-r--r-- | source4/build/pidl/Parse/Pidl/Typelist.pm | 2 | ||||
-rw-r--r-- | source4/build/pidl/Parse/Pidl/Util.pm | 2 | ||||
-rw-r--r-- | source4/build/pidl/TODO | 2 | ||||
-rwxr-xr-x | source4/build/pidl/pidl | 2 |
6 files changed, 80 insertions, 165 deletions
diff --git a/source4/build/pidl/Parse/Pidl/Samba/NDR/Header.pm b/source4/build/pidl/Parse/Pidl/Samba/NDR/Header.pm index 05982488c9..7959ef1e22 100644 --- a/source4/build/pidl/Parse/Pidl/Samba/NDR/Header.pm +++ b/source4/build/pidl/Parse/Pidl/Samba/NDR/Header.pm @@ -7,8 +7,8 @@ package Parse::Pidl::Samba::NDR::Header; use strict; -use Parse::Pidl::Typelist; -use Parse::Pidl::Util qw(has_property); +use Parse::Pidl::Typelist qw(mapType); +use Parse::Pidl::Util qw(has_property is_constant); use Parse::Pidl::NDR qw(GetNextLevel GetPrevLevel); use Parse::Pidl::Samba::NDR::Parser; @@ -22,9 +22,9 @@ sub pidl ($) sub tabs() { - for (my($i)=0; $i < $tab_depth; $i++) { - pidl "\t"; - } + my $res = ""; + $res .="\t" foreach (1..$tab_depth); + return $res; } ##################################################################### @@ -57,32 +57,20 @@ sub HeaderElement($) pidl tabs(); HeaderType($element, $element->{TYPE}, ""); pidl " "; - my $prefix = ""; - my $postfix = ""; - foreach my $l (@{$element->{LEVELS}}) + my $numstar = $element->{POINTERS}; + foreach (@{$element->{ARRAY_LEN}}) { - if (($l->{TYPE} eq "POINTER")) { - my $nl = GetNextLevel($element, $l); - $nl = GetNextLevel($element, $nl) if ($nl->{TYPE} eq "SUBCONTEXT"); - next if ($nl->{TYPE} eq "DATA" and Parse::Pidl::Typelist::scalar_is_reference($nl->{DATA_TYPE})); - $prefix .= "*"; - } elsif ($l->{TYPE} eq "ARRAY") { - my $pl = GetPrevLevel($element, $l); - next if ($pl and $pl->{TYPE} eq "POINTER"); - - if ($l->{IS_FIXED}) { - $postfix .= "[$l->{SIZE_IS}]"; - } else { - $prefix .= "*"; - } - } elsif ($l->{TYPE} eq "DATA") { - pidl "$prefix$element->{NAME}$postfix"; - } + next if is_constant($_); + $numstar++; } - - if (defined $element->{ARRAY_LEN}[0] && Parse::Pidl::Util::is_constant($element->{ARRAY_LEN}[0])) { - pidl "[$element->{ARRAY_LEN}[0]]"; + $numstar-- if ($element->{TYPE} eq "string"); + pidl "*" foreach (1..$numstar); + pidl $element->{NAME}; + foreach (@{$element->{ARRAY_LEN}}) { + next unless is_constant($_); + pidl "[$_]"; } + pidl ";"; if (defined $element->{PROPERTIES}) { HeaderProperties($element->{PROPERTIES}, ["in", "out"]); @@ -95,7 +83,7 @@ sub HeaderElement($) sub HeaderStruct($$) { my($struct,$name) = @_; - pidl "\nstruct $name {\n"; + pidl "struct $name {\n"; $tab_depth++; my $el_count=0; if (defined $struct->{ELEMENTS}) { @@ -106,10 +94,10 @@ sub HeaderStruct($$) } if ($el_count == 0) { # some compilers can't handle empty structures - pidl "\tchar _empty_;\n"; + pidl tabs()."char _empty_;\n"; } $tab_depth--; - pidl "}"; + pidl tabs()."}"; if (defined $struct->{PROPERTIES}) { HeaderProperties($struct->{PROPERTIES}, []); } @@ -123,12 +111,12 @@ sub HeaderEnum($$) my $first = 1; if (not Parse::Pidl::Util::useUintEnums()) { - pidl "\nenum $name {\n"; + pidl "enum $name {\n"; $tab_depth++; foreach my $e (@{$enum->{ELEMENTS}}) { unless ($first) { pidl ",\n"; } $first = 0; - tabs(); + pidl tabs(); pidl $e; } pidl "\n"; @@ -136,7 +124,7 @@ sub HeaderEnum($$) pidl "}"; } else { my $count = 0; - pidl "\nenum $name { __donnot_use_enum_$name=0x7FFFFFFF};\n"; + pidl "enum $name { __donnot_use_enum_$name=0x7FFFFFFF};\n"; my $with_val = 0; my $without_val = 0; foreach my $e (@{$enum->{ELEMENTS}}) { @@ -168,13 +156,8 @@ sub HeaderBitmap($$) { my($bitmap,$name) = @_; - pidl "\n/* bitmap $name */\n"; - - foreach my $e (@{$bitmap->{ELEMENTS}}) - { - pidl "#define $e\n"; - } - + pidl "/* bitmap $name */\n"; + pidl "#define $_\n" foreach (@{$bitmap->{ELEMENTS}}); pidl "\n"; } @@ -185,7 +168,7 @@ sub HeaderUnion($$) my($union,$name) = @_; my %done = (); - pidl "\nunion $name {\n"; + pidl "union $name {\n"; $tab_depth++; foreach my $e (@{$union->{ELEMENTS}}) { if ($e->{TYPE} ne "EMPTY") { @@ -219,7 +202,7 @@ sub HeaderType($$$) if (has_property($e, "charset")) { pidl "const char"; } else { - pidl Parse::Pidl::Typelist::mapType($e->{TYPE}); + pidl mapType($e->{TYPE}); } } @@ -229,7 +212,7 @@ sub HeaderTypedef($) { my($typedef) = shift; HeaderType($typedef, $typedef->{DATA}, $typedef->{NAME}); - pidl ";\n" unless ($typedef->{DATA}->{TYPE} eq "BITMAP"); + pidl ";\n\n" unless ($typedef->{DATA}->{TYPE} eq "BITMAP"); } ##################################################################### @@ -247,17 +230,14 @@ sub HeaderTypedefProto($) return unless has_property($d, "public"); - my $pull_args = $tf->{PULL_FN_ARGS}->($d); - my $push_args = $tf->{PUSH_FN_ARGS}->($d); - my $print_args = $tf->{PRINT_FN_ARGS}->($d); unless (has_property($d, "nopush")) { - pidl "NTSTATUS ndr_push_$d->{NAME}($push_args);\n"; + pidl "NTSTATUS ndr_push_$d->{NAME}(struct ndr_push *ndr, int ndr_flags, " . $tf->{DECL}->($d, "push") . ");\n"; } unless (has_property($d, "nopull")) { - pidl "NTSTATUS ndr_pull_$d->{NAME}($pull_args);\n"; + pidl "NTSTATUS ndr_pull_$d->{NAME}(struct ndr_pull *ndr, int ndr_flags, " . $tf->{DECL}->($d, "pull") . ");\n"; } unless (has_property($d, "noprint")) { - pidl "void ndr_print_$d->{NAME}($print_args);\n"; + pidl "void ndr_print_$d->{NAME}(struct ndr_print *ndr, const char *name, " . $tf->{DECL}->($d, "print") . ");\n"; } } @@ -292,14 +272,10 @@ sub HeaderFunctionInOut_needed($$) { my($fn,$prop) = @_; - if ($prop eq "out" && $fn->{RETURN_TYPE}) { - return 1; - } + return 1 if ($prop eq "out" && $fn->{RETURN_TYPE} ne "void"); - foreach my $e (@{$fn->{ELEMENTS}}) { - if (has_property($e, $prop)) { - return 1; - } + foreach (@{$fn->{ELEMENTS}}) { + return 1 if (has_property($_, $prop)); } return undef; @@ -322,35 +298,29 @@ sub HeaderFunction($) my $needed = 0; if (HeaderFunctionInOut_needed($fn, "in")) { - tabs(); - pidl "struct {\n"; + pidl tabs()."struct {\n"; $tab_depth++; HeaderFunctionInOut($fn, "in"); $tab_depth--; - tabs(); - pidl "} in;\n\n"; + pidl tabs()."} in;\n\n"; $needed++; } if (HeaderFunctionInOut_needed($fn, "out")) { - tabs(); - pidl "struct {\n"; + pidl tabs()."struct {\n"; $tab_depth++; HeaderFunctionInOut($fn, "out"); - if ($fn->{RETURN_TYPE}) { - tabs(); - pidl Parse::Pidl::Typelist::mapType($fn->{RETURN_TYPE}) . " result;\n"; + if ($fn->{RETURN_TYPE} ne "void") { + pidl tabs().mapType($fn->{RETURN_TYPE}) . " result;\n"; } $tab_depth--; - tabs(); - pidl "} out;\n\n"; + pidl tabs()."} out;\n\n"; $needed++; } if (! $needed) { # sigh - some compilers don't like empty structures - tabs(); - pidl "int _dummy_element;\n"; + pidl tabs()."int _dummy_element;\n"; } $tab_depth--; @@ -366,7 +336,7 @@ sub HeaderFnProto($$) pidl "void ndr_print_$name(struct ndr_print *ndr, const char *name, int flags, const struct $name *r);\n"; - if (defined($fn->{OPNUM})) { + unless (has_property($fn, "noopnum")) { pidl "NTSTATUS dcerpc_$name(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $name *r);\n"; pidl "struct rpc_request *dcerpc_$name\_send(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $name *r);\n"; } @@ -414,8 +384,9 @@ sub HeaderInterface($) pidl "NTSTATUS dcerpc_server_$interface->{NAME}_init(void);\n\n"; } - foreach my $d (@{$interface->{FUNCTIONS}}) { - next if not defined($d->{OPNUM}); + foreach my $d (@{$interface->{DATA}}) { + next if $d->{TYPE} ne "FUNCTION"; + next if has_property($d, "noopnum"); my $u_name = uc $d->{NAME}; pidl "#define DCERPC_$u_name ("; @@ -423,10 +394,6 @@ sub HeaderInterface($) pidl "DCERPC_" . uc $interface->{BASE} . "_CALL_COUNT + "; } - if ($d->{OPNUM} != $count) { - die ("Function ".$d->{NAME}." has: wrong opnum [".$d->{OPNUM}."] should be [".$count."]"); - } - pidl sprintf("0x%02x", $count) . ")\n"; $count++; } @@ -439,16 +406,19 @@ sub HeaderInterface($) pidl "$count)\n\n"; - foreach my $d (@{$interface->{CONSTS}}) { + foreach my $d (@{$interface->{DATA}}) { + next if ($d->{TYPE} ne "CONST"); HeaderConst($d); } - foreach my $d (@{$interface->{TYPEDEFS}}) { + foreach my $d (@{$interface->{DATA}}) { + next if ($d->{TYPE} ne "TYPEDEF"); HeaderTypedef($d); HeaderTypedefProto($d); } - foreach my $d (@{$interface->{FUNCTIONS}}) { + foreach my $d (@{$interface->{DATA}}) { + next if ($d->{TYPE} ne "FUNCTION"); HeaderFunction($d); HeaderFnProto($interface, $d); } diff --git a/source4/build/pidl/Parse/Pidl/Samba/NDR/Parser.pm b/source4/build/pidl/Parse/Pidl/Samba/NDR/Parser.pm index c720ad6925..85bd2ae8c7 100644 --- a/source4/build/pidl/Parse/Pidl/Samba/NDR/Parser.pm +++ b/source4/build/pidl/Parse/Pidl/Samba/NDR/Parser.pm @@ -8,7 +8,7 @@ package Parse::Pidl::Samba::NDR::Parser; use strict; -use Parse::Pidl::Typelist qw(hasType getType); +use Parse::Pidl::Typelist qw(hasType getType mapType); use Parse::Pidl::Util qw(has_property ParseExpr); use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred); @@ -1100,31 +1100,18 @@ sub ParseEnumPrint($$) end_flags($enum); } -sub ArgsEnumPush($) +sub DeclEnum($) { - my $e = shift; - return "struct ndr_push *ndr, int ndr_flags, enum $e->{NAME} r"; -} - -sub ArgsEnumPrint($) -{ - my $e = shift; - return "struct ndr_print *ndr, const char *name, enum $e->{NAME} r"; -} - -sub ArgsEnumPull($) -{ - my $e = shift; - return "struct ndr_pull *ndr, int ndr_flags, enum $e->{NAME} *r"; + my ($e,$t) = @_; + return "enum $e->{NAME} " . + ($t eq "pull"?"*":"") . "r"; } $typefamily{ENUM} = { + DECL => \&DeclEnum, PUSH_FN_BODY => \&ParseEnumPush, - PUSH_FN_ARGS => \&ArgsEnumPush, PULL_FN_BODY => \&ParseEnumPull, - PULL_FN_ARGS => \&ArgsEnumPull, PRINT_FN_BODY => \&ParseEnumPrint, - PRINT_FN_ARGS => \&ArgsEnumPrint, }; ##################################################################### @@ -1196,34 +1183,18 @@ sub ParseBitmapPrint($$) end_flags($bitmap); } -sub ArgsBitmapPush($) +sub DeclBitmap($$) { - my $e = shift; - my $type_decl = Parse::Pidl::Typelist::mapType($e->{DATA}->{BASE_TYPE}); - return "struct ndr_push *ndr, int ndr_flags, $type_decl r"; -} - -sub ArgsBitmapPrint($) -{ - my $e = shift; - my $type_decl = Parse::Pidl::Typelist::mapType($e->{DATA}->{BASE_TYPE}); - return "struct ndr_print *ndr, const char *name, $type_decl r"; -} - -sub ArgsBitmapPull($) -{ - my $e = shift; - my $type_decl = Parse::Pidl::Typelist::mapType($e->{DATA}->{BASE_TYPE}); - return "struct ndr_pull *ndr, int ndr_flags, $type_decl *r"; + my ($e,$t) = @_; + return mapType(Parse::Pidl::Typelist::bitmap_type_fn($e->{DATA})) . + ($t eq "pull"?" *":" ") . "r"; } $typefamily{BITMAP} = { + DECL => \&DeclBitmap, PUSH_FN_BODY => \&ParseBitmapPush, - PUSH_FN_ARGS => \&ArgsBitmapPush, PULL_FN_BODY => \&ParseBitmapPull, - PULL_FN_ARGS => \&ArgsBitmapPull, PRINT_FN_BODY => \&ParseBitmapPrint, - PRINT_FN_ARGS => \&ArgsBitmapPrint, }; ##################################################################### @@ -1352,22 +1323,10 @@ sub ParseStructNdrSize($) pidl "return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_$t->{NAME});"; } -sub ArgsStructPush($) +sub DeclStruct($) { - my $e = shift; - return "struct ndr_push *ndr, int ndr_flags, const struct $e->{NAME} *r"; -} - -sub ArgsStructPrint($) -{ - my $e = shift; - return "struct ndr_print *ndr, const char *name, const struct $e->{NAME} *r"; -} - -sub ArgsStructPull($) -{ - my $e = shift; - return "struct ndr_pull *ndr, int ndr_flags, struct $e->{NAME} *r"; + my ($e,$t) = @_; + return ($t ne "pull"?"const ":"") . "struct $e->{NAME} *r"; } sub ArgsStructNdrSize($) @@ -1378,11 +1337,9 @@ sub ArgsStructNdrSize($) $typefamily{STRUCT} = { PUSH_FN_BODY => \&ParseStructPush, - PUSH_FN_ARGS => \&ArgsStructPush, + DECL => \&DeclStruct, PULL_FN_BODY => \&ParseStructPull, - PULL_FN_ARGS => \&ArgsStructPull, PRINT_FN_BODY => \&ParseStructPrint, - PRINT_FN_ARGS => \&ArgsStructPrint, SIZE_FN_BODY => \&ParseStructNdrSize, SIZE_FN_ARGS => \&ArgsStructNdrSize, }; @@ -1625,22 +1582,10 @@ sub ParseUnionPull($$) pidl "ndr_pull_restore_relative_base_offset(ndr, _save_relative_base_offset);" if defined($e->{PROPERTIES}{relative_base}); } -sub ArgsUnionPush($) +sub DeclUnion($$) { - my $e = shift; - return "struct ndr_push *ndr, int ndr_flags, const union $e->{NAME} *r"; -} - -sub ArgsUnionPrint($) -{ - my $e = shift; - return "struct ndr_print *ndr, const char *name, const union $e->{NAME} *r"; -} - -sub ArgsUnionPull($) -{ - my $e = shift; - return "struct ndr_pull *ndr, int ndr_flags, union $e->{NAME} *r"; + my ($e,$t) = @_; + return ($t ne "pull"?"const ":"") . "union $e->{NAME} *r"; } sub ArgsUnionNdrSize($) @@ -1651,11 +1596,9 @@ sub ArgsUnionNdrSize($) $typefamily{UNION} = { PUSH_FN_BODY => \&ParseUnionPush, - PUSH_FN_ARGS => \&ArgsUnionPush, + DECL => \&DeclUnion, PULL_FN_BODY => \&ParseUnionPull, - PULL_FN_ARGS => \&ArgsUnionPull, PRINT_FN_BODY => \&ParseUnionPrint, - PRINT_FN_ARGS => \&ArgsUnionPrint, SIZE_FN_ARGS => \&ArgsUnionNdrSize, SIZE_FN_BODY => \&ParseUnionNdrSize, }; @@ -1666,8 +1609,8 @@ sub ParseTypedefPush($) { my($e) = shift; - my $args = $typefamily{$e->{DATA}->{TYPE}}->{PUSH_FN_ARGS}->($e); - pidl fn_prefix($e) . "NTSTATUS ndr_push_$e->{NAME}($args)"; + my $args = $typefamily{$e->{DATA}->{TYPE}}->{DECL}->($e,"push"); + pidl fn_prefix($e) . "NTSTATUS ndr_push_$e->{NAME}(struct ndr_push *ndr, int ndr_flags, $args)"; pidl "{"; indent; @@ -1684,9 +1627,9 @@ sub ParseTypedefPull($) { my($e) = shift; - my $args = $typefamily{$e->{DATA}->{TYPE}}->{PULL_FN_ARGS}->($e); + my $args = $typefamily{$e->{DATA}->{TYPE}}->{DECL}->($e,"pull"); - pidl fn_prefix($e) . "NTSTATUS ndr_pull_$e->{NAME}($args)"; + pidl fn_prefix($e) . "NTSTATUS ndr_pull_$e->{NAME}(struct ndr_pull *ndr, int ndr_flags, $args)"; pidl "{"; indent; @@ -1703,9 +1646,9 @@ sub ParseTypedefPrint($) { my($e) = shift; - my $args = $typefamily{$e->{DATA}->{TYPE}}->{PRINT_FN_ARGS}->($e); + my $args = $typefamily{$e->{DATA}->{TYPE}}->{DECL}->($e,"print"); - pidl "void ndr_print_$e->{NAME}($args)"; + pidl "void ndr_print_$e->{NAME}(struct ndr_print *ndr, const char *name, $args)"; pidl "{"; indent; $typefamily{$e->{DATA}->{TYPE}}->{PRINT_FN_BODY}->($e->{DATA}, $e->{NAME}); diff --git a/source4/build/pidl/Parse/Pidl/Typelist.pm b/source4/build/pidl/Parse/Pidl/Typelist.pm index ab5df0fc52..10a4baf7e7 100644 --- a/source4/build/pidl/Parse/Pidl/Typelist.pm +++ b/source4/build/pidl/Parse/Pidl/Typelist.pm @@ -7,7 +7,7 @@ package Parse::Pidl::Typelist; require Exporter; @ISA = qw(Exporter); -@EXPORT = qw(hasType getType); +@EXPORT = qw(hasType getType mapType); use Parse::Pidl::Util qw(has_property); use strict; diff --git a/source4/build/pidl/Parse/Pidl/Util.pm b/source4/build/pidl/Parse/Pidl/Util.pm index e4f25511e6..8030a2c070 100644 --- a/source4/build/pidl/Parse/Pidl/Util.pm +++ b/source4/build/pidl/Parse/Pidl/Util.pm @@ -6,7 +6,7 @@ package Parse::Pidl::Util; require Exporter; @ISA = qw(Exporter); -@EXPORT = qw(has_property property_matches ParseExpr); +@EXPORT = qw(has_property property_matches ParseExpr is_constant); use strict; diff --git a/source4/build/pidl/TODO b/source4/build/pidl/TODO index 860b5d912c..efb103ff0d 100644 --- a/source4/build/pidl/TODO +++ b/source4/build/pidl/TODO @@ -7,3 +7,5 @@ - don't be so strict on array boundaries.. arrays can and will be empty when a (regular) remote error occurs + +- support nested elements diff --git a/source4/build/pidl/pidl b/source4/build/pidl/pidl index 9cf1e2f6d3..18811287bf 100755 --- a/source4/build/pidl/pidl +++ b/source4/build/pidl/pidl @@ -225,7 +225,7 @@ sub process_file($) $header = Parse::Pidl::Util::ChangeExtension($output, ".h"); } require Parse::Pidl::Samba::NDR::Header; - Parse::Pidl::Util::FileSave($header, Parse::Pidl::Samba::NDR::Header::Parse($ndr)); + Parse::Pidl::Util::FileSave($header, Parse::Pidl::Samba::NDR::Header::Parse($pidl)); if (defined($opt_swig)) { require Parse::Pidl::Samba::SWIG; my($filename) = $output; |