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 <strings.h>
d0e518695adc90b82233b99af7dffbb3d3f92c00amw#include <string.h>
d0e518695adc90b82233b99af7dffbb3d3f92c00amw#include "ndrgen.h"
d0e518695adc90b82233b99af7dffbb3d3f92c00amw#include "y.tab.h"
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw#define ALLOW_NOTHING 0
d0e518695adc90b82233b99af7dffbb3d3f92c00amw#define ALLOW_VARSIZE 1
d0e518695adc90b82233b99af7dffbb3d3f92c00amw#define ALLOW_INOUT 2
d0e518695adc90b82233b99af7dffbb3d3f92c00amw#define ALLOW_CASE 4
d0e518695adc90b82233b99af7dffbb3d3f92c00amw#define ALLOW_NO_UNIONS 8 /* for topmost structures */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw#define ALLOW_NO_SWITCH 16
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstruct tup {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw struct tup *up;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t *ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw};
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void type_ident_decl(ndr_typeinfo_t *, char *, size_t, char *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void type_ident_decl1(struct tup *, char *, size_t, char *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void analyze_typeinfo_list(void);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void analyze_typeinfo_typedef(ndr_typeinfo_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void analyze_typeinfo_struct(ndr_typeinfo_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void analyze_typeinfo_union(ndr_typeinfo_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void analyze_typeinfo_aggregate_finish(ndr_typeinfo_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void analyze_member(ndr_node_t *, ndr_member_t *, unsigned long *, int);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void seed_basic_types(void);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void seed_construct_types(void);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void append_typeinfo(ndr_typeinfo_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic ndr_typeinfo_t *bind_typeinfo(ndr_typeinfo_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic ndr_typeinfo_t *find_typeinfo_by_name(ndr_node_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void determine_advice(ndr_advice_t *, ndr_node_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic ndr_node_t *find_advice(ndr_node_t *advice_list, int label);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwvoid
d0e518695adc90b82233b99af7dffbb3d3f92c00amwanalyze(void)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw seed_basic_types();
d0e518695adc90b82233b99af7dffbb3d3f92c00amw seed_construct_types();
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw analyze_typeinfo_list();
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwvoid
d0e518695adc90b82233b99af7dffbb3d3f92c00amwshow_typeinfo_list(void)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t *ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t *tdti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int i;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_member_t *mem;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char *p;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char fname_type[NDLBUFSZ];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (ti = typeinfo_list; ti; ti = ti->next) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw switch (ti->type_op) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRUCT_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw p = "struct";
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case UNION_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw p = "union";
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case TYPEDEF_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw p = "typedef";
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRING_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STAR:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case LB:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case BASIC_TYPE:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_extern_suffix(ti, fname_type, NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->is_extern) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("extern ndr_%s()\n",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw fname_type);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw } else if (!ti->is_referenced) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("implied ndr_%s\n", fname_type);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw default:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("show_typeinfo skipping %d\n",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->type_op);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\n\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw show_advice(&ti->advice, 0);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("%s %s {\n", p, ti->type_name->n_sym->name);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (i = 0; i < ti->n_member; i++) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem = &ti->member[i];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw show_advice(&mem->advice, 2);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_extern_suffix(mem->type, fname_type, NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" %-16s ndr_%-13s",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem->name, fname_type);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw tdti = mem->type;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" fsiz=%d vsiz=%d algn=%d off=%d\n",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw tdti->size_fixed_part,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw tdti->size_variable_part,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw tdti->alignment,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem->pdu_offset);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("} fsiz=%d vsiz=%d algn=%d comp=%d ptrs=%d\n",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->size_fixed_part,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->size_variable_part,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->alignment,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->complete,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->has_pointers);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwvoid
d0e518695adc90b82233b99af7dffbb3d3f92c00amwtype_extern_suffix(ndr_typeinfo_t *tsti, char *funcbuf, size_t buflen)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t *ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char *p_fb = funcbuf;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *p_fb = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (ti = tsti; ti; ti = ti->type_down) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw switch (ti->type_op) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case BASIC_TYPE:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRUCT_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case TYPEDEF_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case UNION_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) snprintf(p_fb, buflen, "_%s",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->type_name->n_sym->name);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STAR:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) strlcpy(p_fb, "p", buflen);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case LB:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->type_dim) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) snprintf(p_fb, buflen, "a%ld",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->type_dim->n_int);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw } else {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) snprintf(p_fb, buflen, "ac");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRING_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) strlcpy(p_fb, "s", buflen);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw default:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) snprintf(p_fb, buflen, "?<%d>", ti->type_op);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw while (*p_fb)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw p_fb++;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwtype_ident_decl1(struct tup *tup, char *funcbuf, size_t buflen, char *ident)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t *ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char fb[NDLBUFSZ];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char *p;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!tup) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) strlcpy(funcbuf, ident, buflen);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw return;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti = tup->ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw switch (ti->type_op) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case BASIC_TYPE:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case TYPEDEF_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_ident_decl1(tup->up, fb, NDLBUFSZ, ident);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) snprintf(funcbuf, buflen, "%s%s%s%s",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw "", ti->type_name->n_sym->name, *fb ? " " : "", fb);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRUCT_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_ident_decl1(tup->up, fb, NDLBUFSZ, ident);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) snprintf(funcbuf, buflen, "%s%s%s%s",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw "struct ", ti->type_name->n_sym->name, *fb ? " " : "", fb);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case UNION_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_ident_decl1(tup->up, fb, NDLBUFSZ, ident);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) snprintf(funcbuf, buflen, "%s%s%s%s",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw "union ", ti->type_name->n_sym->name, *fb ? " " : "", fb);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STAR:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *funcbuf = '*';
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_ident_decl1(tup->up, funcbuf+1, buflen - 1, ident);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case LB:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw p = fb;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *p++ = '(';
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_ident_decl1(tup->up, p, NDLBUFSZ - 1, ident);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (*p == '*') {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw p = fb;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) strlcat(p, ")", NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->type_dim) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) snprintf(funcbuf, buflen, "%s[%ld]",
d0e518695adc90b82233b99af7dffbb3d3f92c00amw p, ti->type_dim->n_int);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw } else {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) snprintf(funcbuf, buflen,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw "%s[NDR_ANYSIZE_DIM]", p);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRING_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw p = fb;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *p++ = '(';
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_ident_decl1(tup->up, p, NDLBUFSZ - 1, ident);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (*p == '*') {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw p = fb;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) strlcat(p, ")", NDLBUFSZ);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) snprintf(funcbuf, buflen, "%s[NDR_STRING_DIM]", p);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw default:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("unknown type or keyword <%d>", ti->type_op);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwtype_ident_decl(ndr_typeinfo_t *tsti, char *funcbuf, size_t buflen, char *ident)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t *ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw struct tup tup_tab[40];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw struct tup *tup;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw struct tup *up = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int n_tt = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (ti = tsti; ti; ti = ti->type_down, n_tt++) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw tup = &tup_tab[n_tt];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw tup->up = up;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw tup->ti = ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw up = tup;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_ident_decl1(up, funcbuf, buflen, ident);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwvoid
d0e518695adc90b82233b99af7dffbb3d3f92c00amwtype_null_decl(ndr_typeinfo_t *tsti, char *funcbuf, size_t buflen)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw funcbuf[0] = '(';
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_ident_decl(tsti, funcbuf+1, buflen, "");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) strlcat(funcbuf, ")", buflen);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwvoid
d0e518695adc90b82233b99af7dffbb3d3f92c00amwtype_name_decl(ndr_typeinfo_t *tsti, char *funcbuf, size_t buflen, char *name)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_ident_decl(tsti, funcbuf, buflen, name);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwvoid
d0e518695adc90b82233b99af7dffbb3d3f92c00amwshow_advice(ndr_advice_t *adv, int indent)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int i;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int n = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (i = 0; i < N_ADVICE; i++) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!adv->a_nodes[i])
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (n++ == 0)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("%-*s[", indent, "");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw else
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" ");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_node(adv->a_nodes[i]);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (n)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("]\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwanalyze_typeinfo_list(void)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t *ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (ti = typeinfo_list; ti; ti = ti->next) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw switch (ti->type_op) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRUCT_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw analyze_typeinfo_struct(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case UNION_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw analyze_typeinfo_union(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case TYPEDEF_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw analyze_typeinfo_typedef(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwanalyze_typeinfo_typedef(ndr_typeinfo_t *ti)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_node_t *mem_np;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_member_t *mem;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int i;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int allow;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw unsigned long offset;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw assert(ti->type_op == TYPEDEF_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Snarf the advice.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw determine_advice(&ti->advice, ti->definition->n_c_advice);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Convert the members to table.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Determine layout metrics along the way.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem_np = ti->definition->n_c_members;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw i = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw offset = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw assert(i < ti->n_member);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem = &ti->member[i];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw allow = ALLOW_NO_SWITCH;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw analyze_member(mem_np, mem,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw &offset, /* progress offset */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw allow); /* see above */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw assert(1 == ti->n_member);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw analyze_typeinfo_aggregate_finish(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* Align offset to determine overall size */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw while (offset & ti->alignment)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw offset++;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->size_fixed_part = offset;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwanalyze_typeinfo_struct(ndr_typeinfo_t *ti)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_node_t *mem_np;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_member_t *mem;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int i;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int allow;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw unsigned long offset;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw assert(ti->type_op == STRUCT_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Snarf the advice. Only recognize [operation()] for
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * struct definitions.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw determine_advice(&ti->advice, ti->definition->n_c_advice);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Convert the members from list to table.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Determine layout metrics along the way.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem_np = ti->definition->n_c_members;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw i = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw offset = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (; mem_np; i++, mem_np = mem_np->n_next) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw assert(i < ti->n_member);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem = &ti->member[i];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!ti->advice.a_operation /* no var-size in op param */ &&
d0e518695adc90b82233b99af7dffbb3d3f92c00amw i == ti->n_member-1) /* only last mem may be var-size */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw allow = ALLOW_VARSIZE;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw else
d0e518695adc90b82233b99af7dffbb3d3f92c00amw allow = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw analyze_member(mem_np, mem, &offset, allow);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw assert(i == ti->n_member);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw analyze_typeinfo_aggregate_finish(ti); /* align,complete,ptrs,etc */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* Align offset to determine overall size */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw while (offset & ti->alignment)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw offset++;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->size_fixed_part = offset;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* If last member is var-sized, so is this struct */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem = &ti->member[ti->n_member-1];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->size_variable_part = mem->type->size_variable_part;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->size_variable_part)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->is_conformant = 1;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwanalyze_typeinfo_union(ndr_typeinfo_t *ti)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_node_t *mem_np;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_member_t *mem;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int i;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw unsigned long offset;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw unsigned long size;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw assert(ti->type_op == UNION_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Snarf the advice. None supported for union definitions.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Only [switch_is()] supported for union instances.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw determine_advice(&ti->advice, ti->definition->n_c_advice);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Convert the members from list to table.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Determine layout metrics along the way.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem_np = ti->definition->n_c_members;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw i = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw size = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (; mem_np; i++, mem_np = mem_np->n_next) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw assert(i < ti->n_member);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem = &ti->member[i];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw offset = 0; /* all members offset=0 */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw analyze_member(mem_np, mem,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw &offset,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ALLOW_CASE+ALLOW_NO_UNIONS); /* var-size disallowed */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (size < mem->type->size_fixed_part)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw size = mem->type->size_fixed_part;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw assert(i == ti->n_member);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw analyze_typeinfo_aggregate_finish(ti); /* align,complete,ptrs,etc */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* align size to determine overall size */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw while (size & ti->alignment)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw size++;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->size_fixed_part = size;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwanalyze_typeinfo_aggregate_finish(ndr_typeinfo_t *ti)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int i;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_member_t *mem;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int complete = 1;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int has_pointers = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (i = 0; i < ti->n_member; i++) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem = &ti->member[i];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw complete &= mem->type->complete;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw has_pointers |= mem->type->has_pointers;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->alignment |= mem->type->alignment;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->complete = complete;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->has_pointers = has_pointers;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwanalyze_member(ndr_node_t *mem_np, ndr_member_t *mem,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw unsigned long *offsetp, int allow)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int i, n_decl_ops;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_node_t *decl_ops[NDLBUFSZ];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t *type_down;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t proto_ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_node_t *np;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Set line_number for error reporting (so we know where to look)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw line_number = mem_np->line_number;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Simple parts of member
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem->definition = mem_np;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw determine_advice(&mem->advice, mem_np->n_m_advice);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * The node list for the declarator is in outside-to-inside
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * order. It is also decorated with the LP nodes for
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * precedence, which are in our way at this point.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * These two loops reverse the list, which is easier
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * to analyze. For example, the declaration:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * ulong * (id[100]);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * will have the node list (=> indicates n_d_descend):
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * ulong => STAR => LP => LB[100] => id
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * and the conversion will result in type info (=> indicates
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * type_down):
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * id => LB[100] => STAR => ulong
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * which is closer to how you would pronounce the declaration:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * id is an array size 100 of pointers to ulong.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* first pass -- turn the list into a table */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw n_decl_ops = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (np = mem_np->n_m_decl; np; np = np->n_d_descend) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (np->label == IDENTIFIER) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break; /* done */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (np->label == LP)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue; /* ignore precedence nodes */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw decl_ops[n_decl_ops++] = np;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!np) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("declaration error");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_node(mem_np->n_m_decl);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw } else {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem->name = np->n_sym->name;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* second pass -- turn the table into push-back list */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_down = find_typeinfo_by_name(mem_np->n_m_type);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (type_down->type_op == TYPEDEF_KW)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_down = type_down->member[0].type;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->advice.a_string) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw bzero(&proto_ti, sizeof (proto_ti));
d0e518695adc90b82233b99af7dffbb3d3f92c00amw proto_ti.type_op = STRING_KW;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw proto_ti.type_down = type_down;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_down = bind_typeinfo(&proto_ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (i = n_decl_ops; i-- > 0; ) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw np = decl_ops[i];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw bzero(&proto_ti, sizeof (proto_ti));
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw proto_ti.type_op = np->label;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw proto_ti.type_down = type_down;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw switch (np->label) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case LB:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw proto_ti.type_dim = np->n_d_dim;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * bind_typeinfo() reuses (interns) typeinfo's to
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * make later code generation easier. It will report
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * some errors.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_down = bind_typeinfo(&proto_ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* bind the member to its type info */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem->type = type_down;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_down->is_referenced = 1; /* we handle first-level indirection */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Now, apply the type info to the member layout metrics.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* alignment */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw while (*offsetp & type_down->alignment)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ++*offsetp;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw mem->pdu_offset = *offsetp;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *offsetp += type_down->size_fixed_part;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->advice.a_length_is)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("[length_is()] is not supported");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->advice.a_transmit_as)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("[transmit_as()] is not supported");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->advice.a_arg_is)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("[arg_is()] is not supported");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Disallow
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * [case(x)] TYPE xxx;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * [default] TYPE xxx;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * These only make sense within unions.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (allow & ALLOW_CASE) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int n = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->advice.a_case)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw n++;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->advice.a_default)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw n++;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (n == 0)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("no [case/default] advice");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw else if (n > 1)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("too many [case/default] advice");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw } else {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->advice.a_case && mem->advice.a_default)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("[case/default] advice not allowed");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Disallow
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * [operation(x)] TYPE foo;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * [interface(x)] TYPE foo;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * [uuid(x)] TYPE foo;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * The [operation()] advice may only appear on a struct to
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * indicate that the structure is a top-most (parameter)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * structure, and the opcode associated with the parameters.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->advice.a_operation)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("[operation()] advice not allowed");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->advice.a_interface)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("[interface()] advice not allowed");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->advice.a_uuid)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("[uuid()] advice not allowed");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Allow
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * [switch_is(x)] union foo xxx;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Disallow [switch_is] on anything which is not a union.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->advice.a_switch_is && type_down->type_op != UNION_KW) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("[switch_is()] advice not allowed");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Allow
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * [size_is(x)] TYPE * ptr;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * [size_is(x)] TYPE arr[];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Disallow [size_is()] on anything other than pointer and
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * variable length array.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->advice.a_size_is &&
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_down->type_op != STAR &&
d0e518695adc90b82233b99af7dffbb3d3f92c00amw !(type_down->type_op == LB &&
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_down->type_dim == 0)) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("[size_is()] advice not allowed");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Allow
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * [string] char * ptr_string;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Disallow [string] on anything else. The determination
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * of size (for the outer header) on anything else is
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * impossible.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->advice.a_string && type_down->type_op != STAR) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("[string] advice not allowed");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (type_down->type_op == LB &&
d0e518695adc90b82233b99af7dffbb3d3f92c00amw type_down->type_dim == 0) { /* var-length array of some sort */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw int n = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Requires [size_is()] directive
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * [size_is(x)] TYPE array[]
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (mem->advice.a_size_is)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw n++;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!n)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("var-size missing sizing directive");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw else if (n > 1)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("var-size too many sizing directives");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Nested unions and struct members, other than the last one,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * cannot contain variable sized members.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (type_down->size_variable_part && !(allow & ALLOW_VARSIZE)) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("var-size member not allowed");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Disallow unions in operations (i.e. [operation()] struct ...),
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * The switch_is() value is not reliably available. DCE/RPC
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * automatically synthesizes an encapsulated union for
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * these situations, which we have to do by hand:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * struct { long switch_value; union foo x; } synth;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * We also can not allow unions within unions because
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * there is no way to pass the separate [switch_is(x)] selector.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (type_down->type_op == UNION_KW) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (allow & ALLOW_NO_UNIONS) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("unencapsulated union not allowed");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw } else if (!mem->advice.a_switch_is &&
d0e518695adc90b82233b99af7dffbb3d3f92c00amw !(allow & ALLOW_NO_SWITCH)) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("union instance without selector");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwseed_basic_types(void)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_symbol_t *sym;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t *ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t proto_ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (sym = symbol_list; sym; sym = sym->next) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!sym->kw)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (sym->kw->token != BASIC_TYPE)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti = ndr_alloc(1, sizeof (ndr_typeinfo_t));
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->type_op = BASIC_TYPE;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->definition = &sym->s_node;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->type_name = &sym->s_node;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->size_fixed_part = sym->kw->value;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->alignment = ti->size_fixed_part - 1;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->complete = 1;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->is_extern = 1;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw append_typeinfo(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw bzero(&proto_ti, sizeof (proto_ti));
d0e518695adc90b82233b99af7dffbb3d3f92c00amw proto_ti.type_op = STRING_KW;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw proto_ti.type_down = ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti = bind_typeinfo(&proto_ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->is_extern = 1;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwseed_construct_types(void)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_node_t *construct;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_node_t *np;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw unsigned n_member;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t *ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw construct = construct_list;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (; construct; construct = construct->n_next) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti = ndr_alloc(1, sizeof (ndr_typeinfo_t));
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->type_op = construct->label;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->definition = construct;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw switch (ti->type_op) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case TYPEDEF_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRUCT_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case UNION_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->type_name = construct->n_c_typename;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw np = construct->n_c_members;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw n_member = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (; np; np = np->n_next)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw n_member++;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->n_member = n_member;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (n_member > 0)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->member = ndr_alloc(n_member,
d0e518695adc90b82233b99af7dffbb3d3f92c00amw sizeof (ndr_member_t));
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw default:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw fatal_error("seed_construct unknown %d\n", ti->type_op);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw determine_advice(&ti->advice, construct->n_c_advice);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->is_referenced = 1; /* always generate */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw append_typeinfo(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwappend_typeinfo(ndr_typeinfo_t *ti)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t **pp;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (pp = &typeinfo_list; *pp; pp = &(*pp)->next)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *pp = ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->next = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic ndr_typeinfo_t *
d0e518695adc90b82233b99af7dffbb3d3f92c00amwbind_typeinfo(ndr_typeinfo_t *proto_ti)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t *ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t *tdti = proto_ti->type_down;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (ti = typeinfo_list; ti; ti = ti->next) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->type_op != proto_ti->type_op)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw switch (ti->type_op) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STAR:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->type_down != proto_ti->type_down)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRING_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->type_down != proto_ti->type_down)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case LB:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->type_down != proto_ti->type_down)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->type_dim != proto_ti->type_dim)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case BASIC_TYPE:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRUCT_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case TYPEDEF_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case UNION_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->type_name != proto_ti->type_name)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw continue;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw default:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw fatal_error("bind_typeinfo unknown %d\n", ti->type_op);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw return (ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti = ndr_alloc(1, sizeof (ndr_typeinfo_t));
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *ti = *proto_ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw append_typeinfo(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw switch (ti->type_op) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STAR:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->size_fixed_part = 4;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->alignment = 3;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->complete = 1;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->has_pointers = 1;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRING_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case LB:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (tdti->complete) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->alignment = tdti->alignment;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (tdti->size_variable_part) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("array of var-size type");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw } else if (ti->type_dim) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->size_fixed_part = tdti->size_fixed_part *
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->type_dim->n_int;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw } else {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->size_variable_part = tdti->size_fixed_part;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->is_conformant = 1;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw } else {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("array of incomplete type");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->has_pointers = tdti->has_pointers;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->complete = 1;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw default:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("bind_type internal error op=%d", ti->type_op);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Disallow
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * union foo *ptrfoo;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * There is no way to pass the selector (switch_is)in
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->type_op == STAR && ti->type_down->type_op == UNION_KW) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("pointers to unions not allowed");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Disallow
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * union foo fooarr[n];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Each element needs a distinct selector
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->type_op == LB && ti->type_down->type_op == UNION_KW) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("arrays of unions not allowed");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw return (ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic ndr_typeinfo_t *
d0e518695adc90b82233b99af7dffbb3d3f92c00amwfind_typeinfo_by_name(ndr_node_t *typename)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_typeinfo_t *ti;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (ti = typeinfo_list; ti; ti = ti->next) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (ti->type_name == typename)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw return (ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw compile_error("unknown type %s", typename->n_sym->name);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* fake BASIC_TYPE */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti = ndr_alloc(1, sizeof (ndr_typeinfo_t));
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->type_op = BASIC_TYPE;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->definition = typename;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->type_name = typename;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->size_fixed_part = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ti->alignment = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw append_typeinfo(ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw return (ti);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwdetermine_advice(ndr_advice_t *advice, ndr_node_t *advice_list)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* alias for basic types */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw advice->a_transmit_as = find_advice(advice_list, TRANSMIT_AS_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* arg used for size, union, or generic purpose */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw advice->a_arg_is = find_advice(advice_list, ARG_IS_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* operation parameter in/out stuff */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw advice->a_operation = find_advice(advice_list, OPERATION_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw advice->a_in = find_advice(advice_list, IN_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw advice->a_out = find_advice(advice_list, OUT_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* size stuff */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw advice->a_string = find_advice(advice_list, STRING_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw advice->a_size_is = find_advice(advice_list, SIZE_IS_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw advice->a_length_is = find_advice(advice_list, LENGTH_IS_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* union stuff */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw advice->a_case = find_advice(advice_list, CASE_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw advice->a_default = find_advice(advice_list, DEFAULT_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw advice->a_switch_is = find_advice(advice_list, SWITCH_IS_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /* interface stuff */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw advice->a_interface = find_advice(advice_list, INTERFACE_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw advice->a_uuid = find_advice(advice_list, UUID_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw advice->a_no_reorder = find_advice(advice_list, _NO_REORDER_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw advice->a_extern = find_advice(advice_list, EXTERN_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw advice->a_reference = find_advice(advice_list, REFERENCE_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw advice->a_align = find_advice(advice_list, ALIGN_KW);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic ndr_node_t *
d0e518695adc90b82233b99af7dffbb3d3f92c00amwfind_advice(ndr_node_t *advice_list, int label)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_node_t *np;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (np = advice_list; np; np = np->n_next)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (np->label == label)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw return (np);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwvoid
d0e518695adc90b82233b99af7dffbb3d3f92c00amwmember_fixup(ndr_node_t *member_np)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_node_t *np;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (np = member_np->n_m_decl; np; np = np->n_d_descend)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (np->label == IDENTIFIER)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw member_np->n_m_name = np;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwvoid
d0e518695adc90b82233b99af7dffbb3d3f92c00amwconstruct_fixup(ndr_node_t *construct_np)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw construct_np->n_c_typename->n_sym->typedefn = construct_np;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}