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