xref: /onnv-gate/usr/src/cmd/sgs/yacc/common/dextern.h (revision 6951:59445bec7ef4)
1100Smike_s /*
2100Smike_s  * CDDL HEADER START
3100Smike_s  *
4100Smike_s  * The contents of this file are subject to the terms of the
54538Sdamico  * Common Development and Distribution License (the "License").
64538Sdamico  * You may not use this file except in compliance with the License.
7100Smike_s  *
8100Smike_s  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9100Smike_s  * or http://www.opensolaris.org/os/licensing.
10100Smike_s  * See the License for the specific language governing permissions
11100Smike_s  * and limitations under the License.
12100Smike_s  *
13100Smike_s  * When distributing Covered Code, include this CDDL HEADER in each
14100Smike_s  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15100Smike_s  * If applicable, add the following below this CDDL HEADER, with the
16100Smike_s  * fields enclosed by brackets "[]" replaced with your own identifying
17100Smike_s  * information: Portions Copyright [yyyy] [name of copyright owner]
18100Smike_s  *
19100Smike_s  * CDDL HEADER END
20100Smike_s  */
21100Smike_s /*
22*6951Sab196087  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23100Smike_s  * Use is subject to license terms.
24100Smike_s  */
25100Smike_s 
26100Smike_s /* Copyright (c) 1988 AT&T */
27100Smike_s /* All Rights Reserved */
28100Smike_s 
29100Smike_s #ifndef _DEXTERN_H
30100Smike_s #define	_DEXTERN_H
31100Smike_s 
32100Smike_s #pragma ident	"%Z%%M%	%I%	%E% SMI"
33100Smike_s 
34100Smike_s #include <stdio.h>
35100Smike_s #include <inttypes.h>
36100Smike_s #include <ctype.h>
37100Smike_s #include <memory.h>
38100Smike_s #include <string.h>
39100Smike_s #include <malloc.h>
40100Smike_s #include <values.h>
41100Smike_s #include <widec.h>
42100Smike_s #include <unistd.h>
43100Smike_s #include <stdlib.h>
44100Smike_s #include <wctype.h>
45100Smike_s 
46100Smike_s #ifdef	__cplusplus
47100Smike_s extern "C" {
48100Smike_s #endif
49100Smike_s 
50100Smike_s 	/*  MANIFEST CONSTANT DEFINITIONS */
51100Smike_s #if u3b || u3b15 || u3b2 || vax || uts || sparc
52100Smike_s #define	WORD32
53100Smike_s #endif
54100Smike_s #include <libintl.h>
55100Smike_s 
56100Smike_s 	/* base of nonterminal internal numbers */
57100Smike_s 
58100Smike_s #define	NTBASE (10000000)
59100Smike_s 
60100Smike_s 	/* internal codes for error and accept actions */
61100Smike_s 
62100Smike_s #define	ERRCODE  8190
63100Smike_s #define	ACCEPTCODE 8191
64100Smike_s 
65100Smike_s 	/* sizes and limits */
66100Smike_s 
67100Smike_s #define	ACTSIZE 4000
68100Smike_s #define	MEMSIZE 2000
69100Smike_s #define	PSTSIZE 1024
70100Smike_s #define	NSTATES 1000
71100Smike_s #define	NTERMS 127
72100Smike_s #define	NPROD 300
73100Smike_s #define	NNONTERM 600
74100Smike_s #define	TEMPSIZE 800
75100Smike_s #define	CNAMSZ 1000
76100Smike_s #define	LSETSIZE 950
77100Smike_s #define	WSETSIZE 850
78100Smike_s 
79100Smike_s #define	NAMESIZE 50
80100Smike_s #define	NTYPES 1000
81100Smike_s 
82100Smike_s #define	NMBCHARSZ 100
83100Smike_s #define	LKFACTOR 5
84100Smike_s 
85100Smike_s #ifdef WORD32
86100Smike_s 	/* bit packing macros (may be machine dependent) */
87100Smike_s #define	BIT(a, i) ((a)[(i)>>5] & (1<<((i)&037)))
88100Smike_s #define	SETBIT(a, i) ((a)[(i)>>5] |= (1<<((i)&037)))
89100Smike_s 
90100Smike_s 	/* number of words needed to hold n+1 bits */
91100Smike_s #define	NWORDS(n) (((n)+32)/32)
92100Smike_s 
93100Smike_s #else
94100Smike_s 
95100Smike_s 	/* bit packing macros (may be machine dependent) */
96100Smike_s #define	BIT(a, i) ((a)[(i)>>4] & (1<<((i)&017)))
97100Smike_s #define	SETBIT(a, i) ((a)[(i)>>4] |= (1<<((i)&017)))
98100Smike_s 
99100Smike_s 	/* number of words needed to hold n+1 bits */
100100Smike_s #define	NWORDS(n) (((n)+16)/16)
101100Smike_s #endif
102100Smike_s 
103100Smike_s 	/*
104100Smike_s 	 * relationships which must hold:
105100Smike_s 	 * TBITSET ints must hold NTERMS+1 bits...
106100Smike_s 	 * WSETSIZE >= NNONTERM
107100Smike_s 	 * LSETSIZE >= NNONTERM
108100Smike_s 	 * TEMPSIZE >= NTERMS + NNONTERMs + 1
109100Smike_s 	 * TEMPSIZE >= NSTATES
110100Smike_s 	 */
111100Smike_s 
112100Smike_s 	/* associativities */
113100Smike_s 
114100Smike_s #define	NOASC 0  /* no assoc. */
115100Smike_s #define	LASC 1  /* left assoc. */
116100Smike_s #define	RASC 2  /* right assoc. */
117100Smike_s #define	BASC 3  /* binary assoc. */
118100Smike_s 
119100Smike_s 	/* flags for state generation */
120100Smike_s 
121100Smike_s #define	DONE 0
122100Smike_s #define	MUSTDO 1
123100Smike_s #define	MUSTLOOKAHEAD 2
124100Smike_s 
125100Smike_s 	/* flags for a rule having an action, and being reduced */
126100Smike_s 
127100Smike_s #define	ACTFLAG 04
128100Smike_s #define	REDFLAG 010
129100Smike_s 
130100Smike_s 	/* output parser flags */
131100Smike_s #define	YYFLAG1 (-10000000)
132100Smike_s 
133100Smike_s 	/* macros for getting associativity and precedence levels */
134100Smike_s 
135100Smike_s #define	ASSOC(i) ((i)&07)
136100Smike_s #define	PLEVEL(i) (((i)>>4)&077)
137100Smike_s #define	TYPE(i)  ((i>>10)&077)
138100Smike_s 
139100Smike_s 	/* macros for setting associativity and precedence levels */
140100Smike_s 
141100Smike_s #define	SETASC(i, j) i |= j
142100Smike_s #define	SETPLEV(i, j) i |= (j<<4)
143100Smike_s #define	SETTYPE(i, j) i |= (j<<10)
144100Smike_s 
145100Smike_s 	/* looping macros */
146100Smike_s 
147100Smike_s #define	TLOOP(i) for (i = 1; i <= ntokens; ++i)
148100Smike_s #define	NTLOOP(i) for (i = 0; i <= nnonter; ++i)
149100Smike_s #define	PLOOP(s, i) for (i = s; i < nprod; ++i)
150100Smike_s #define	SLOOP(i) for (i = 0; i < nstate; ++i)
151100Smike_s #define	WSBUMP(x) ++x
152100Smike_s #define	WSLOOP(s, j) for (j = s; j < &wsets[cwp]; ++j)
153100Smike_s #define	ITMLOOP(i, p, q) q = pstate[i+1]; for (p = pstate[i]; p < q; ++p)
154100Smike_s #define	SETLOOP(i) for (i = 0; i < tbitset; ++i)
155100Smike_s 
156100Smike_s 	/* I/O descriptors */
157100Smike_s 
158100Smike_s extern FILE *finput;		/* input file */
159100Smike_s extern FILE *faction;		/* file for saving actions */
160100Smike_s extern FILE *fdefine;		/* file for #defines */
161100Smike_s extern FILE *ftable;		/* y.tab.c file */
162100Smike_s extern FILE *ftemp;		/* tempfile to pass 2 */
163100Smike_s extern FILE *fdebug;		/* tempfile for two debugging info arrays */
164100Smike_s extern FILE *foutput;		/* y.output file */
165100Smike_s 
166100Smike_s 	/* structure declarations */
167100Smike_s 
168100Smike_s typedef struct looksets {
169100Smike_s 	int *lset;
170100Smike_s } LOOKSETS;
171100Smike_s 
172100Smike_s typedef struct item {
173100Smike_s 	int *pitem;
174100Smike_s 	LOOKSETS *look;
175100Smike_s } ITEM;
176100Smike_s 
177100Smike_s typedef struct toksymb {
178100Smike_s 	wchar_t *name;
179100Smike_s 	int value;
180100Smike_s } TOKSYMB;
181100Smike_s 
182100Smike_s typedef struct mbclit {
183100Smike_s 	wchar_t character;
184100Smike_s 	int tvalue; /* token issued for the character */
185100Smike_s } MBCLIT;
186100Smike_s 
187100Smike_s typedef struct ntsymb {
188100Smike_s 	wchar_t *name;
189100Smike_s 	int tvalue;
190100Smike_s } NTSYMB;
191100Smike_s 
192100Smike_s typedef struct wset {
193100Smike_s 	int *pitem;
194100Smike_s 	int flag;
195100Smike_s 	LOOKSETS ws;
196100Smike_s } WSET;
197100Smike_s 
198100Smike_s 	/* token information */
199100Smike_s 
200100Smike_s extern int ntokens;	/* number of tokens */
201100Smike_s extern TOKSYMB *tokset;
202100Smike_s extern int ntoksz;
203100Smike_s 
204100Smike_s 	/*
205100Smike_s 	 * multibyte (c > 255) character literals are
206100Smike_s 	 * handled as though they were tokens except
207100Smike_s 	 * that it generates a separate mapping table.
208100Smike_s 	 */
209100Smike_s extern int nmbchars;	/* number of mb literals */
210100Smike_s extern MBCLIT *mbchars;
211100Smike_s extern int nmbcharsz;
212100Smike_s 
213100Smike_s 	/* nonterminal information */
214100Smike_s 
215100Smike_s extern int nnonter;	/* the number of nonterminals */
216100Smike_s extern NTSYMB *nontrst;
217100Smike_s extern int nnontersz;
218100Smike_s 
219100Smike_s 	/* grammar rule information */
220100Smike_s 
221100Smike_s extern int nprod;	/* number of productions */
222100Smike_s extern int **prdptr;	/* pointers to descriptions of productions */
223100Smike_s extern int *levprd;	/* contains production levels to break conflicts */
224100Smike_s extern wchar_t *had_act; /* set if reduction has associated action code */
225100Smike_s 
226100Smike_s 	/* state information */
227100Smike_s 
228100Smike_s extern int nstate;		/* number of states */
229100Smike_s extern ITEM **pstate;	/* pointers to the descriptions of the states */
230100Smike_s extern int *tystate;	/* contains type information about the states */
231100Smike_s extern int *defact;	/* the default action of the state */
232100Smike_s 
233100Smike_s extern int size;
234100Smike_s 
235100Smike_s 	/* lookahead set information */
236100Smike_s 
237100Smike_s extern int TBITSET;
238100Smike_s extern LOOKSETS *lkst;
239100Smike_s extern int nolook;  /* flag to turn off lookahead computations */
240100Smike_s 
241100Smike_s 	/* working set information */
242100Smike_s 
243100Smike_s extern WSET *wsets;
244100Smike_s 
245100Smike_s 	/* storage for productions */
246100Smike_s 
247100Smike_s extern int *mem0;
248100Smike_s extern int *mem;
249100Smike_s extern int *tracemem;
250100Smike_s extern int new_memsize;
251100Smike_s 
252100Smike_s 	/* storage for action table */
253100Smike_s 
254100Smike_s extern int *amem;
255100Smike_s extern int *memp;		/* next free action table position */
256100Smike_s extern int *indgo;		/* index to the stored goto table */
257100Smike_s extern int new_actsize;
258100Smike_s 
259100Smike_s 	/* temporary vector, indexable by states, terms, or ntokens */
260100Smike_s 
261100Smike_s extern int *temp1;
262100Smike_s extern int lineno; /* current line number */
263100Smike_s 
264100Smike_s 	/* statistics collection variables */
265100Smike_s 
266100Smike_s extern int zzgoent;
267100Smike_s extern int zzgobest;
268100Smike_s extern int zzacent;
269100Smike_s extern int zzexcp;
270100Smike_s extern int zzrrconf;
271100Smike_s extern int zzsrconf;
272100Smike_s 
273100Smike_s 	/* define external functions */
274100Smike_s 
275100Smike_s extern void setup(int, char *[]);
276100Smike_s extern void closure(int);
277100Smike_s extern void output(void);
278100Smike_s extern void aryfil(int *, int, int);
279100Smike_s extern void error(char *, ...);
280100Smike_s extern void warning(int, char *, ...);
281100Smike_s extern void putitem(int *, LOOKSETS *);
282100Smike_s extern void go2out(void);
283100Smike_s extern void hideprod(void);
284100Smike_s extern void callopt(void);
285100Smike_s extern void warray(wchar_t *, int *, int);
286100Smike_s extern wchar_t *symnam(int);
287100Smike_s extern wchar_t *writem(int *);
288100Smike_s extern void exp_mem(int);
289100Smike_s extern void exp_act(int **);
290100Smike_s extern int apack(int *, int);
291100Smike_s extern int state(int);
292100Smike_s extern void fprintf3(FILE *, const char *, const wchar_t *, const char *, ...);
293100Smike_s extern void error3(const char *, const wchar_t *, const char *, ...);
294100Smike_s 
295100Smike_s extern wchar_t *wscpy(wchar_t *, const wchar_t *);
296100Smike_s extern size_t wslen(const wchar_t *);
297100Smike_s extern int wscmp(const wchar_t *, const wchar_t *);
298100Smike_s 
299100Smike_s 
300100Smike_s 	/* yaccpar location */
301100Smike_s 
302100Smike_s extern char *parser;
303100Smike_s 
304100Smike_s 	/* default settings for a number of macros */
305100Smike_s 
306100Smike_s 	/* name of yacc tempfiles */
307100Smike_s 
308100Smike_s #ifndef TEMPNAME
309100Smike_s #define	TEMPNAME "yacc.tmp"
310100Smike_s #endif
311100Smike_s 
312100Smike_s #ifndef ACTNAME
313100Smike_s #define	ACTNAME "yacc.acts"
314100Smike_s #endif
315100Smike_s 
316100Smike_s #ifndef DEBUGNAME
317100Smike_s #define	DEBUGNAME "yacc.debug"
318100Smike_s #endif
319100Smike_s 
320100Smike_s 	/* command to clobber tempfiles after use */
321100Smike_s 
322100Smike_s #ifndef ZAPFILE
323100Smike_s #define	ZAPFILE(x) (void)unlink(x)
324100Smike_s #endif
325100Smike_s 
326100Smike_s #ifndef PARSER
3274538Sdamico #define	PARSER "/usr/share/lib/ccs/yaccpar"
328100Smike_s #endif
329100Smike_s 
330*6951Sab196087 /*
331*6951Sab196087  * Lint is unable to properly handle formats with wide strings
332*6951Sab196087  * (e.g. %ws) and misdiagnoses them as being malformed.
333*6951Sab196087  * This macro is used to work around that, by substituting
334*6951Sab196087  * a pointer to a null string when compiled by lint. This
335*6951Sab196087  * trick works because lint is not able to evaluate the
336*6951Sab196087  * variable.
337*6951Sab196087  *
338*6951Sab196087  * When lint is able to handle %ws, it would be appropriate
339*6951Sab196087  * to come back through and remove the use of this macro.
340*6951Sab196087  */
341*6951Sab196087 #if defined(__lint)
342*6951Sab196087 static const char *lint_ws_fmt = "";
343*6951Sab196087 #define	WSFMT(_fmt) lint_ws_fmt
344*6951Sab196087 #else
345*6951Sab196087 #define	WSFMT(_fmt) _fmt
346*6951Sab196087 #endif
347*6951Sab196087 
348100Smike_s #ifdef	__cplusplus
349100Smike_s }
350100Smike_s #endif
351100Smike_s 
352100Smike_s #endif /* _DEXTERN_H */
353