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