1d0e51869Samw /* 2d0e51869Samw * CDDL HEADER START 3d0e51869Samw * 4d0e51869Samw * The contents of this file are subject to the terms of the 5d0e51869Samw * Common Development and Distribution License (the "License"). 6d0e51869Samw * You may not use this file except in compliance with the License. 7d0e51869Samw * 8d0e51869Samw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9d0e51869Samw * or http://www.opensolaris.org/os/licensing. 10d0e51869Samw * See the License for the specific language governing permissions 11d0e51869Samw * and limitations under the License. 12d0e51869Samw * 13d0e51869Samw * When distributing Covered Code, include this CDDL HEADER in each 14d0e51869Samw * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15d0e51869Samw * If applicable, add the following below this CDDL HEADER, with the 16d0e51869Samw * fields enclosed by brackets "[]" replaced with your own identifying 17d0e51869Samw * information: Portions Copyright [yyyy] [name of copyright owner] 18d0e51869Samw * 19d0e51869Samw * CDDL HEADER END 20d0e51869Samw */ 21d0e51869Samw 22d0e51869Samw /* 23*a0b6e447SAlan Wright * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24d0e51869Samw * Use is subject to license terms. 25d0e51869Samw */ 26d0e51869Samw 27d0e51869Samw #include "ndrgen.h" 28d0e51869Samw #include "y.tab.h" 29d0e51869Samw 30d0e51869Samw 31d0e51869Samw static void print_declaration(ndr_node_t *); 32d0e51869Samw static void print_advice_list(ndr_node_t *); 33d0e51869Samw static void print_node_list(ndr_node_t *); 34d0e51869Samw 35d0e51869Samw 36d0e51869Samw void 37d0e51869Samw tdata_dump(void) 38d0e51869Samw { 39d0e51869Samw print_node_list(construct_list); 40d0e51869Samw } 41d0e51869Samw 42d0e51869Samw void 43d0e51869Samw print_node(ndr_node_t *np) 44d0e51869Samw { 45d0e51869Samw char *nm; 46d0e51869Samw 47d0e51869Samw if (!np) { 48d0e51869Samw (void) printf("<null>"); 49d0e51869Samw return; 50d0e51869Samw } 51d0e51869Samw 52d0e51869Samw switch (np->label) { 53d0e51869Samw case ALIGN_KW: nm = "align"; break; 54d0e51869Samw case STRUCT_KW: nm = "struct"; break; 55d0e51869Samw case UNION_KW: nm = "union"; break; 56d0e51869Samw case TYPEDEF_KW: nm = "typedef"; break; 57d0e51869Samw case INTERFACE_KW: nm = "interface"; break; 58d0e51869Samw case IN_KW: nm = "in"; break; 59d0e51869Samw case OUT_KW: nm = "out"; break; 60d0e51869Samw case SIZE_IS_KW: nm = "size_is"; break; 61d0e51869Samw case LENGTH_IS_KW: nm = "length_is"; break; 62d0e51869Samw case STRING_KW: nm = "string"; break; 63d0e51869Samw case TRANSMIT_AS_KW: nm = "transmit_as"; break; 64d0e51869Samw case OPERATION_KW: nm = "operation"; break; 65d0e51869Samw case UUID_KW: nm = "uuid"; break; 66d0e51869Samw case _NO_REORDER_KW: nm = "_no_reorder"; break; 67d0e51869Samw case EXTERN_KW: nm = "extern"; break; 68d0e51869Samw case ARG_IS_KW: nm = "arg_is"; break; 69d0e51869Samw case CASE_KW: nm = "case"; break; 70d0e51869Samw case DEFAULT_KW: nm = "default"; break; 71d0e51869Samw case BASIC_TYPE: nm = "<btype>"; break; 72d0e51869Samw case TYPENAME: nm = "<tname>"; break; 73d0e51869Samw case IDENTIFIER: nm = "<ident>"; break; 74d0e51869Samw case INTEGER: nm = "<intg>"; break; 75d0e51869Samw case STRING: nm = "<string>"; break; 76d0e51869Samw case STAR: nm = "<*>"; break; 77d0e51869Samw case LB: nm = "<[>"; break; 78d0e51869Samw case LP: nm = "<(>"; break; 79d0e51869Samw case L_MEMBER: nm = "<member>"; break; 80d0e51869Samw default: 81d0e51869Samw (void) printf("<<lab=%d>>", np->label); 82d0e51869Samw return; 83d0e51869Samw } 84d0e51869Samw 85d0e51869Samw switch (np->label) { 86d0e51869Samw case STRUCT_KW: 87d0e51869Samw case UNION_KW: 88d0e51869Samw case TYPEDEF_KW: 89d0e51869Samw (void) printf("\n"); 90d0e51869Samw if (np->n_c_advice) { 91d0e51869Samw print_advice_list(np->n_c_advice); 92d0e51869Samw (void) printf("\n"); 93d0e51869Samw } 94d0e51869Samw (void) printf("%s ", nm); 95d0e51869Samw print_node(np->n_c_typename); 96d0e51869Samw (void) printf(" {\n"); 97d0e51869Samw print_node_list(np->n_c_members); 98d0e51869Samw (void) printf("};\n"); 99d0e51869Samw break; 100d0e51869Samw 101d0e51869Samw case IN_KW: 102d0e51869Samw case OUT_KW: 103d0e51869Samw case STRING_KW: 104d0e51869Samw case DEFAULT_KW: 105d0e51869Samw case _NO_REORDER_KW: 106d0e51869Samw case EXTERN_KW: 107d0e51869Samw (void) printf("%s", nm); 108d0e51869Samw break; 109d0e51869Samw 110d0e51869Samw case ALIGN_KW: 111d0e51869Samw /* 112d0e51869Samw * Don't output anything for default alignment. 113d0e51869Samw */ 114d0e51869Samw if ((np->n_a_arg == NULL) || (np->n_a_arg->n_int == 0)) 115d0e51869Samw break; 116d0e51869Samw (void) printf("%s(", nm); 117d0e51869Samw print_node(np->n_a_arg); 118d0e51869Samw (void) printf(")"); 119d0e51869Samw break; 120d0e51869Samw 121d0e51869Samw case SIZE_IS_KW: 122d0e51869Samw case LENGTH_IS_KW: 123*a0b6e447SAlan Wright (void) printf("%s(", nm); 124*a0b6e447SAlan Wright print_field_attr(np); 125*a0b6e447SAlan Wright (void) printf(")"); 126*a0b6e447SAlan Wright break; 127*a0b6e447SAlan Wright 128*a0b6e447SAlan Wright case INTERFACE_KW: 129d0e51869Samw case TRANSMIT_AS_KW: 130d0e51869Samw case ARG_IS_KW: 131d0e51869Samw case CASE_KW: 132d0e51869Samw case OPERATION_KW: 133d0e51869Samw case UUID_KW: 134d0e51869Samw (void) printf("%s(", nm); 135d0e51869Samw print_node(np->n_a_arg); 136d0e51869Samw (void) printf(")"); 137d0e51869Samw break; 138d0e51869Samw 139d0e51869Samw case BASIC_TYPE: 140d0e51869Samw case TYPENAME: 141d0e51869Samw case IDENTIFIER: 142d0e51869Samw (void) printf("%s", np->n_sym->name); 143d0e51869Samw break; 144d0e51869Samw 145d0e51869Samw case INTEGER: 146d0e51869Samw (void) printf("%ld", np->n_int); 147d0e51869Samw break; 148d0e51869Samw 149d0e51869Samw case STRING: 150d0e51869Samw (void) printf("\"%s\"", np->n_str); 151d0e51869Samw break; 152d0e51869Samw 153d0e51869Samw case STAR: 154d0e51869Samw (void) printf("*"); 155d0e51869Samw print_node(np->n_d_descend); 156d0e51869Samw break; 157d0e51869Samw 158d0e51869Samw case LB: 159d0e51869Samw print_node(np->n_d_descend); 160d0e51869Samw (void) printf("["); 161d0e51869Samw if (np->n_d_dim) 162d0e51869Samw print_node(np->n_d_dim); 163d0e51869Samw (void) printf("]"); 164d0e51869Samw break; 165d0e51869Samw 166d0e51869Samw case LP: 167d0e51869Samw (void) printf("("); 168d0e51869Samw print_node(np->n_d_descend); 169d0e51869Samw (void) printf(")"); 170d0e51869Samw break; 171d0e51869Samw 172d0e51869Samw case L_MEMBER: 173d0e51869Samw if (np->n_m_advice) { 174d0e51869Samw (void) printf(" "); 175d0e51869Samw print_advice_list(np->n_m_advice); 176d0e51869Samw (void) printf("\n"); 177d0e51869Samw } 178d0e51869Samw (void) printf("\t"); 179d0e51869Samw print_declaration(np); 180d0e51869Samw (void) printf(";\n"); 181d0e51869Samw break; 182d0e51869Samw 183d0e51869Samw default: 184d0e51869Samw return; 185d0e51869Samw } 186d0e51869Samw } 187d0e51869Samw 188*a0b6e447SAlan Wright /* 189*a0b6e447SAlan Wright * Field attributes are used to specify the size of an array, or the portion 190*a0b6e447SAlan Wright * of the array, that contains valid data, which is done by associating 191*a0b6e447SAlan Wright * another parameter with the array that contains the sizing information. 192*a0b6e447SAlan Wright * 193*a0b6e447SAlan Wright * Supports formats such as size_is(x) or size_is(x / 2). The supported 194*a0b6e447SAlan Wright * operators are: 195*a0b6e447SAlan Wright * 196*a0b6e447SAlan Wright * * / % + - & | ^ 197*a0b6e447SAlan Wright */ 198*a0b6e447SAlan Wright void 199*a0b6e447SAlan Wright print_field_attr(ndr_node_t *np) 200*a0b6e447SAlan Wright { 201*a0b6e447SAlan Wright static char *valid = "*/%+-&|^"; 202*a0b6e447SAlan Wright ndr_node_t *arg; 203*a0b6e447SAlan Wright char *name; 204*a0b6e447SAlan Wright char *operator; 205*a0b6e447SAlan Wright long value; 206*a0b6e447SAlan Wright 207*a0b6e447SAlan Wright arg = np->n_a_arg; 208*a0b6e447SAlan Wright if (arg->label != IDENTIFIER) 209*a0b6e447SAlan Wright fatal_error("invalid label %d", arg->label); 210*a0b6e447SAlan Wright if ((name = arg->n_sym->name) == NULL) 211*a0b6e447SAlan Wright fatal_error("missing symbol name"); 212*a0b6e447SAlan Wright 213*a0b6e447SAlan Wright arg = np->n_a_arg1; 214*a0b6e447SAlan Wright operator = NULL; 215*a0b6e447SAlan Wright if (arg->label == IDENTIFIER) { 216*a0b6e447SAlan Wright operator = arg->n_sym->name; 217*a0b6e447SAlan Wright 218*a0b6e447SAlan Wright if (operator != NULL) { 219*a0b6e447SAlan Wright /* 220*a0b6e447SAlan Wright * The lexer sets the name and operator to 221*a0b6e447SAlan Wright * the same value if there is no operator. 222*a0b6e447SAlan Wright */ 223*a0b6e447SAlan Wright if (strcmp(name, operator) == 0) 224*a0b6e447SAlan Wright operator = NULL; 225*a0b6e447SAlan Wright else if (strchr(valid, *operator) == NULL) 226*a0b6e447SAlan Wright compile_error("invalid operator: %s", operator); 227*a0b6e447SAlan Wright } 228*a0b6e447SAlan Wright } 229*a0b6e447SAlan Wright 230*a0b6e447SAlan Wright arg = np->n_a_arg2; 231*a0b6e447SAlan Wright if (arg->label == INTEGER) { 232*a0b6e447SAlan Wright value = arg->n_int; 233*a0b6e447SAlan Wright 234*a0b6e447SAlan Wright if ((value == 0) && strcmp(operator, "/") == 0) 235*a0b6e447SAlan Wright compile_error("divide by zero"); 236*a0b6e447SAlan Wright } 237*a0b6e447SAlan Wright 238*a0b6e447SAlan Wright if (operator) 239*a0b6e447SAlan Wright (void) printf("%s %s %ldUL", name, operator, value); 240*a0b6e447SAlan Wright else 241*a0b6e447SAlan Wright (void) printf("%s", name); 242*a0b6e447SAlan Wright } 243*a0b6e447SAlan Wright 244d0e51869Samw static void 245d0e51869Samw print_declaration(ndr_node_t *np) 246d0e51869Samw { 247d0e51869Samw ndr_node_t *dnp = np->n_m_decl; 248d0e51869Samw char buf[NDLBUFSZ]; 249d0e51869Samw char *p = buf; 250d0e51869Samw 251d0e51869Samw if (np->n_m_type && 252d0e51869Samw (np->n_m_type->label == IDENTIFIER || 253d0e51869Samw np->n_m_type->label == TYPENAME)) { 254d0e51869Samw (void) snprintf(buf, NDLBUFSZ, "%s", np->n_m_type->n_sym->name); 255d0e51869Samw 256d0e51869Samw while (*p) 257d0e51869Samw p++; 258d0e51869Samw 259d0e51869Samw if (dnp && dnp->label == STAR) { 260d0e51869Samw *p++ = ' '; 261d0e51869Samw while (dnp && dnp->label == STAR) { 262d0e51869Samw *p++ = '*'; 263d0e51869Samw dnp = dnp->n_d_descend; 264d0e51869Samw } 265d0e51869Samw } 266d0e51869Samw *p = 0; 267d0e51869Samw (void) printf("%-23s ", buf); 268d0e51869Samw } else { 269d0e51869Samw print_node(np->n_m_type); 270d0e51869Samw (void) printf(" "); 271d0e51869Samw } 272d0e51869Samw 273d0e51869Samw print_node(dnp); 274d0e51869Samw } 275d0e51869Samw 276d0e51869Samw static void 277d0e51869Samw print_advice_list(ndr_node_t *np) 278d0e51869Samw { 279d0e51869Samw if (!np) 280d0e51869Samw return; 281d0e51869Samw 282d0e51869Samw (void) printf("["); 283d0e51869Samw for (; np; np = np->n_next) { 284d0e51869Samw print_node(np); 285d0e51869Samw if (np->n_next) 286d0e51869Samw (void) printf(" "); 287d0e51869Samw } 288d0e51869Samw (void) printf("]"); 289d0e51869Samw } 290d0e51869Samw 291d0e51869Samw static void 292d0e51869Samw print_node_list(ndr_node_t *np) 293d0e51869Samw { 294d0e51869Samw for (; np; np = np->n_next) { 295d0e51869Samw print_node(np); 296d0e51869Samw } 297d0e51869Samw } 298