xref: /titanic_50/usr/src/cmd/sgs/yacc/common/dextern.h (revision 1dd08564e4a3aafe66b00aee6f222b0885346fe8)
1e29394bdSmike_s /*
2e29394bdSmike_s  * CDDL HEADER START
3e29394bdSmike_s  *
4e29394bdSmike_s  * The contents of this file are subject to the terms of the
567298654Sdamico  * Common Development and Distribution License (the "License").
667298654Sdamico  * You may not use this file except in compliance with the License.
7e29394bdSmike_s  *
8e29394bdSmike_s  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e29394bdSmike_s  * or http://www.opensolaris.org/os/licensing.
10e29394bdSmike_s  * See the License for the specific language governing permissions
11e29394bdSmike_s  * and limitations under the License.
12e29394bdSmike_s  *
13e29394bdSmike_s  * When distributing Covered Code, include this CDDL HEADER in each
14e29394bdSmike_s  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15e29394bdSmike_s  * If applicable, add the following below this CDDL HEADER, with the
16e29394bdSmike_s  * fields enclosed by brackets "[]" replaced with your own identifying
17e29394bdSmike_s  * information: Portions Copyright [yyyy] [name of copyright owner]
18e29394bdSmike_s  *
19e29394bdSmike_s  * CDDL HEADER END
20e29394bdSmike_s  */
21e29394bdSmike_s /*
22*1dd08564Sab196087  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23e29394bdSmike_s  * Use is subject to license terms.
24e29394bdSmike_s  */
25e29394bdSmike_s 
26e29394bdSmike_s /* Copyright (c) 1988 AT&T */
27e29394bdSmike_s /* All Rights Reserved */
28e29394bdSmike_s 
29e29394bdSmike_s #ifndef _DEXTERN_H
30e29394bdSmike_s #define	_DEXTERN_H
31e29394bdSmike_s 
32e29394bdSmike_s #pragma ident	"%Z%%M%	%I%	%E% SMI"
33e29394bdSmike_s 
34e29394bdSmike_s #include <stdio.h>
35e29394bdSmike_s #include <inttypes.h>
36e29394bdSmike_s #include <ctype.h>
37e29394bdSmike_s #include <memory.h>
38e29394bdSmike_s #include <string.h>
39e29394bdSmike_s #include <malloc.h>
40e29394bdSmike_s #include <values.h>
41e29394bdSmike_s #include <widec.h>
42e29394bdSmike_s #include <unistd.h>
43e29394bdSmike_s #include <stdlib.h>
44e29394bdSmike_s #include <wctype.h>
45e29394bdSmike_s 
46e29394bdSmike_s #ifdef	__cplusplus
47e29394bdSmike_s extern "C" {
48e29394bdSmike_s #endif
49e29394bdSmike_s 
50e29394bdSmike_s 	/*  MANIFEST CONSTANT DEFINITIONS */
51e29394bdSmike_s #if u3b || u3b15 || u3b2 || vax || uts || sparc
52e29394bdSmike_s #define	WORD32
53e29394bdSmike_s #endif
54e29394bdSmike_s #include <libintl.h>
55e29394bdSmike_s 
56e29394bdSmike_s 	/* base of nonterminal internal numbers */
57e29394bdSmike_s 
58e29394bdSmike_s #define	NTBASE (10000000)
59e29394bdSmike_s 
60e29394bdSmike_s 	/* internal codes for error and accept actions */
61e29394bdSmike_s 
62e29394bdSmike_s #define	ERRCODE  8190
63e29394bdSmike_s #define	ACCEPTCODE 8191
64e29394bdSmike_s 
65e29394bdSmike_s 	/* sizes and limits */
66e29394bdSmike_s 
67e29394bdSmike_s #define	ACTSIZE 4000
68e29394bdSmike_s #define	MEMSIZE 2000
69e29394bdSmike_s #define	PSTSIZE 1024
70e29394bdSmike_s #define	NSTATES 1000
71e29394bdSmike_s #define	NTERMS 127
72e29394bdSmike_s #define	NPROD 300
73e29394bdSmike_s #define	NNONTERM 600
74e29394bdSmike_s #define	TEMPSIZE 800
75e29394bdSmike_s #define	CNAMSZ 1000
76e29394bdSmike_s #define	LSETSIZE 950
77e29394bdSmike_s #define	WSETSIZE 850
78e29394bdSmike_s 
79e29394bdSmike_s #define	NAMESIZE 50
80e29394bdSmike_s #define	NTYPES 1000
81e29394bdSmike_s 
82e29394bdSmike_s #define	NMBCHARSZ 100
83e29394bdSmike_s #define	LKFACTOR 5
84e29394bdSmike_s 
85e29394bdSmike_s #ifdef WORD32
86e29394bdSmike_s 	/* bit packing macros (may be machine dependent) */
87e29394bdSmike_s #define	BIT(a, i) ((a)[(i)>>5] & (1<<((i)&037)))
88e29394bdSmike_s #define	SETBIT(a, i) ((a)[(i)>>5] |= (1<<((i)&037)))
89e29394bdSmike_s 
90e29394bdSmike_s 	/* number of words needed to hold n+1 bits */
91e29394bdSmike_s #define	NWORDS(n) (((n)+32)/32)
92e29394bdSmike_s 
93e29394bdSmike_s #else
94e29394bdSmike_s 
95e29394bdSmike_s 	/* bit packing macros (may be machine dependent) */
96e29394bdSmike_s #define	BIT(a, i) ((a)[(i)>>4] & (1<<((i)&017)))
97e29394bdSmike_s #define	SETBIT(a, i) ((a)[(i)>>4] |= (1<<((i)&017)))
98e29394bdSmike_s 
99e29394bdSmike_s 	/* number of words needed to hold n+1 bits */
100e29394bdSmike_s #define	NWORDS(n) (((n)+16)/16)
101e29394bdSmike_s #endif
102e29394bdSmike_s 
103e29394bdSmike_s 	/*
104e29394bdSmike_s 	 * relationships which must hold:
105e29394bdSmike_s 	 * TBITSET ints must hold NTERMS+1 bits...
106e29394bdSmike_s 	 * WSETSIZE >= NNONTERM
107e29394bdSmike_s 	 * LSETSIZE >= NNONTERM
108e29394bdSmike_s 	 * TEMPSIZE >= NTERMS + NNONTERMs + 1
109e29394bdSmike_s 	 * TEMPSIZE >= NSTATES
110e29394bdSmike_s 	 */
111e29394bdSmike_s 
112e29394bdSmike_s 	/* associativities */
113e29394bdSmike_s 
114e29394bdSmike_s #define	NOASC 0  /* no assoc. */
115e29394bdSmike_s #define	LASC 1  /* left assoc. */
116e29394bdSmike_s #define	RASC 2  /* right assoc. */
117e29394bdSmike_s #define	BASC 3  /* binary assoc. */
118e29394bdSmike_s 
119e29394bdSmike_s 	/* flags for state generation */
120e29394bdSmike_s 
121e29394bdSmike_s #define	DONE 0
122e29394bdSmike_s #define	MUSTDO 1
123e29394bdSmike_s #define	MUSTLOOKAHEAD 2
124e29394bdSmike_s 
125e29394bdSmike_s 	/* flags for a rule having an action, and being reduced */
126e29394bdSmike_s 
127e29394bdSmike_s #define	ACTFLAG 04
128e29394bdSmike_s #define	REDFLAG 010
129e29394bdSmike_s 
130e29394bdSmike_s 	/* output parser flags */
131e29394bdSmike_s #define	YYFLAG1 (-10000000)
132e29394bdSmike_s 
133e29394bdSmike_s 	/* macros for getting associativity and precedence levels */
134e29394bdSmike_s 
135e29394bdSmike_s #define	ASSOC(i) ((i)&07)
136e29394bdSmike_s #define	PLEVEL(i) (((i)>>4)&077)
137e29394bdSmike_s #define	TYPE(i)  ((i>>10)&077)
138e29394bdSmike_s 
139e29394bdSmike_s 	/* macros for setting associativity and precedence levels */
140e29394bdSmike_s 
141e29394bdSmike_s #define	SETASC(i, j) i |= j
142e29394bdSmike_s #define	SETPLEV(i, j) i |= (j<<4)
143e29394bdSmike_s #define	SETTYPE(i, j) i |= (j<<10)
144e29394bdSmike_s 
145e29394bdSmike_s 	/* looping macros */
146e29394bdSmike_s 
147e29394bdSmike_s #define	TLOOP(i) for (i = 1; i <= ntokens; ++i)
148e29394bdSmike_s #define	NTLOOP(i) for (i = 0; i <= nnonter; ++i)
149e29394bdSmike_s #define	PLOOP(s, i) for (i = s; i < nprod; ++i)
150e29394bdSmike_s #define	SLOOP(i) for (i = 0; i < nstate; ++i)
151e29394bdSmike_s #define	WSBUMP(x) ++x
152e29394bdSmike_s #define	WSLOOP(s, j) for (j = s; j < &wsets[cwp]; ++j)
153e29394bdSmike_s #define	ITMLOOP(i, p, q) q = pstate[i+1]; for (p = pstate[i]; p < q; ++p)
154e29394bdSmike_s #define	SETLOOP(i) for (i = 0; i < tbitset; ++i)
155e29394bdSmike_s 
156e29394bdSmike_s 	/* I/O descriptors */
157e29394bdSmike_s 
158e29394bdSmike_s extern FILE *finput;		/* input file */
159e29394bdSmike_s extern FILE *faction;		/* file for saving actions */
160e29394bdSmike_s extern FILE *fdefine;		/* file for #defines */
161e29394bdSmike_s extern FILE *ftable;		/* y.tab.c file */
162e29394bdSmike_s extern FILE *ftemp;		/* tempfile to pass 2 */
163e29394bdSmike_s extern FILE *fdebug;		/* tempfile for two debugging info arrays */
164e29394bdSmike_s extern FILE *foutput;		/* y.output file */
165e29394bdSmike_s 
166e29394bdSmike_s 	/* structure declarations */
167e29394bdSmike_s 
168e29394bdSmike_s typedef struct looksets {
169e29394bdSmike_s 	int *lset;
170e29394bdSmike_s } LOOKSETS;
171e29394bdSmike_s 
172e29394bdSmike_s typedef struct item {
173e29394bdSmike_s 	int *pitem;
174e29394bdSmike_s 	LOOKSETS *look;
175e29394bdSmike_s } ITEM;
176e29394bdSmike_s 
177e29394bdSmike_s typedef struct toksymb {
178e29394bdSmike_s 	wchar_t *name;
179e29394bdSmike_s 	int value;
180e29394bdSmike_s } TOKSYMB;
181e29394bdSmike_s 
182e29394bdSmike_s typedef struct mbclit {
183e29394bdSmike_s 	wchar_t character;
184e29394bdSmike_s 	int tvalue; /* token issued for the character */
185e29394bdSmike_s } MBCLIT;
186e29394bdSmike_s 
187e29394bdSmike_s typedef struct ntsymb {
188e29394bdSmike_s 	wchar_t *name;
189e29394bdSmike_s 	int tvalue;
190e29394bdSmike_s } NTSYMB;
191e29394bdSmike_s 
192e29394bdSmike_s typedef struct wset {
193e29394bdSmike_s 	int *pitem;
194e29394bdSmike_s 	int flag;
195e29394bdSmike_s 	LOOKSETS ws;
196e29394bdSmike_s } WSET;
197e29394bdSmike_s 
198e29394bdSmike_s 	/* token information */
199e29394bdSmike_s 
200e29394bdSmike_s extern int ntokens;	/* number of tokens */
201e29394bdSmike_s extern TOKSYMB *tokset;
202e29394bdSmike_s extern int ntoksz;
203e29394bdSmike_s 
204e29394bdSmike_s 	/*
205e29394bdSmike_s 	 * multibyte (c > 255) character literals are
206e29394bdSmike_s 	 * handled as though they were tokens except
207e29394bdSmike_s 	 * that it generates a separate mapping table.
208e29394bdSmike_s 	 */
209e29394bdSmike_s extern int nmbchars;	/* number of mb literals */
210e29394bdSmike_s extern MBCLIT *mbchars;
211e29394bdSmike_s extern int nmbcharsz;
212e29394bdSmike_s 
213e29394bdSmike_s 	/* nonterminal information */
214e29394bdSmike_s 
215e29394bdSmike_s extern int nnonter;	/* the number of nonterminals */
216e29394bdSmike_s extern NTSYMB *nontrst;
217e29394bdSmike_s extern int nnontersz;
218e29394bdSmike_s 
219e29394bdSmike_s 	/* grammar rule information */
220e29394bdSmike_s 
221e29394bdSmike_s extern int nprod;	/* number of productions */
222e29394bdSmike_s extern int **prdptr;	/* pointers to descriptions of productions */
223e29394bdSmike_s extern int *levprd;	/* contains production levels to break conflicts */
224e29394bdSmike_s extern wchar_t *had_act; /* set if reduction has associated action code */
225e29394bdSmike_s 
226e29394bdSmike_s 	/* state information */
227e29394bdSmike_s 
228e29394bdSmike_s extern int nstate;		/* number of states */
229e29394bdSmike_s extern ITEM **pstate;	/* pointers to the descriptions of the states */
230e29394bdSmike_s extern int *tystate;	/* contains type information about the states */
231e29394bdSmike_s extern int *defact;	/* the default action of the state */
232e29394bdSmike_s 
233e29394bdSmike_s extern int size;
234e29394bdSmike_s 
235e29394bdSmike_s 	/* lookahead set information */
236e29394bdSmike_s 
237e29394bdSmike_s extern int TBITSET;
238e29394bdSmike_s extern LOOKSETS *lkst;
239e29394bdSmike_s extern int nolook;  /* flag to turn off lookahead computations */
240e29394bdSmike_s 
241e29394bdSmike_s 	/* working set information */
242e29394bdSmike_s 
243e29394bdSmike_s extern WSET *wsets;
244e29394bdSmike_s 
245e29394bdSmike_s 	/* storage for productions */
246e29394bdSmike_s 
247e29394bdSmike_s extern int *mem0;
248e29394bdSmike_s extern int *mem;
249e29394bdSmike_s extern int *tracemem;
250e29394bdSmike_s extern int new_memsize;
251e29394bdSmike_s 
252e29394bdSmike_s 	/* storage for action table */
253e29394bdSmike_s 
254e29394bdSmike_s extern int *amem;
255e29394bdSmike_s extern int *memp;		/* next free action table position */
256e29394bdSmike_s extern int *indgo;		/* index to the stored goto table */
257e29394bdSmike_s extern int new_actsize;
258e29394bdSmike_s 
259e29394bdSmike_s 	/* temporary vector, indexable by states, terms, or ntokens */
260e29394bdSmike_s 
261e29394bdSmike_s extern int *temp1;
262e29394bdSmike_s extern int lineno; /* current line number */
263e29394bdSmike_s 
264e29394bdSmike_s 	/* statistics collection variables */
265e29394bdSmike_s 
266e29394bdSmike_s extern int zzgoent;
267e29394bdSmike_s extern int zzgobest;
268e29394bdSmike_s extern int zzacent;
269e29394bdSmike_s extern int zzexcp;
270e29394bdSmike_s extern int zzrrconf;
271e29394bdSmike_s extern int zzsrconf;
272e29394bdSmike_s 
273e29394bdSmike_s 	/* define external functions */
274e29394bdSmike_s 
275e29394bdSmike_s extern void setup(int, char *[]);
276e29394bdSmike_s extern void closure(int);
277e29394bdSmike_s extern void output(void);
278e29394bdSmike_s extern void aryfil(int *, int, int);
279e29394bdSmike_s extern void error(char *, ...);
280e29394bdSmike_s extern void warning(int, char *, ...);
281e29394bdSmike_s extern void putitem(int *, LOOKSETS *);
282e29394bdSmike_s extern void go2out(void);
283e29394bdSmike_s extern void hideprod(void);
284e29394bdSmike_s extern void callopt(void);
285e29394bdSmike_s extern void warray(wchar_t *, int *, int);
286e29394bdSmike_s extern wchar_t *symnam(int);
287e29394bdSmike_s extern wchar_t *writem(int *);
288e29394bdSmike_s extern void exp_mem(int);
289e29394bdSmike_s extern void exp_act(int **);
290e29394bdSmike_s extern int apack(int *, int);
291e29394bdSmike_s extern int state(int);
292e29394bdSmike_s extern void fprintf3(FILE *, const char *, const wchar_t *, const char *, ...);
293e29394bdSmike_s extern void error3(const char *, const wchar_t *, const char *, ...);
294e29394bdSmike_s 
295e29394bdSmike_s extern wchar_t *wscpy(wchar_t *, const wchar_t *);
296e29394bdSmike_s extern size_t wslen(const wchar_t *);
297e29394bdSmike_s extern int wscmp(const wchar_t *, const wchar_t *);
298e29394bdSmike_s 
299e29394bdSmike_s 
300e29394bdSmike_s 	/* yaccpar location */
301e29394bdSmike_s 
302e29394bdSmike_s extern char *parser;
303e29394bdSmike_s 
304e29394bdSmike_s 	/* default settings for a number of macros */
305e29394bdSmike_s 
306e29394bdSmike_s 	/* name of yacc tempfiles */
307e29394bdSmike_s 
308e29394bdSmike_s #ifndef TEMPNAME
309e29394bdSmike_s #define	TEMPNAME "yacc.tmp"
310e29394bdSmike_s #endif
311e29394bdSmike_s 
312e29394bdSmike_s #ifndef ACTNAME
313e29394bdSmike_s #define	ACTNAME "yacc.acts"
314e29394bdSmike_s #endif
315e29394bdSmike_s 
316e29394bdSmike_s #ifndef DEBUGNAME
317e29394bdSmike_s #define	DEBUGNAME "yacc.debug"
318e29394bdSmike_s #endif
319e29394bdSmike_s 
320e29394bdSmike_s 	/* command to clobber tempfiles after use */
321e29394bdSmike_s 
322e29394bdSmike_s #ifndef ZAPFILE
323e29394bdSmike_s #define	ZAPFILE(x) (void)unlink(x)
324e29394bdSmike_s #endif
325e29394bdSmike_s 
326e29394bdSmike_s #ifndef PARSER
32767298654Sdamico #define	PARSER "/usr/share/lib/ccs/yaccpar"
328e29394bdSmike_s #endif
329e29394bdSmike_s 
330*1dd08564Sab196087 /*
331*1dd08564Sab196087  * Lint is unable to properly handle formats with wide strings
332*1dd08564Sab196087  * (e.g. %ws) and misdiagnoses them as being malformed.
333*1dd08564Sab196087  * This macro is used to work around that, by substituting
334*1dd08564Sab196087  * a pointer to a null string when compiled by lint. This
335*1dd08564Sab196087  * trick works because lint is not able to evaluate the
336*1dd08564Sab196087  * variable.
337*1dd08564Sab196087  *
338*1dd08564Sab196087  * When lint is able to handle %ws, it would be appropriate
339*1dd08564Sab196087  * to come back through and remove the use of this macro.
340*1dd08564Sab196087  */
341*1dd08564Sab196087 #if defined(__lint)
342*1dd08564Sab196087 static const char *lint_ws_fmt = "";
343*1dd08564Sab196087 #define	WSFMT(_fmt) lint_ws_fmt
344*1dd08564Sab196087 #else
345*1dd08564Sab196087 #define	WSFMT(_fmt) _fmt
346*1dd08564Sab196087 #endif
347*1dd08564Sab196087 
348e29394bdSmike_s #ifdef	__cplusplus
349e29394bdSmike_s }
350e29394bdSmike_s #endif
351e29394bdSmike_s 
352e29394bdSmike_s #endif /* _DEXTERN_H */
353