header.c revision 4538:844098db2e81
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26/*	Copyright (c) 1988 AT&T	*/
27/*	All Rights Reserved	*/
28
29#pragma ident	"%Z%%M%	%I%	%E% SMI"
30
31#include "ldefs.h"
32
33static void rhd1(void);
34static void chd1(void);
35static void chd2(void);
36static void ctail(void);
37static void rtail(void);
38
39void
40phead1(void)
41{
42	ratfor ? rhd1() : chd1();
43}
44
45static void
46chd1(void)
47{
48	if (*v_stmp == 'y')
49		(void)  fprintf(fout, "#ident\t\"lex: %s %s\"\n",
50		    (const char *)SGU_PKG, (const char *)SGU_REL);
51	if (handleeuc) {
52		fprintf(fout, "#ifndef EUC\n");
53		fprintf(fout, "#define EUC\n");
54		fprintf(fout, "#endif\n");
55		fprintf(fout, "#include <stdio.h>\n");
56		fprintf(fout, "#include <stdlib.h>\n");
57		fprintf(fout, "#include <inttypes.h>\n");
58		fprintf(fout, "#include <widec.h>\n");
59		if (widecio) { /* -w option */
60			fprintf(fout, "#define YYTEXT yytext\n");
61			fprintf(fout, "#define YYLENG yyleng\n");
62			fprintf(fout, "#ifndef __cplusplus\n");
63			fprintf(fout, "#define YYINPUT input\n");
64			fprintf(fout, "#define YYOUTPUT output\n");
65			fprintf(fout, "#else\n");
66			fprintf(fout, "#define YYINPUT lex_input\n");
67			fprintf(fout, "#define YYOUTPUT lex_output\n");
68			fprintf(fout, "#endif\n");
69			fprintf(fout, "#define YYUNPUT unput\n");
70		} else { /* -e option */
71			fprintf(fout, "#include <limits.h>\n");
72			fprintf(fout, "#include <sys/euc.h>\n");
73			fprintf(fout, "#define YYLEX_E 1\n");
74			fprintf(fout, "#define YYTEXT yywtext\n");
75			fprintf(fout, "#define YYLENG yywleng\n");
76			fprintf(fout, "#define YYINPUT yywinput\n");
77			fprintf(fout, "#define YYOUTPUT yywoutput\n");
78			fprintf(fout, "#define YYUNPUT yywunput\n");
79		}
80	} else { /* ASCII compatibility mode. */
81		fprintf(fout, "#include <stdio.h>\n");
82		fprintf(fout, "#include <stdlib.h>\n");
83		fprintf(fout, "#include <inttypes.h>\n");
84	}
85	if (ZCH > NCH)
86		(void) fprintf(fout, "# define U(x) ((x)&0377)\n");
87	else
88	(void) fprintf(fout, "# define U(x) x\n");
89	(void) fprintf(fout, "# define NLSTATE yyprevious=YYNEWLINE\n");
90	(void) fprintf(fout, "# define BEGIN yybgin = yysvec + 1 +\n");
91	(void) fprintf(fout, "# define INITIAL 0\n");
92	(void) fprintf(fout, "# define YYLERR yysvec\n");
93	(void) fprintf(fout, "# define YYSTATE (yyestate-yysvec-1)\n");
94	if (optim)
95		(void) fprintf(fout, "# define YYOPTIM 1\n");
96#ifdef DEBUG
97	(void) fprintf(fout, "# define LEXDEBUG 1\n");
98#endif
99	(void) fprintf(fout, "# ifndef YYLMAX \n");
100	(void) fprintf(fout, "# define YYLMAX BUFSIZ\n");
101	(void) fprintf(fout, "# endif \n");
102	(void) fprintf(fout, "#ifndef __cplusplus\n");
103	if (widecio)
104		(void) fprintf(fout,
105		"# define output(c) (void)putwc(c,yyout)\n");
106	else
107		(void) fprintf(fout,
108		"# define output(c) (void)putc(c,yyout)\n");
109	(void) fprintf(fout, "#else\n");
110	if (widecio)
111		(void) fprintf(fout,
112		"# define lex_output(c) (void)putwc(c,yyout)\n");
113	else
114		(void) fprintf(fout,
115		"# define lex_output(c) (void)putc(c,yyout)\n");
116	(void) fprintf(fout, "#endif\n");
117	(void) fprintf(fout,
118	"\n#if defined(__cplusplus) || defined(__STDC__)\n");
119	(void) fprintf(fout,
120	"\n#if defined(__cplusplus) && defined(__EXTERN_C__)\n");
121	(void) fprintf(fout, "extern \"C\" {\n");
122	(void) fprintf(fout, "#endif\n");
123	(void) fprintf(fout, "\tint yyback(int *, int);\n"); /* ? */
124	(void) fprintf(fout, "\tint yyinput(void);\n"); /* ? */
125	(void) fprintf(fout, "\tint yylook(void);\n"); /* ? */
126	(void) fprintf(fout, "\tvoid yyoutput(int);\n"); /* ? */
127	(void) fprintf(fout, "\tint yyracc(int);\n"); /* ? */
128	(void) fprintf(fout, "\tint yyreject(void);\n"); /* ? */
129	(void) fprintf(fout, "\tvoid yyunput(int);\n"); /* ? */
130	(void) fprintf(fout, "\tint yylex(void);\n");
131	(void) fprintf(fout, "#ifdef YYLEX_E\n");
132	(void) fprintf(fout, "\tvoid yywoutput(wchar_t);\n");
133	(void) fprintf(fout, "\twchar_t yywinput(void);\n");
134	(void) fprintf(fout, "\tvoid yywunput(wchar_t);\n");
135	(void) fprintf(fout, "#endif\n");
136
137	/* XCU4: type of yyless is int */
138	(void) fprintf(fout, "#ifndef yyless\n");
139	(void) fprintf(fout, "\tint yyless(int);\n");
140	(void) fprintf(fout, "#endif\n");
141	(void) fprintf(fout, "#ifndef yywrap\n");
142	(void) fprintf(fout, "\tint yywrap(void);\n");
143	(void) fprintf(fout, "#endif\n");
144	(void) fprintf(fout, "#ifdef LEXDEBUG\n");
145	(void) fprintf(fout, "\tvoid allprint(char);\n");
146	(void) fprintf(fout, "\tvoid sprint(char *);\n");
147	(void) fprintf(fout, "#endif\n");
148	(void) fprintf(fout,
149	"#if defined(__cplusplus) && defined(__EXTERN_C__)\n");
150	(void) fprintf(fout, "}\n");
151	(void) fprintf(fout, "#endif\n\n");
152	(void) fprintf(fout, "#ifdef __cplusplus\n");
153	(void) fprintf(fout, "extern \"C\" {\n");
154	(void) fprintf(fout, "#endif\n");
155	(void) fprintf(fout, "\tvoid exit(int);\n");
156	(void) fprintf(fout, "#ifdef __cplusplus\n");
157	(void) fprintf(fout, "}\n");
158	(void) fprintf(fout, "#endif\n\n");
159	(void) fprintf(fout, "#endif\n");
160	(void) fprintf(fout,
161	"# define unput(c)"
162	" {yytchar= (c);if(yytchar=='\\n')yylineno--;*yysptr++=yytchar;}\n");
163	(void) fprintf(fout, "# define yymore() (yymorfg=1)\n");
164	if (widecio) {
165		(void) fprintf(fout, "#ifndef __cplusplus\n");
166		(void) fprintf(fout, "%s%d%s\n",
167"# define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getwc(yyin))==",
168		    ctable['\n'],
169"?(yylineno++,yytchar):yytchar)==EOF?0:yytchar)");
170		(void) fprintf(fout, "#else\n");
171		(void) fprintf(fout, "%s%d%s\n",
172"# define lex_input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getwc(yyin))==",
173		    ctable['\n'],
174"?(yylineno++,yytchar):yytchar)==EOF?0:yytchar)");
175		(void) fprintf(fout, "#endif\n");
176		(void) fprintf(fout,
177		"# define ECHO (void)fprintf(yyout, \"%%ws\",yytext)\n");
178		(void) fprintf(fout,
179		"# define REJECT { nstr = yyreject_w(); goto yyfussy;}\n");
180		(void) fprintf(fout, "#define yyless yyless_w\n");
181		(void) fprintf(fout, "int yyleng;\n");
182
183		/*
184		 * XCU4:
185		 * If %array, yytext[] contains the token.
186		 * If %pointer, yytext is a pointer to yy_tbuf[].
187		 */
188
189		if (isArray) {
190			(void) fprintf(fout, "#define YYISARRAY\n");
191			(void) fprintf(fout, "wchar_t yytext[YYLMAX];\n");
192		} else {
193			(void) fprintf(fout, "wchar_t yy_tbuf[YYLMAX];\n");
194			(void) fprintf(fout, "wchar_t * yytext = yy_tbuf;\n");
195			(void) fprintf(fout, "int yytextsz = YYLMAX;\n");
196			(void) fprintf(fout, "#ifndef YYTEXTSZINC\n");
197			(void) fprintf(fout, "#define YYTEXTSZINC 100\n");
198			(void) fprintf(fout, "#endif\n");
199		}
200	} else {
201		(void) fprintf(fout, "#ifndef __cplusplus\n");
202		(void) fprintf(fout, "%s%d%s\n",
203"# define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(yyin))==",
204		    ctable['\n'],
205"?(yylineno++,yytchar):yytchar)==EOF?0:yytchar)");
206		(void) fprintf(fout, "#else\n");
207		(void) fprintf(fout, "%s%d%s\n",
208"# define lex_input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(yyin))==",
209		    ctable['\n'],
210"?(yylineno++,yytchar):yytchar)==EOF?0:yytchar)");
211		(void) fprintf(fout, "#endif\n");
212		fprintf(fout, "#define ECHO fprintf(yyout, \"%%s\",yytext)\n");
213		if (handleeuc) {
214			(void) fprintf(fout,
215"# define REJECT { nstr = yyreject_e(); goto yyfussy;}\n");
216			(void) fprintf(fout, "int yyleng;\n");
217			(void) fprintf(fout, "size_t yywleng;\n");
218			/*
219			 * XCU4:
220			 * If %array, yytext[] contains the token.
221			 * If %pointer, yytext is a pointer to yy_tbuf[].
222			 */
223			if (isArray) {
224				(void) fprintf(fout, "#define YYISARRAY\n");
225				(void) fprintf(fout,
226				"unsigned char yytext[YYLMAX*MB_LEN_MAX];\n");
227				(void) fprintf(fout,
228				"wchar_t yywtext[YYLMAX];\n");
229			} else {
230				(void) fprintf(fout,
231				"wchar_t yy_twbuf[YYLMAX];\n");
232				(void) fprintf(fout,
233				"wchar_t yy_tbuf[YYLMAX*MB_LEN_MAX];\n");
234				(void) fprintf(fout,
235				"unsigned char * yytext ="
236				"(unsigned char *)yy_tbuf;\n");
237				(void) fprintf(fout,
238				"wchar_t * yywtext = yy_twbuf;\n");
239				(void) fprintf(fout,
240				    "int yytextsz = YYLMAX;\n");
241				(void) fprintf(fout, "#ifndef YYTEXTSZINC\n");
242				(void) fprintf(fout,
243				    "#define YYTEXTSZINC 100\n");
244				(void) fprintf(fout, "#endif\n");
245			}
246		} else {
247			(void) fprintf(fout,
248"# define REJECT { nstr = yyreject(); goto yyfussy;}\n");
249			(void) fprintf(fout, "int yyleng;\n");
250
251			/*
252			 * XCU4:
253			 * If %array, yytext[] contains the token.
254			 * If %pointer, yytext is a pointer to yy_tbuf[].
255			 */
256			if (isArray) {
257				(void) fprintf(fout, "#define YYISARRAY\n");
258				(void) fprintf(fout, "char yytext[YYLMAX];\n");
259			} else {
260				(void) fprintf(fout, "char yy_tbuf[YYLMAX];\n");
261				(void) fprintf(fout,
262				"char * yytext = yy_tbuf;\n");
263				(void) fprintf(fout,
264				    "int yytextsz = YYLMAX;\n");
265				(void) fprintf(fout, "#ifndef YYTEXTSZINC\n");
266				(void) fprintf(fout,
267				    "#define YYTEXTSZINC 100\n");
268				(void) fprintf(fout, "#endif\n");
269			}
270		}
271	}
272	(void) fprintf(fout, "int yymorfg;\n");
273	if (handleeuc)
274		(void) fprintf(fout, "extern wchar_t *yysptr, yysbuf[];\n");
275	else
276		(void) fprintf(fout, "extern char *yysptr, yysbuf[];\n");
277	(void) fprintf(fout, "int yytchar;\n");
278	(void) fprintf(fout, "FILE *yyin = {stdin}, *yyout = {stdout};\n");
279	(void) fprintf(fout, "extern int yylineno;\n");
280	(void) fprintf(fout, "struct yysvf { \n");
281	(void) fprintf(fout, "\tstruct yywork *yystoff;\n");
282	(void) fprintf(fout, "\tstruct yysvf *yyother;\n");
283	(void) fprintf(fout, "\tint *yystops;};\n");
284	(void) fprintf(fout, "struct yysvf *yyestate;\n");
285	(void) fprintf(fout, "extern struct yysvf yysvec[], *yybgin;\n");
286}
287
288static void
289rhd1(void)
290{
291	(void) fprintf(fout, "integer function yylex(dummy)\n");
292	(void) fprintf(fout, "define YYLMAX 200\n");
293	(void) fprintf(fout, "define ECHO call yyecho(yytext,yyleng)\n");
294	(void) fprintf(fout,
295	"define REJECT nstr = yyrjct(yytext,yyleng);goto 30998\n");
296	(void) fprintf(fout, "integer nstr,yylook,yywrap\n");
297	(void) fprintf(fout, "integer yyleng, yytext(YYLMAX)\n");
298	(void) fprintf(fout, "common /yyxel/ yyleng, yytext\n");
299	(void) fprintf(fout,
300	"common /yyldat/ yyfnd, yymorf, yyprev, yybgin, yylsp, yylsta\n");
301	(void) fprintf(fout,
302	"integer yyfnd, yymorf, yyprev, yybgin, yylsp, yylsta(YYLMAX)\n");
303	(void) fprintf(fout, "for(;;){\n");
304	(void) fprintf(fout, "\t30999 nstr = yylook(dummy)\n");
305	(void) fprintf(fout, "\tgoto 30998\n");
306	(void) fprintf(fout, "\t30000 k = yywrap(dummy)\n");
307	(void) fprintf(fout, "\tif(k .ne. 0){\n");
308	(void) fprintf(fout, "\tyylex=0; return; }\n");
309	(void) fprintf(fout, "\t\telse goto 30998\n");
310}
311
312void
313phead2(void)
314{
315	if (!ratfor)
316		chd2();
317}
318
319static void
320chd2(void)
321{
322	(void) fprintf(fout, "#ifdef __cplusplus\n");
323	(void) fprintf(fout,
324	"/* to avoid CC and lint complaining yyfussy not being used ...*/\n");
325	(void) fprintf(fout, "static int __lex_hack = 0;\n");
326	(void) fprintf(fout, "if (__lex_hack) goto yyfussy;\n");
327	(void) fprintf(fout, "#endif\n");
328	(void) fprintf(fout, "while((nstr = yylook()) >= 0)\n");
329	(void) fprintf(fout, "yyfussy: switch(nstr){\n");
330	(void) fprintf(fout, "case 0:\n");
331	(void) fprintf(fout, "if(yywrap()) return(0); break;\n");
332}
333
334void
335ptail(void)
336{
337	if (!pflag)
338		ratfor ? rtail() : ctail();
339	pflag = 1;
340}
341
342static void
343ctail(void)
344{
345	(void) fprintf(fout, "case -1:\nbreak;\n");		/* for reject */
346	(void) fprintf(fout, "default:\n");
347	(void) fprintf(fout,
348	"(void)fprintf(yyout,\"bad switch yylook %%d\",nstr);\n");
349	(void) fprintf(fout, "} return(0); }\n");
350	(void) fprintf(fout, "/* end of yylex */\n");
351}
352
353static void
354rtail(void)
355{
356	int i;
357	(void) fprintf(fout,
358	"\n30998 if(nstr .lt. 0 .or. nstr .gt. %d)goto 30999\n", casecount);
359	(void) fprintf(fout, "nstr = nstr + 1\n");
360	(void) fprintf(fout, "goto(\n");
361	for (i = 0; i < casecount; i++)
362		(void) fprintf(fout, "%d,\n", 30000+i);
363	(void) fprintf(fout, "30999),nstr\n");
364	(void) fprintf(fout, "30997 continue\n");
365	(void) fprintf(fout, "}\nend\n");
366}
367
368void
369statistics(void)
370{
371	(void) fprintf(errorf,
372"%d/%d nodes(%%e), %d/%d positions(%%p), %d/%d (%%n), %ld transitions,\n",
373	    tptr, treesize, nxtpos-positions, maxpos, stnum + 1, nstates,
374	    rcount);
375	(void) fprintf(errorf,
376	"%d/%d packed char classes(%%k), ", pcptr-pchar, pchlen);
377	if (optim)
378		(void) fprintf(errorf,
379		" %d/%d packed transitions(%%a), ", nptr, ntrans);
380	(void) fprintf(errorf, " %d/%d output slots(%%o)", yytop, outsize);
381	(void) putc('\n', errorf);
382}
383