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/*
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Use is subject to license terms.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw#include "ndrgen.h"
d0e518695adc90b82233b99af7dffbb3d3f92c00amw#include "y.tab.h"
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void print_declaration(ndr_node_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void print_advice_list(ndr_node_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void print_node_list(ndr_node_t *);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwvoid
d0e518695adc90b82233b99af7dffbb3d3f92c00amwtdata_dump(void)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_node_list(construct_list);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwvoid
d0e518695adc90b82233b99af7dffbb3d3f92c00amwprint_node(ndr_node_t *np)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char *nm;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!np) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("<null>");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw return;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw switch (np->label) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case ALIGN_KW: nm = "align"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRUCT_KW: nm = "struct"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case UNION_KW: nm = "union"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case TYPEDEF_KW: nm = "typedef"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case INTERFACE_KW: nm = "interface"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case IN_KW: nm = "in"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case OUT_KW: nm = "out"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case SIZE_IS_KW: nm = "size_is"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case LENGTH_IS_KW: nm = "length_is"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRING_KW: nm = "string"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case TRANSMIT_AS_KW: nm = "transmit_as"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case OPERATION_KW: nm = "operation"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case UUID_KW: nm = "uuid"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case _NO_REORDER_KW: nm = "_no_reorder"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case EXTERN_KW: nm = "extern"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case ARG_IS_KW: nm = "arg_is"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case CASE_KW: nm = "case"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case DEFAULT_KW: nm = "default"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case BASIC_TYPE: nm = "<btype>"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case TYPENAME: nm = "<tname>"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case IDENTIFIER: nm = "<ident>"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case INTEGER: nm = "<intg>"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRING: nm = "<string>"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STAR: nm = "<*>"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case LB: nm = "<[>"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case LP: nm = "<(>"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case L_MEMBER: nm = "<member>"; break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw default:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("<<lab=%d>>", np->label);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw return;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw switch (np->label) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRUCT_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case UNION_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case TYPEDEF_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (np->n_c_advice) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_advice_list(np->n_c_advice);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("%s ", nm);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_node(np->n_c_typename);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" {\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_node_list(np->n_c_members);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("};\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case IN_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case OUT_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRING_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case DEFAULT_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case _NO_REORDER_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case EXTERN_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("%s", nm);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case ALIGN_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw /*
d0e518695adc90b82233b99af7dffbb3d3f92c00amw * Don't output anything for default alignment.
d0e518695adc90b82233b99af7dffbb3d3f92c00amw */
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if ((np->n_a_arg == NULL) || (np->n_a_arg->n_int == 0))
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("%s(", nm);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_node(np->n_a_arg);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(")");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case SIZE_IS_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case LENGTH_IS_KW:
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright (void) printf("%s(", nm);
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright print_field_attr(np);
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright (void) printf(")");
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright break;
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright case INTERFACE_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case TRANSMIT_AS_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case ARG_IS_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case CASE_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case OPERATION_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case UUID_KW:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("%s(", nm);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_node(np->n_a_arg);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(")");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case BASIC_TYPE:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case TYPENAME:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case IDENTIFIER:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("%s", np->n_sym->name);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case INTEGER:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("%ld", np->n_int);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STRING:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\"%s\"", np->n_str);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case STAR:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("*");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_node(np->n_d_descend);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case LB:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_node(np->n_d_descend);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("[");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (np->n_d_dim)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_node(np->n_d_dim);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("]");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case LP:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("(");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_node(np->n_d_descend);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(")");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw case L_MEMBER:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (np->n_m_advice) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" ");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_advice_list(np->n_m_advice);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("\t");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_declaration(np);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(";\n");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw break;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw default:
d0e518695adc90b82233b99af7dffbb3d3f92c00amw return;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright/*
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright * Field attributes are used to specify the size of an array, or the portion
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright * of the array, that contains valid data, which is done by associating
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright * another parameter with the array that contains the sizing information.
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright *
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright * Supports formats such as size_is(x) or size_is(x / 2). The supported
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright * operators are:
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright *
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright * * / % + - & | ^
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright */
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wrightvoid
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wrightprint_field_attr(ndr_node_t *np)
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright{
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright static char *valid = "*/%+-&|^";
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright ndr_node_t *arg;
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright char *name;
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright char *operator;
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright long value;
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright arg = np->n_a_arg;
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright if (arg->label != IDENTIFIER)
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright fatal_error("invalid label %d", arg->label);
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright if ((name = arg->n_sym->name) == NULL)
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright fatal_error("missing symbol name");
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright arg = np->n_a_arg1;
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright operator = NULL;
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright if (arg->label == IDENTIFIER) {
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright operator = arg->n_sym->name;
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright if (operator != NULL) {
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright /*
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright * The lexer sets the name and operator to
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright * the same value if there is no operator.
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright */
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright if (strcmp(name, operator) == 0)
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright operator = NULL;
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright else if (strchr(valid, *operator) == NULL)
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright compile_error("invalid operator: %s", operator);
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright }
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright }
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright arg = np->n_a_arg2;
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright if (arg->label == INTEGER) {
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright value = arg->n_int;
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright if ((value == 0) && strcmp(operator, "/") == 0)
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright compile_error("divide by zero");
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright }
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright if (operator)
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright (void) printf("%s %s %ldUL", name, operator, value);
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright else
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright (void) printf("%s", name);
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright}
a0b6e447978c306e15941d158bf6939a42ed2726Alan Wright
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwprint_declaration(ndr_node_t *np)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw ndr_node_t *dnp = np->n_m_decl;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char buf[NDLBUFSZ];
d0e518695adc90b82233b99af7dffbb3d3f92c00amw char *p = buf;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (np->n_m_type &&
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (np->n_m_type->label == IDENTIFIER ||
d0e518695adc90b82233b99af7dffbb3d3f92c00amw np->n_m_type->label == TYPENAME)) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) snprintf(buf, NDLBUFSZ, "%s", np->n_m_type->n_sym->name);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw while (*p)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw p++;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (dnp && dnp->label == STAR) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *p++ = ' ';
d0e518695adc90b82233b99af7dffbb3d3f92c00amw while (dnp && dnp->label == STAR) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *p++ = '*';
d0e518695adc90b82233b99af7dffbb3d3f92c00amw dnp = dnp->n_d_descend;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw *p = 0;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("%-23s ", buf);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw } else {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_node(np->n_m_type);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" ");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_node(dnp);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwprint_advice_list(ndr_node_t *np)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (!np)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw return;
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("[");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (; np; np = np->n_next) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_node(np);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw if (np->n_next)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf(" ");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw (void) printf("]");
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}
d0e518695adc90b82233b99af7dffbb3d3f92c00amw
d0e518695adc90b82233b99af7dffbb3d3f92c00amwstatic void
d0e518695adc90b82233b99af7dffbb3d3f92c00amwprint_node_list(ndr_node_t *np)
d0e518695adc90b82233b99af7dffbb3d3f92c00amw{
d0e518695adc90b82233b99af7dffbb3d3f92c00amw for (; np; np = np->n_next) {
d0e518695adc90b82233b99af7dffbb3d3f92c00amw print_node(np);
d0e518695adc90b82233b99af7dffbb3d3f92c00amw }
d0e518695adc90b82233b99af7dffbb3d3f92c00amw}