1*d0e51869Samw /* 2*d0e51869Samw * CDDL HEADER START 3*d0e51869Samw * 4*d0e51869Samw * The contents of this file are subject to the terms of the 5*d0e51869Samw * Common Development and Distribution License (the "License"). 6*d0e51869Samw * You may not use this file except in compliance with the License. 7*d0e51869Samw * 8*d0e51869Samw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*d0e51869Samw * or http://www.opensolaris.org/os/licensing. 10*d0e51869Samw * See the License for the specific language governing permissions 11*d0e51869Samw * and limitations under the License. 12*d0e51869Samw * 13*d0e51869Samw * When distributing Covered Code, include this CDDL HEADER in each 14*d0e51869Samw * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*d0e51869Samw * If applicable, add the following below this CDDL HEADER, with the 16*d0e51869Samw * fields enclosed by brackets "[]" replaced with your own identifying 17*d0e51869Samw * information: Portions Copyright [yyyy] [name of copyright owner] 18*d0e51869Samw * 19*d0e51869Samw * CDDL HEADER END 20*d0e51869Samw */ 21*d0e51869Samw 22*d0e51869Samw /* 23*d0e51869Samw * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24*d0e51869Samw * Use is subject to license terms. 25*d0e51869Samw */ 26*d0e51869Samw 27*d0e51869Samw #pragma ident "%Z%%M% %I% %E% SMI" 28*d0e51869Samw 29*d0e51869Samw #ifndef _NDRGEN_H 30*d0e51869Samw #define _NDRGEN_H 31*d0e51869Samw 32*d0e51869Samw #ifdef __cplusplus 33*d0e51869Samw extern "C" { 34*d0e51869Samw #endif 35*d0e51869Samw 36*d0e51869Samw #include <stdio.h> 37*d0e51869Samw #include <stdlib.h> 38*d0e51869Samw #include <string.h> 39*d0e51869Samw #include <assert.h> 40*d0e51869Samw 41*d0e51869Samw typedef struct node { 42*d0e51869Samw int label; 43*d0e51869Samw int line_number; 44*d0e51869Samw struct symbol *file_name; 45*d0e51869Samw struct node *n_next; /* handy for lists */ 46*d0e51869Samw 47*d0e51869Samw union { 48*d0e51869Samw struct symbol *nu_sym; 49*d0e51869Samw unsigned long nu_int; 50*d0e51869Samw char *nu_str; 51*d0e51869Samw void *nu_ptr; 52*d0e51869Samw struct node *nu_node[4]; /* descendents */ 53*d0e51869Samw void *nu_arg[4]; /* utility */ 54*d0e51869Samw } n_u; 55*d0e51869Samw #define n_ptr n_u.nu_ptr 56*d0e51869Samw #define n_sym n_u.nu_sym 57*d0e51869Samw #define n_str n_u.nu_str 58*d0e51869Samw #define n_int n_u.nu_int 59*d0e51869Samw #define n_arg n_u.nu_arg 60*d0e51869Samw #define n_node n_u.nu_node 61*d0e51869Samw 62*d0e51869Samw #define n_c_advice n_node[0] 63*d0e51869Samw #define n_c_typename n_node[1] 64*d0e51869Samw #define n_c_members n_node[2] 65*d0e51869Samw 66*d0e51869Samw #define n_m_advice n_node[0] 67*d0e51869Samw #define n_m_type n_node[1] 68*d0e51869Samw #define n_m_decl n_node[2] 69*d0e51869Samw #define n_m_name n_node[3] 70*d0e51869Samw 71*d0e51869Samw #define n_a_arg n_node[0] 72*d0e51869Samw 73*d0e51869Samw #define n_d_descend n_node[0] 74*d0e51869Samw #define n_d_dim n_node[1] 75*d0e51869Samw } ndr_node_t; 76*d0e51869Samw 77*d0e51869Samw typedef struct keyword { 78*d0e51869Samw char *name; 79*d0e51869Samw int token; 80*d0e51869Samw long value; 81*d0e51869Samw } ndr_keyword_t; 82*d0e51869Samw 83*d0e51869Samw typedef struct symbol { 84*d0e51869Samw struct symbol *next; 85*d0e51869Samw char *name; 86*d0e51869Samw ndr_keyword_t *kw; 87*d0e51869Samw struct node *typedefn; 88*d0e51869Samw struct node s_node; 89*d0e51869Samw } ndr_symbol_t; 90*d0e51869Samw 91*d0e51869Samw typedef struct integer { 92*d0e51869Samw struct integer *next; 93*d0e51869Samw long value; 94*d0e51869Samw struct node s_node; 95*d0e51869Samw } ndr_integer_t; 96*d0e51869Samw 97*d0e51869Samw #define NDLBUFSZ 100 98*d0e51869Samw 99*d0e51869Samw /* This makes certain things much easier */ 100*d0e51869Samw #define N_ADVICE 18 101*d0e51869Samw 102*d0e51869Samw typedef struct advice { 103*d0e51869Samw struct node *a_nodes[N_ADVICE]; 104*d0e51869Samw 105*d0e51869Samw /* alias for basic types */ 106*d0e51869Samw #define a_transmit_as a_nodes[0] 107*d0e51869Samw 108*d0e51869Samw /* arg used for size, union or generic purpose */ 109*d0e51869Samw #define a_arg_is a_nodes[1] 110*d0e51869Samw 111*d0e51869Samw /* operation parameter in/out stuff */ 112*d0e51869Samw #define a_operation a_nodes[2] 113*d0e51869Samw #define a_in a_nodes[3] 114*d0e51869Samw #define a_out a_nodes[4] 115*d0e51869Samw 116*d0e51869Samw /* size stuff */ 117*d0e51869Samw #define a_string a_nodes[5] 118*d0e51869Samw #define a_size_is a_nodes[6] 119*d0e51869Samw #define a_length_is a_nodes[7] 120*d0e51869Samw 121*d0e51869Samw /* union stuff */ 122*d0e51869Samw #define a_case a_nodes[8] 123*d0e51869Samw #define a_default a_nodes[9] 124*d0e51869Samw #define a_switch_is a_nodes[10] 125*d0e51869Samw 126*d0e51869Samw /* interface stuff */ 127*d0e51869Samw #define a_interface a_nodes[11] 128*d0e51869Samw #define a_uuid a_nodes[12] 129*d0e51869Samw #define a_no_reorder a_nodes[13] 130*d0e51869Samw #define a_extern a_nodes[14] 131*d0e51869Samw #define a_reference a_nodes[15] 132*d0e51869Samw #define a_align a_nodes[16] 133*d0e51869Samw } ndr_advice_t; 134*d0e51869Samw 135*d0e51869Samw typedef struct typeinfo { 136*d0e51869Samw struct typeinfo *next; 137*d0e51869Samw 138*d0e51869Samw unsigned int alignment : 3; /* mask */ 139*d0e51869Samw unsigned int is_conformant : 1; 140*d0e51869Samw unsigned int is_varying : 1; 141*d0e51869Samw unsigned int is_string : 1; 142*d0e51869Samw unsigned int max_given : 1; 143*d0e51869Samw unsigned int min_given : 1; 144*d0e51869Samw unsigned int complete : 1; 145*d0e51869Samw unsigned int has_pointers : 1; 146*d0e51869Samw unsigned int is_referenced : 1; 147*d0e51869Samw unsigned int is_extern : 1; 148*d0e51869Samw 149*d0e51869Samw unsigned short type_op; /* STAR LB */ 150*d0e51869Samw /* STRUCT BASIC_TYPE */ 151*d0e51869Samw struct node *type_dim; /* for LB */ 152*d0e51869Samw struct typeinfo *type_down; /* for STAR LB */ 153*d0e51869Samw struct node *definition; 154*d0e51869Samw struct node *type_name; /* symbol */ 155*d0e51869Samw ndr_advice_t advice; 156*d0e51869Samw unsigned int size_fixed_part; 157*d0e51869Samw unsigned int size_variable_part; 158*d0e51869Samw 159*d0e51869Samw /* size_is(n_members) */ 160*d0e51869Samw struct member *member; /* array */ 161*d0e51869Samw int n_member; 162*d0e51869Samw } ndr_typeinfo_t; 163*d0e51869Samw 164*d0e51869Samw typedef struct member { 165*d0e51869Samw char *name; 166*d0e51869Samw struct typeinfo *type; 167*d0e51869Samw int is_conformant; 168*d0e51869Samw struct node *definition; 169*d0e51869Samw ndr_advice_t advice; 170*d0e51869Samw unsigned int pdu_offset; 171*d0e51869Samw } ndr_member_t; 172*d0e51869Samw 173*d0e51869Samw extern ndr_typeinfo_t *typeinfo_list; 174*d0e51869Samw extern struct node *construct_list; 175*d0e51869Samw 176*d0e51869Samw /* ndr_anal.c */ 177*d0e51869Samw extern void analyze(void); 178*d0e51869Samw extern void show_typeinfo_list(void); 179*d0e51869Samw extern void type_extern_suffix(ndr_typeinfo_t *, char *, size_t); 180*d0e51869Samw extern void type_null_decl(ndr_typeinfo_t *, char *, size_t); 181*d0e51869Samw extern void type_name_decl(ndr_typeinfo_t *, char *, size_t, char *); 182*d0e51869Samw extern void show_advice(ndr_advice_t *, int); 183*d0e51869Samw extern void member_fixup(ndr_node_t *); 184*d0e51869Samw extern void construct_fixup(ndr_node_t *); 185*d0e51869Samw 186*d0e51869Samw /* ndr_gen.c */ 187*d0e51869Samw extern void generate(void); 188*d0e51869Samw 189*d0e51869Samw /* ndr_lex.c */ 190*d0e51869Samw extern ndr_symbol_t *symbol_list; 191*d0e51869Samw extern int line_number; 192*d0e51869Samw extern int n_compile_error; 193*d0e51869Samw extern struct node *yylval; 194*d0e51869Samw extern void set_lex_input(FILE *, char *); 195*d0e51869Samw extern int yylex(void); 196*d0e51869Samw extern ndr_symbol_t *sym_enter(char *); 197*d0e51869Samw extern void * ndr_alloc(size_t nelem, size_t elsize); 198*d0e51869Samw extern void compile_error(const char *, ...); 199*d0e51869Samw extern void fatal_error(const char *, ...); 200*d0e51869Samw extern struct node *n_cons(int, ...); 201*d0e51869Samw extern void n_splice(struct node *, struct node *); 202*d0e51869Samw 203*d0e51869Samw /* ndr_print.c */ 204*d0e51869Samw extern void tdata_dump(void); 205*d0e51869Samw extern void print_node(ndr_node_t *); 206*d0e51869Samw 207*d0e51869Samw /* ndr_parse.y */ 208*d0e51869Samw extern int yyparse(void); 209*d0e51869Samw 210*d0e51869Samw /* ndr_main.c */ 211*d0e51869Samw extern int yyerror(char *); 212*d0e51869Samw 213*d0e51869Samw #ifdef __cplusplus 214*d0e51869Samw } 215*d0e51869Samw #endif 216*d0e51869Samw 217*d0e51869Samw #endif /* _NDRGEN_H */ 218