ndr_gen.c revision d0e518695adc90b82233b99af7dffbb3d3f92c00
d0e518695adc90b82233b99af7dffbb3d3f92c00amw/*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * CDDL HEADER START
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * The contents of this file are subject to the terms of the
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Common Development and Distribution License (the "License").
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * You may not use this file except in compliance with the License.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * or http://www.opensolaris.org/os/licensing.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * See the License for the specific language governing permissions
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * and limitations under the License.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * When distributing Covered Code, include this CDDL HEADER in each
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * If applicable, add the following below this CDDL HEADER, with the
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * fields enclosed by brackets "[]" replaced with your own identifying
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * information: Portions Copyright [yyyy] [name of copyright owner]
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * CDDL HEADER END
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw/*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Use is subject to license terms.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw#pragma ident "%Z%%M% %I% %E% SMI"
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw#include <string.h>
d0e518695adc90b82233b99af7dffbb3d3f92c00amw#include "ndrgen.h"
d0e518695adc90b82233b99af7dffbb3d3f92c00amw#include "y.tab.h"
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void generate_struct(ndr_typeinfo_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void generate_params(ndr_typeinfo_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void generate_union(ndr_typeinfo_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void generate_arg(ndr_node_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void generate_member_macro(char *, char *, ndr_member_t *,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void generate_member_macro_with_arg(char *, char *, ndr_member_t *,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t *, ndr_node_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void generate_prototypes(ndr_typeinfo_t *, char *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void generate_member_prototypes(ndr_typeinfo_t *, ndr_member_t *,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void generate_member(ndr_typeinfo_t *, ndr_member_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void generate_aggregate_common_begin(ndr_typeinfo_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void generate_aggregate_common_finish(ndr_typeinfo_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void generate_typeinfo_packing(ndr_typeinfo_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void generate_typeinfo_typeinfo(ndr_typeinfo_t *, int, char *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwvoid
d0e518695adc90b82233b99af7dffbb3d3f92c00amwgenerate(void)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t *ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char fname_type[NDLBUFSZ];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (ti = typeinfo_list; ti; ti = ti->next) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->is_extern || ti->advice.a_extern) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_extern_suffix(ti, fname_type, NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(
d0e518695adc90b82233b99af7dffbb3d3f92c00amw "extern struct ndr_typeinfo ndt_%s;\n",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw fname_type);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw switch (ti->type_op) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRUCT_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->advice.a_operation)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_params(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw else
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_struct(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case UNION_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_union(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case TYPEDEF_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* silently skip */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRING_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STAR:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case LB:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case BASIC_TYPE:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!ti->is_referenced) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_extern_suffix(ti, fname_type, NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("extern ndt_%s\n", fname_type);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_null_decl(ti, fname_type, NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("/* %s */\n", fname_type);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw default:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwgenerate_struct(ndr_typeinfo_t *ti)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int i;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_member_t *mem;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->advice.a_no_reorder) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* just use generate_params(), which can safely do this */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_params(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw return;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_aggregate_common_begin(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" /* do all basic elements first */\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (i = 0; i < ti->n_member; i++) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem = &ti->member[i];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->type->type_op != BASIC_TYPE)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_member(ti, mem);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" /* do all constructed elements w/o pointers */\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (i = 0; i < ti->n_member; i++) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem = &ti->member[i];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->type->type_op == BASIC_TYPE)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->type->has_pointers)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_member(ti, mem);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" /* do members with pointers in order */\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (i = 0; i < ti->n_member; i++) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem = &ti->member[i];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->type->type_op == BASIC_TYPE)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!mem->type->has_pointers)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_member(ti, mem);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_aggregate_common_finish(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwgenerate_params(ndr_typeinfo_t *ti)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int i;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_member_t *mem;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_aggregate_common_begin(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" /* do all members in order */\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (i = 0; i < ti->n_member; i++) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem = &ti->member[i];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_member(ti, mem);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_aggregate_common_finish(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwgenerate_union(ndr_typeinfo_t *ti)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int i;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_member_t *mem;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int have_default = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_node_t *np;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_aggregate_common_begin(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" switch (encl_ref->switch_is) {\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (i = 0; i < ti->n_member; i++) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem = &ti->member[i];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if ((np = mem->advice.a_case) != 0) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" case ");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_node(np->n_a_arg);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(":\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw } else if ((np = mem->advice.a_default) != 0) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" default:\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (have_default++) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("multiple defaults");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw } else {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("syntax error");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_member(ti, mem);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" break;\n\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!have_default) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" default:\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" NDR_SET_ERROR(encl_ref, "
d0e518695adc90b82233b99af7dffbb3d3f92c00amw "NDR_ERR_SWITCH_VALUE_INVALID);\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" return 0;\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" break;\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" }\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_aggregate_common_finish(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwgenerate_arg(ndr_node_t *np)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (np) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (np->label != IDENTIFIER && np->label != INTEGER)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw np = np->n_a_arg;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw } else {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* this is bogus */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw np = n_cons(IDENTIFIER, sym_enter("?WHAT?"));
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (np->label == IDENTIFIER)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("val->%s", np->n_sym->name);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw else
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_node(np);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwgenerate_member_macro(char *memkind, char *macro, ndr_member_t *mem,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t *ti)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char fname_type[NDLBUFSZ];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!macro)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw macro = "";
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!ti)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti = mem->type;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_extern_suffix(ti, fname_type, NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (memkind) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" NDR_%sMEMBER%s (%s, %s);\n",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw memkind, macro, fname_type, mem->name);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw } else {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" NDR_MEMBER%s (%s, %s, %uUL);\n",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw macro, fname_type, mem->name, mem->pdu_offset);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwgenerate_member_macro_with_arg(char *memkind, char *macro,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_member_t *mem, ndr_typeinfo_t *ti, ndr_node_t *np)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char fname_type[NDLBUFSZ];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!macro)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw macro = "_WITH_ARG";
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!ti)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti = mem->type;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_extern_suffix(ti, fname_type, NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (memkind) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" NDR_%sMEMBER%s (%s, %s,\n",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw memkind, macro, fname_type, mem->name);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw } else {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" NDR_MEMBER%s (%s, %s, %uUL,\n",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw macro, fname_type, mem->name, mem->pdu_offset);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\t\t");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_arg(np);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(");\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwgenerate_prototypes(ndr_typeinfo_t *ti, char *fname_type)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_member_t *mem;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int i;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->type_op == STRUCT_KW && ti->advice.a_operation) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (i = 0; i < ti->n_member; i++) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem = &ti->member[i];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_member_prototypes(ti, mem, fname_type);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwgenerate_member_prototypes(ndr_typeinfo_t *ti,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_member_t *mem, char *fname_type)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char val_buf[NDLBUFSZ];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t ptr;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->type->type_op == UNION_KW) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!mem->advice.a_in && mem->advice.a_out) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ptr.type_op = STAR;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ptr.type_down = ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_name_decl(&ptr, val_buf, NDLBUFSZ, "val");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\nextern void fixup%s(%s);\n",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw fname_type, val_buf);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwgenerate_member(ndr_typeinfo_t *ti, ndr_member_t *mem)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw static char *fixup[] = {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw "/*",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw " * Cannot use the canned offsets to unmarshall multiple",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw " * entry discriminated unions. The service must provide",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw " * this function to patch the offsets at runtime.",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw " */"
d0e518695adc90b82233b99af7dffbb3d3f92c00amw };
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char fname_type[NDLBUFSZ];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_node_t *np;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int is_reference = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char *memkind = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int cond_pending = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int i;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->advice.a_operation)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw memkind = "TOPMOST_";
d0e518695adc90b82233b99af7dffbb3d3f92c00amw else if (ti->advice.a_interface)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw memkind = "PARAMS_";
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->advice.a_in && !mem->advice.a_out) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw cond_pending = 1;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" if (NDR_DIR_IS_IN) {\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!mem->advice.a_in && mem->advice.a_out) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw cond_pending = 1;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" if (NDR_DIR_IS_OUT) {\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_extern_suffix(ti, fname_type, NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw switch (mem->type->type_op) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case BASIC_TYPE:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRUCT_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_member_macro(memkind, 0, mem, 0);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case UNION_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw np = mem->advice.a_switch_is;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!mem->advice.a_in && mem->advice.a_out) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (i = 0; i < sizeof (fixup)/sizeof (fixup[0]); ++i)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\t%s\n", fixup[i]);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\tfixup%s(val);\n", fname_type);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_member_macro_with_arg(memkind,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw "_WITH_SWITCH_IS", mem, 0, np);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STAR:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->advice.a_reference)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw is_reference = 1;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw else
d0e518695adc90b82233b99af7dffbb3d3f92c00amw is_reference = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw np = mem->advice.a_size_is;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (np) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_member_macro_with_arg(memkind,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw is_reference ?
d0e518695adc90b82233b99af7dffbb3d3f92c00amw "_REF_WITH_SIZE_IS" : "_PTR_WITH_SIZE_IS",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem, mem->type->type_down, np);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw np = mem->advice.a_length_is;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (np) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_member_macro_with_arg(memkind,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw is_reference ?
d0e518695adc90b82233b99af7dffbb3d3f92c00amw "_REF_WITH_LENGTH_IS" : "_PTR_WITH_LENGTH_IS",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem, mem->type->type_down, np);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_member_macro(memkind,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw is_reference ? "_REF" : "_PTR",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem, mem->type->type_down);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case LB:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw np = mem->advice.a_size_is;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (np) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_member_macro_with_arg(memkind,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw "_ARR_WITH_SIZE_IS",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem, mem->type->type_down, np);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw np = mem->advice.a_length_is;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (np) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_member_macro_with_arg(memkind,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw "_WITH_LENGTH_IS",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem, mem->type->type_down, np);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_member_macro_with_arg(memkind,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw "_ARR_WITH_DIMENSION",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem, mem->type->type_down, mem->type->type_dim);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw default:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_member_macro(memkind, "_???", mem, 0);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (cond_pending)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" }\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwgenerate_aggregate_common_begin(ndr_typeinfo_t *ti)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char val_buf[NDLBUFSZ];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char cast_buf[NDLBUFSZ];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char fname_type[NDLBUFSZ];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t ptr;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_extern_suffix(ti, fname_type, NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_typeinfo_typeinfo(ti, 0, fname_type);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_prototypes(ti, fname_type);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("/*\n * ");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw show_advice(&ti->advice, 0);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" */\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("int\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("ndr_%s (struct ndr_reference *encl_ref)\n",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw fname_type);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("{\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ptr.type_op = STAR;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ptr.type_down = ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_name_decl(&ptr, val_buf, NDLBUFSZ, "val");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_null_decl(&ptr, cast_buf, NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" %s = %s encl_ref->datum;\n", val_buf, cast_buf);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" struct ndr_reference myref;\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" (void) bzero(&myref, sizeof (myref));\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" myref.enclosing = encl_ref;\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" myref.stream = encl_ref->stream;\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw generate_typeinfo_packing(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw/* ARGSUSED */
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwgenerate_aggregate_common_finish(ndr_typeinfo_t *ti)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" return 1;\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("}\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw/*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Structures are normally 4-byte (dword) aligned but the align directive
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * can be used to pack on a 2-byte (word) boundary. An align value of
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * zero is taken to mean use default (dword) alignment. Default packing
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * doesn't need to be flagged.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwgenerate_typeinfo_packing(ndr_typeinfo_t *ti)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_node_t *np;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw unsigned long packing;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if ((np = ti->advice.a_align) == NULL)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw return;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if ((np = np->n_a_arg) == NULL)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw return;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw packing = np->n_int;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if ((packing == 0) || (packing == 4)) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* default alignment */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw return;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (packing != 2) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw fatal_error("invalid align directive: %lu", packing);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* NOTREACHED */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" myref.packed_alignment = %lu;\n", packing);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwgenerate_typeinfo_typeinfo(ndr_typeinfo_t *ti, int is_static, char *fname_type)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char flags[NDLBUFSZ];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *flags = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->is_conformant)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) strlcat(flags, "|NDR_F_CONFORMANT", NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->type_op == STRUCT_KW) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->advice.a_operation)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) strlcat(flags, "|NDR_F_OPERATION", NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw else
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) strlcat(flags, "|NDR_F_STRUCT", NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->type_op == UNION_KW) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->advice.a_interface)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) strlcat(flags, "|NDR_F_INTERFACE", NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw else
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) strlcat(flags, "|NDR_F_UNION", NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->type_op == STRING_KW)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) strlcat(flags, "|NDR_F_STRING", NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->type_op == LB)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) strlcat(flags, "|NDR_F_ARRAY", NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->type_op == STAR)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) strlcat(flags, "|NDR_F_POINTER", NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (*flags == 0)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) strlcpy(flags, "NDR_F_NONE", NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw else
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) strlcpy(flags, flags+1, NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\n\n\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (is_static)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("static ");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("int ndr_%s (struct ndr_reference *encl_ref);\n",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw fname_type);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (is_static)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("static ");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("struct ndr_typeinfo ndt_%s = {\n", fname_type);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\t1, /* NDR version */\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\t%d, /* alignment */\n", ti->alignment);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\t%s, /* flags */\n", flags);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\tndr_%s, /* ndr_func */\n", fname_type);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\t%d, /* pdu_size_fixed_part */\n",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->size_fixed_part);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\t%d, /* pdu_size_variable_part */\n",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->size_variable_part);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\t%d, /* c_size_fixed_part */\n",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->size_fixed_part);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\t%d, /* c_size_variable_part */\n",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->size_variable_part);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("};\n\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}