r8806: Move data representation-independent data into seperate header
[sfrench/samba-autobuild/.git] / source4 / build / pidl / Parse / Pidl / Samba / NDR / Parser.pm
index c04182ee14ebde58b2d76848b547df5ea5914e99..cde96ca0b28acb3261f7cfc36780f927f296abe9 100644 (file)
@@ -8,9 +8,9 @@
 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);
+use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred);
 
 # list of known types
 my %typefamily;
@@ -55,7 +55,10 @@ sub has_fast_array($$)
        return 0 unless ($nl->{TYPE} eq "DATA");
        return 0 unless (hasType($nl->{DATA_TYPE}));
 
-       return Parse::Pidl::Typelist::is_scalar($nl->{DATA_TYPE});
+       my $t = getType($nl->{DATA_TYPE});
+
+       # Only uint8 and string have fast array functions at the moment
+       return ($t->{NAME} eq "uint8") or ($t->{NAME} eq "string");
 }
 
 sub get_pointer_to($)
@@ -567,7 +570,7 @@ sub ParseElementPushLevel
                        pidl "}";
                }
 
-               if ($deferred and Parse::Pidl::NDR::ContainsDeferred($e, $l)) {
+               if ($deferred and ContainsDeferred($e, $l)) {
                        pidl "for ($counter = 0; $counter < $length; $counter++) {";
                        indent;
                        ParseElementPushLevel($e, GetNextLevel($e, $l), $ndr, $var_name, $env, 0, 1);
@@ -590,7 +593,7 @@ sub ParseElementPush($$$$$$)
 
        $var_name = append_prefix($e, $var_name);
 
-       return unless $primitives or ($deferred and Parse::Pidl::NDR::ContainsDeferred($e, $e->{LEVELS}[0]));
+       return unless $primitives or ($deferred and ContainsDeferred($e, $e->{LEVELS}[0]));
 
        start_flags($e);
 
@@ -881,7 +884,7 @@ sub ParseElementPullLevel
                        }
                }
 
-               if ($deferred and Parse::Pidl::NDR::ContainsDeferred($e, $l)) {
+               if ($deferred and ContainsDeferred($e, $l)) {
                        pidl "for ($counter = 0; $counter < $length; $counter++) {";
                        indent;
                        ParseElementPullLevel($e,GetNextLevel($e,$l), $ndr, $var_name, $env, 0, 1);
@@ -903,7 +906,7 @@ sub ParseElementPull($$$$$$)
 
        $var_name = append_prefix($e, $var_name);
 
-       return unless $primitives or ($deferred and Parse::Pidl::NDR::ContainsDeferred($e, $e->{LEVELS}[0]));
+       return unless $primitives or ($deferred and ContainsDeferred($e, $e->{LEVELS}[0]));
 
        start_flags($e);
 
@@ -1097,31 +1100,18 @@ sub ParseEnumPrint($$)
        end_flags($enum);
 }
 
-sub ArgsEnumPush($)
-{
-       my $e = shift;
-       return "struct ndr_push *ndr, int ndr_flags, enum $e->{NAME} r";
-}
-
-sub ArgsEnumPrint($)
+sub DeclEnum($)
 {
-       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,
 };
 
 #####################################################################
@@ -1193,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,
 };
 
 #####################################################################
@@ -1349,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($)
@@ -1375,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,
 };
@@ -1622,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($)
@@ -1648,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,
 };
@@ -1663,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;
@@ -1681,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;
@@ -1700,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});
@@ -2131,6 +2077,8 @@ sub Parse($$)
        pidl "/* parser auto-generated by pidl */";
        pidl "";
        pidl "#include \"includes.h\"";
+       pidl "#include \"librpc/gen_ndr/ndr_misc.h\"";
+       pidl "#include \"librpc/gen_ndr/ndr_dcerpc.h\"";
        pidl "#include \"$h_filename\"";
        pidl "";