xref: /illumos-gate/usr/src/tools/ndrgen/ndrgen.h (revision ce8560ee)
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