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