Author: jelmer Date: 2005-04-02 20:57:27 +0000 (Sat, 02 Apr 2005) New Revision: 6180
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=6180 Log: Use token_lists for storing switch values Modified: branches/SAMBA_4_0/source/build/pidl/ndr_parser.pm branches/SAMBA_4_0/source/librpc/ndr/libndr.h branches/SAMBA_4_0/source/librpc/ndr/ndr.c Changeset: Modified: branches/SAMBA_4_0/source/build/pidl/ndr_parser.pm =================================================================== --- branches/SAMBA_4_0/source/build/pidl/ndr_parser.pm 2005-04-02 06:51:54 UTC (rev 6179) +++ branches/SAMBA_4_0/source/build/pidl/ndr_parser.pm 2005-04-02 20:57:27 UTC (rev 6180) @@ -670,12 +670,14 @@ if (util::array_size($e)) { ParseArrayPrint($e, $var_prefix) - } elsif (my $switch = util::has_property($e, "switch_is")) { - my $switch_var = ParseExpr($e, $switch, $var_prefix); - check_null_pointer_void($switch_var); + } else { + if (my $switch = util::has_property($e, "switch_is")) { + my $switch_var = ParseExpr($e, $switch, $var_prefix); + check_null_pointer_void($switch_var); - pidl "ndr_print_$e->{TYPE}(ndr, \"$e->{NAME}\", $switch_var, $cprefix$var_prefix$e->{NAME});"; - } else { + pidl "ndr_print_set_switch_value(ndr, $cprefix$var_prefix$e->{NAME}, $switch_var);"; + } + pidl "ndr_print_$e->{TYPE}(ndr, \"$e->{NAME}\", $cprefix$var_prefix$e->{NAME});"; } @@ -1406,6 +1408,8 @@ my $have_default = 0; my($name) = $e->{PARENT}->{NAME}; + pidl "int level = ndr_print_get_switch_value(ndr, r);"; + pidl "ndr_print_union(ndr, name, level, \"$name\");"; start_flags($e); @@ -1535,7 +1539,7 @@ sub ArgsUnionPrint($) { my $e = shift; - return "struct ndr_print *ndr, const char *name, int level, union $e->{NAME} *r"; + return "struct ndr_print *ndr, const char *name, union $e->{NAME} *r"; } sub ArgsUnionPull($) Modified: branches/SAMBA_4_0/source/librpc/ndr/libndr.h =================================================================== --- branches/SAMBA_4_0/source/librpc/ndr/libndr.h 2005-04-02 06:51:54 UTC (rev 6179) +++ branches/SAMBA_4_0/source/librpc/ndr/libndr.h 2005-04-02 20:57:27 UTC (rev 6180) @@ -86,6 +86,7 @@ struct ndr_print { uint32_t flags; /* LIBNDR_FLAG_* */ uint32_t depth; + struct ndr_token_list *switch_list; void (*print)(struct ndr_print *, const char *, ...); void *private; }; @@ -248,5 +249,4 @@ typedef NTSTATUS (*ndr_pull_flags_fn_t)(struct ndr_pull *, int ndr_flags, void *); typedef void (*ndr_print_fn_t)(struct ndr_print *, const char *, void *); typedef void (*ndr_print_function_t)(struct ndr_print *, const char *, int, void *); -typedef void (*ndr_print_union_fn_t)(struct ndr_print *, const char *, uint32_t, void *); Modified: branches/SAMBA_4_0/source/librpc/ndr/ndr.c =================================================================== --- branches/SAMBA_4_0/source/librpc/ndr/ndr.c 2005-04-02 06:51:54 UTC (rev 6179) +++ branches/SAMBA_4_0/source/librpc/ndr/ndr.c 2005-04-02 20:57:27 UTC (rev 6180) @@ -324,24 +324,7 @@ talloc_free(ndr); } - /* - a useful helper function for printing idl unions via DEBUG() -*/ -void ndr_print_union_debug(ndr_print_union_fn_t fn, const char *name, uint32_t level, void *ptr) -{ - struct ndr_print *ndr; - - ndr = talloc(NULL, struct ndr_print); - if (!ndr) return; - ndr->print = ndr_print_debug_helper; - ndr->depth = 1; - ndr->flags = 0; - fn(ndr, name, level, ptr); - talloc_free(ndr); -} - -/* a useful helper function for printing idl function calls via DEBUG() */ void ndr_print_function_debug(ndr_print_function_t fn, const char *name, int flags, void *ptr) @@ -690,7 +673,20 @@ return ndr_token_peek(&ndr->switch_list, p); } +NTSTATUS ndr_print_set_switch_value(struct ndr_print *ndr, const void *p, uint32_t val) +{ + return ndr_token_store(ndr, &ndr->switch_list, p, val); +} + /* + retrieve a switch value + */ +uint32_t ndr_print_get_switch_value(struct ndr_print *ndr, const void *p) +{ + return ndr_token_peek(&ndr->switch_list, p); +} + +/* pull a relative object - stage1 called during SCALARS processing */