1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #pragma ident "%Z%%M% %I% %E% SMI" 28 29 #include "ndrgen.h" 30 #include "y.tab.h" 31 32 33 static void print_declaration(ndr_node_t *); 34 static void print_advice_list(ndr_node_t *); 35 static void print_node_list(ndr_node_t *); 36 37 38 void 39 tdata_dump(void) 40 { 41 print_node_list(construct_list); 42 } 43 44 void 45 print_node(ndr_node_t *np) 46 { 47 char *nm; 48 49 if (!np) { 50 (void) printf("<null>"); 51 return; 52 } 53 54 switch (np->label) { 55 case ALIGN_KW: nm = "align"; break; 56 case STRUCT_KW: nm = "struct"; break; 57 case UNION_KW: nm = "union"; break; 58 case TYPEDEF_KW: nm = "typedef"; break; 59 case INTERFACE_KW: nm = "interface"; break; 60 case IN_KW: nm = "in"; break; 61 case OUT_KW: nm = "out"; break; 62 case SIZE_IS_KW: nm = "size_is"; break; 63 case LENGTH_IS_KW: nm = "length_is"; break; 64 case STRING_KW: nm = "string"; break; 65 case TRANSMIT_AS_KW: nm = "transmit_as"; break; 66 case OPERATION_KW: nm = "operation"; break; 67 case UUID_KW: nm = "uuid"; break; 68 case _NO_REORDER_KW: nm = "_no_reorder"; break; 69 case EXTERN_KW: nm = "extern"; break; 70 case ARG_IS_KW: nm = "arg_is"; break; 71 case CASE_KW: nm = "case"; break; 72 case DEFAULT_KW: nm = "default"; break; 73 case BASIC_TYPE: nm = "<btype>"; break; 74 case TYPENAME: nm = "<tname>"; break; 75 case IDENTIFIER: nm = "<ident>"; break; 76 case INTEGER: nm = "<intg>"; break; 77 case STRING: nm = "<string>"; break; 78 case STAR: nm = "<*>"; break; 79 case LB: nm = "<[>"; break; 80 case LP: nm = "<(>"; break; 81 case L_MEMBER: nm = "<member>"; break; 82 default: 83 (void) printf("<<lab=%d>>", np->label); 84 return; 85 } 86 87 switch (np->label) { 88 case STRUCT_KW: 89 case UNION_KW: 90 case TYPEDEF_KW: 91 (void) printf("\n"); 92 if (np->n_c_advice) { 93 print_advice_list(np->n_c_advice); 94 (void) printf("\n"); 95 } 96 (void) printf("%s ", nm); 97 print_node(np->n_c_typename); 98 (void) printf(" {\n"); 99 print_node_list(np->n_c_members); 100 (void) printf("};\n"); 101 break; 102 103 case IN_KW: 104 case OUT_KW: 105 case STRING_KW: 106 case DEFAULT_KW: 107 case _NO_REORDER_KW: 108 case EXTERN_KW: 109 (void) printf("%s", nm); 110 break; 111 112 case ALIGN_KW: 113 /* 114 * Don't output anything for default alignment. 115 */ 116 if ((np->n_a_arg == NULL) || (np->n_a_arg->n_int == 0)) 117 break; 118 (void) printf("%s(", nm); 119 print_node(np->n_a_arg); 120 (void) printf(")"); 121 break; 122 123 case INTERFACE_KW: 124 case SIZE_IS_KW: 125 case LENGTH_IS_KW: 126 case TRANSMIT_AS_KW: 127 case ARG_IS_KW: 128 case CASE_KW: 129 case OPERATION_KW: 130 case UUID_KW: 131 (void) printf("%s(", nm); 132 print_node(np->n_a_arg); 133 (void) printf(")"); 134 break; 135 136 case BASIC_TYPE: 137 case TYPENAME: 138 case IDENTIFIER: 139 (void) printf("%s", np->n_sym->name); 140 break; 141 142 case INTEGER: 143 (void) printf("%ld", np->n_int); 144 break; 145 146 case STRING: 147 (void) printf("\"%s\"", np->n_str); 148 break; 149 150 case STAR: 151 (void) printf("*"); 152 print_node(np->n_d_descend); 153 break; 154 155 case LB: 156 print_node(np->n_d_descend); 157 (void) printf("["); 158 if (np->n_d_dim) 159 print_node(np->n_d_dim); 160 (void) printf("]"); 161 break; 162 163 case LP: 164 (void) printf("("); 165 print_node(np->n_d_descend); 166 (void) printf(")"); 167 break; 168 169 case L_MEMBER: 170 if (np->n_m_advice) { 171 (void) printf(" "); 172 print_advice_list(np->n_m_advice); 173 (void) printf("\n"); 174 } 175 (void) printf("\t"); 176 print_declaration(np); 177 (void) printf(";\n"); 178 break; 179 180 default: 181 return; 182 } 183 } 184 185 static void 186 print_declaration(ndr_node_t *np) 187 { 188 ndr_node_t *dnp = np->n_m_decl; 189 char buf[NDLBUFSZ]; 190 char *p = buf; 191 192 if (np->n_m_type && 193 (np->n_m_type->label == IDENTIFIER || 194 np->n_m_type->label == TYPENAME)) { 195 (void) snprintf(buf, NDLBUFSZ, "%s", np->n_m_type->n_sym->name); 196 197 while (*p) 198 p++; 199 200 if (dnp && dnp->label == STAR) { 201 *p++ = ' '; 202 while (dnp && dnp->label == STAR) { 203 *p++ = '*'; 204 dnp = dnp->n_d_descend; 205 } 206 } 207 *p = 0; 208 (void) printf("%-23s ", buf); 209 } else { 210 print_node(np->n_m_type); 211 (void) printf(" "); 212 } 213 214 print_node(dnp); 215 } 216 217 static void 218 print_advice_list(ndr_node_t *np) 219 { 220 if (!np) 221 return; 222 223 (void) printf("["); 224 for (; np; np = np->n_next) { 225 print_node(np); 226 if (np->n_next) 227 (void) printf(" "); 228 } 229 (void) printf("]"); 230 } 231 232 static void 233 print_node_list(ndr_node_t *np) 234 { 235 for (; np; np = np->n_next) { 236 print_node(np); 237 } 238 } 239