xref: /freebsd/contrib/flex/src/gen.c (revision 7e38239042df09edbbdc443ccb4825f9155c6bb7)
1*7e382390SJung-uk Kim /* gen - actual generation (writing) of flex scanners */
2*7e382390SJung-uk Kim 
3*7e382390SJung-uk Kim /*  Copyright (c) 1990 The Regents of the University of California. */
4*7e382390SJung-uk Kim /*  All rights reserved. */
5*7e382390SJung-uk Kim 
6*7e382390SJung-uk Kim /*  This code is derived from software contributed to Berkeley by */
7*7e382390SJung-uk Kim /*  Vern Paxson. */
8*7e382390SJung-uk Kim 
9*7e382390SJung-uk Kim /*  The United States Government has rights in this work pursuant */
10*7e382390SJung-uk Kim /*  to contract no. DE-AC03-76SF00098 between the United States */
11*7e382390SJung-uk Kim /*  Department of Energy and the University of California. */
12*7e382390SJung-uk Kim 
13*7e382390SJung-uk Kim /*  This file is part of flex. */
14*7e382390SJung-uk Kim 
15*7e382390SJung-uk Kim /*  Redistribution and use in source and binary forms, with or without */
16*7e382390SJung-uk Kim /*  modification, are permitted provided that the following conditions */
17*7e382390SJung-uk Kim /*  are met: */
18*7e382390SJung-uk Kim 
19*7e382390SJung-uk Kim /*  1. Redistributions of source code must retain the above copyright */
20*7e382390SJung-uk Kim /*     notice, this list of conditions and the following disclaimer. */
21*7e382390SJung-uk Kim /*  2. Redistributions in binary form must reproduce the above copyright */
22*7e382390SJung-uk Kim /*     notice, this list of conditions and the following disclaimer in the */
23*7e382390SJung-uk Kim /*     documentation and/or other materials provided with the distribution. */
24*7e382390SJung-uk Kim 
25*7e382390SJung-uk Kim /*  Neither the name of the University nor the names of its contributors */
26*7e382390SJung-uk Kim /*  may be used to endorse or promote products derived from this software */
27*7e382390SJung-uk Kim /*  without specific prior written permission. */
28*7e382390SJung-uk Kim 
29*7e382390SJung-uk Kim /*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */
30*7e382390SJung-uk Kim /*  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
31*7e382390SJung-uk Kim /*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */
32*7e382390SJung-uk Kim /*  PURPOSE. */
33*7e382390SJung-uk Kim 
34*7e382390SJung-uk Kim #include "flexdef.h"
35*7e382390SJung-uk Kim #include "tables.h"
36*7e382390SJung-uk Kim 
37*7e382390SJung-uk Kim 
38*7e382390SJung-uk Kim /* declare functions that have forward references */
39*7e382390SJung-uk Kim 
40*7e382390SJung-uk Kim void	genecs(void);
41*7e382390SJung-uk Kim 
42*7e382390SJung-uk Kim 
43*7e382390SJung-uk Kim static int indent_level = 0;	/* each level is 8 spaces */
44*7e382390SJung-uk Kim 
45*7e382390SJung-uk Kim #define set_indent(indent_val) indent_level = indent_val
46*7e382390SJung-uk Kim 
47*7e382390SJung-uk Kim /* Almost everything is done in terms of arrays starting at 1, so provide
48*7e382390SJung-uk Kim  * a null entry for the zero element of all C arrays.  (The exception
49*7e382390SJung-uk Kim  * to this is that the fast table representation generally uses the
50*7e382390SJung-uk Kim  * 0 elements of its arrays, too.)
51*7e382390SJung-uk Kim  */
52*7e382390SJung-uk Kim 
get_int16_decl(void)53*7e382390SJung-uk Kim static const char *get_int16_decl (void)
54*7e382390SJung-uk Kim {
55*7e382390SJung-uk Kim 	return (gentables)
56*7e382390SJung-uk Kim 		? "static const flex_int16_t %s[%d] =\n    {   0,\n"
57*7e382390SJung-uk Kim 		: "static const flex_int16_t * %s = 0;\n";
58*7e382390SJung-uk Kim }
59*7e382390SJung-uk Kim 
60*7e382390SJung-uk Kim 
get_int32_decl(void)61*7e382390SJung-uk Kim static const char *get_int32_decl (void)
62*7e382390SJung-uk Kim {
63*7e382390SJung-uk Kim 	return (gentables)
64*7e382390SJung-uk Kim 		? "static const flex_int32_t %s[%d] =\n    {   0,\n"
65*7e382390SJung-uk Kim 		: "static const flex_int32_t * %s = 0;\n";
66*7e382390SJung-uk Kim }
67*7e382390SJung-uk Kim 
get_state_decl(void)68*7e382390SJung-uk Kim static const char *get_state_decl (void)
69*7e382390SJung-uk Kim {
70*7e382390SJung-uk Kim 	return (gentables)
71*7e382390SJung-uk Kim 		? "static const yy_state_type %s[%d] =\n    {   0,\n"
72*7e382390SJung-uk Kim 		: "static const yy_state_type * %s = 0;\n";
73*7e382390SJung-uk Kim }
74*7e382390SJung-uk Kim 
get_yy_char_decl(void)75*7e382390SJung-uk Kim static const char *get_yy_char_decl (void)
76*7e382390SJung-uk Kim {
77*7e382390SJung-uk Kim 	return (gentables)
78*7e382390SJung-uk Kim 		? "static const YY_CHAR %s[%d] =\n    {   0,\n"
79*7e382390SJung-uk Kim 		: "static const YY_CHAR * %s = 0;\n";
80*7e382390SJung-uk Kim }
81*7e382390SJung-uk Kim 
82*7e382390SJung-uk Kim /* Indent to the current level. */
83*7e382390SJung-uk Kim 
do_indent(void)84*7e382390SJung-uk Kim void do_indent (void)
85*7e382390SJung-uk Kim {
86*7e382390SJung-uk Kim 	int i = indent_level * 8;
87*7e382390SJung-uk Kim 
88*7e382390SJung-uk Kim 	while (i >= 8) {
89*7e382390SJung-uk Kim 		outc ('\t');
90*7e382390SJung-uk Kim 		i -= 8;
91*7e382390SJung-uk Kim 	}
92*7e382390SJung-uk Kim 
93*7e382390SJung-uk Kim 	while (i > 0) {
94*7e382390SJung-uk Kim 		outc (' ');
95*7e382390SJung-uk Kim 		--i;
96*7e382390SJung-uk Kim 	}
97*7e382390SJung-uk Kim }
98*7e382390SJung-uk Kim 
99*7e382390SJung-uk Kim 
100*7e382390SJung-uk Kim /** Make the table for possible eol matches.
101*7e382390SJung-uk Kim  *  @return the newly allocated rule_can_match_eol table
102*7e382390SJung-uk Kim  */
mkeoltbl(void)103*7e382390SJung-uk Kim static struct yytbl_data *mkeoltbl (void)
104*7e382390SJung-uk Kim {
105*7e382390SJung-uk Kim 	int     i;
106*7e382390SJung-uk Kim 	flex_int8_t *tdata = 0;
107*7e382390SJung-uk Kim 	struct yytbl_data *tbl;
108*7e382390SJung-uk Kim 
109*7e382390SJung-uk Kim 	tbl = calloc(1, sizeof (struct yytbl_data));
110*7e382390SJung-uk Kim 	yytbl_data_init (tbl, YYTD_ID_RULE_CAN_MATCH_EOL);
111*7e382390SJung-uk Kim 	tbl->td_flags = YYTD_DATA8;
112*7e382390SJung-uk Kim 	tbl->td_lolen = (flex_uint32_t) (num_rules + 1);
113*7e382390SJung-uk Kim 	tbl->td_data = tdata =
114*7e382390SJung-uk Kim 		calloc(tbl->td_lolen, sizeof (flex_int8_t));
115*7e382390SJung-uk Kim 
116*7e382390SJung-uk Kim 	for (i = 1; i <= num_rules; i++)
117*7e382390SJung-uk Kim 		tdata[i] = rule_has_nl[i] ? 1 : 0;
118*7e382390SJung-uk Kim 
119*7e382390SJung-uk Kim 	buf_prints (&yydmap_buf,
120*7e382390SJung-uk Kim 		    "\t{YYTD_ID_RULE_CAN_MATCH_EOL, (void**)&yy_rule_can_match_eol, sizeof(%s)},\n",
121*7e382390SJung-uk Kim 		    "flex_int32_t");
122*7e382390SJung-uk Kim 	return tbl;
123*7e382390SJung-uk Kim }
124*7e382390SJung-uk Kim 
125*7e382390SJung-uk Kim /* Generate the table for possible eol matches. */
geneoltbl(void)126*7e382390SJung-uk Kim static void geneoltbl (void)
127*7e382390SJung-uk Kim {
128*7e382390SJung-uk Kim 	int     i;
129*7e382390SJung-uk Kim 
130*7e382390SJung-uk Kim 	outn ("m4_ifdef( [[M4_YY_USE_LINENO]],[[");
131*7e382390SJung-uk Kim 	outn ("/* Table of booleans, true if rule could match eol. */");
132*7e382390SJung-uk Kim 	out_str_dec (get_int32_decl (), "yy_rule_can_match_eol",
133*7e382390SJung-uk Kim 		     num_rules + 1);
134*7e382390SJung-uk Kim 
135*7e382390SJung-uk Kim 	if (gentables) {
136*7e382390SJung-uk Kim 		for (i = 1; i <= num_rules; i++) {
137*7e382390SJung-uk Kim 			out_dec ("%d, ", rule_has_nl[i] ? 1 : 0);
138*7e382390SJung-uk Kim 			/* format nicely, 20 numbers per line. */
139*7e382390SJung-uk Kim 			if ((i % 20) == 19)
140*7e382390SJung-uk Kim 				out ("\n    ");
141*7e382390SJung-uk Kim 		}
142*7e382390SJung-uk Kim 		out ("    };\n");
143*7e382390SJung-uk Kim 	}
144*7e382390SJung-uk Kim 	outn ("]])");
145*7e382390SJung-uk Kim }
146*7e382390SJung-uk Kim 
147*7e382390SJung-uk Kim 
148*7e382390SJung-uk Kim /* Generate the code to keep backing-up information. */
149*7e382390SJung-uk Kim 
gen_backing_up(void)150*7e382390SJung-uk Kim void gen_backing_up (void)
151*7e382390SJung-uk Kim {
152*7e382390SJung-uk Kim 	if (reject || num_backing_up == 0)
153*7e382390SJung-uk Kim 		return;
154*7e382390SJung-uk Kim 
155*7e382390SJung-uk Kim 	if (fullspd)
156*7e382390SJung-uk Kim 		indent_puts ("if ( yy_current_state[-1].yy_nxt )");
157*7e382390SJung-uk Kim 	else
158*7e382390SJung-uk Kim 		indent_puts ("if ( yy_accept[yy_current_state] )");
159*7e382390SJung-uk Kim 
160*7e382390SJung-uk Kim 	++indent_level;
161*7e382390SJung-uk Kim 	indent_puts ("{");
162*7e382390SJung-uk Kim 	indent_puts ("YY_G(yy_last_accepting_state) = yy_current_state;");
163*7e382390SJung-uk Kim 	indent_puts ("YY_G(yy_last_accepting_cpos) = yy_cp;");
164*7e382390SJung-uk Kim 	indent_puts ("}");
165*7e382390SJung-uk Kim 	--indent_level;
166*7e382390SJung-uk Kim }
167*7e382390SJung-uk Kim 
168*7e382390SJung-uk Kim 
169*7e382390SJung-uk Kim /* Generate the code to perform the backing up. */
170*7e382390SJung-uk Kim 
gen_bu_action(void)171*7e382390SJung-uk Kim void gen_bu_action (void)
172*7e382390SJung-uk Kim {
173*7e382390SJung-uk Kim 	if (reject || num_backing_up == 0)
174*7e382390SJung-uk Kim 		return;
175*7e382390SJung-uk Kim 
176*7e382390SJung-uk Kim 	set_indent (3);
177*7e382390SJung-uk Kim 
178*7e382390SJung-uk Kim 	indent_puts ("case 0: /* must back up */");
179*7e382390SJung-uk Kim 	indent_puts ("/* undo the effects of YY_DO_BEFORE_ACTION */");
180*7e382390SJung-uk Kim 	indent_puts ("*yy_cp = YY_G(yy_hold_char);");
181*7e382390SJung-uk Kim 
182*7e382390SJung-uk Kim 	if (fullspd || fulltbl)
183*7e382390SJung-uk Kim 		indent_puts ("yy_cp = YY_G(yy_last_accepting_cpos) + 1;");
184*7e382390SJung-uk Kim 	else
185*7e382390SJung-uk Kim 		/* Backing-up info for compressed tables is taken \after/
186*7e382390SJung-uk Kim 		 * yy_cp has been incremented for the next state.
187*7e382390SJung-uk Kim 		 */
188*7e382390SJung-uk Kim 		indent_puts ("yy_cp = YY_G(yy_last_accepting_cpos);");
189*7e382390SJung-uk Kim 
190*7e382390SJung-uk Kim 	indent_puts ("yy_current_state = YY_G(yy_last_accepting_state);");
191*7e382390SJung-uk Kim 	indent_puts ("goto yy_find_action;");
192*7e382390SJung-uk Kim 	outc ('\n');
193*7e382390SJung-uk Kim 
194*7e382390SJung-uk Kim 	set_indent (0);
195*7e382390SJung-uk Kim }
196*7e382390SJung-uk Kim 
197*7e382390SJung-uk Kim /** mkctbl - make full speed compressed transition table
198*7e382390SJung-uk Kim  * This is an array of structs; each struct a pair of integers.
199*7e382390SJung-uk Kim  * You should call mkssltbl() immediately after this.
200*7e382390SJung-uk Kim  * Then, I think, mkecstbl(). Arrrg.
201*7e382390SJung-uk Kim  * @return the newly allocated trans table
202*7e382390SJung-uk Kim  */
203*7e382390SJung-uk Kim 
mkctbl(void)204*7e382390SJung-uk Kim static struct yytbl_data *mkctbl (void)
205*7e382390SJung-uk Kim {
206*7e382390SJung-uk Kim 	int i;
207*7e382390SJung-uk Kim 	struct yytbl_data *tbl = 0;
208*7e382390SJung-uk Kim 	flex_int32_t *tdata = 0, curr = 0;
209*7e382390SJung-uk Kim 	int     end_of_buffer_action = num_rules + 1;
210*7e382390SJung-uk Kim 
211*7e382390SJung-uk Kim 	buf_prints (&yydmap_buf,
212*7e382390SJung-uk Kim 		    "\t{YYTD_ID_TRANSITION, (void**)&yy_transition, sizeof(%s)},\n",
213*7e382390SJung-uk Kim 		    ((tblend + numecs + 1) >= INT16_MAX
214*7e382390SJung-uk Kim 		     || long_align) ? "flex_int32_t" : "flex_int16_t");
215*7e382390SJung-uk Kim 
216*7e382390SJung-uk Kim 	tbl = calloc(1, sizeof (struct yytbl_data));
217*7e382390SJung-uk Kim 	yytbl_data_init (tbl, YYTD_ID_TRANSITION);
218*7e382390SJung-uk Kim 	tbl->td_flags = YYTD_DATA32 | YYTD_STRUCT;
219*7e382390SJung-uk Kim 	tbl->td_hilen = 0;
220*7e382390SJung-uk Kim 	tbl->td_lolen = (flex_uint32_t) (tblend + numecs + 1);	/* number of structs */
221*7e382390SJung-uk Kim 
222*7e382390SJung-uk Kim 	tbl->td_data = tdata =
223*7e382390SJung-uk Kim 		calloc(tbl->td_lolen * 2, sizeof (flex_int32_t));
224*7e382390SJung-uk Kim 
225*7e382390SJung-uk Kim 	/* We want the transition to be represented as the offset to the
226*7e382390SJung-uk Kim 	 * next state, not the actual state number, which is what it currently
227*7e382390SJung-uk Kim 	 * is.  The offset is base[nxt[i]] - (base of current state)].  That's
228*7e382390SJung-uk Kim 	 * just the difference between the starting points of the two involved
229*7e382390SJung-uk Kim 	 * states (to - from).
230*7e382390SJung-uk Kim 	 *
231*7e382390SJung-uk Kim 	 * First, though, we need to find some way to put in our end-of-buffer
232*7e382390SJung-uk Kim 	 * flags and states.  We do this by making a state with absolutely no
233*7e382390SJung-uk Kim 	 * transitions.  We put it at the end of the table.
234*7e382390SJung-uk Kim 	 */
235*7e382390SJung-uk Kim 
236*7e382390SJung-uk Kim 	/* We need to have room in nxt/chk for two more slots: One for the
237*7e382390SJung-uk Kim 	 * action and one for the end-of-buffer transition.  We now *assume*
238*7e382390SJung-uk Kim 	 * that we're guaranteed the only character we'll try to index this
239*7e382390SJung-uk Kim 	 * nxt/chk pair with is EOB, i.e., 0, so we don't have to make sure
240*7e382390SJung-uk Kim 	 * there's room for jam entries for other characters.
241*7e382390SJung-uk Kim 	 */
242*7e382390SJung-uk Kim 
243*7e382390SJung-uk Kim 	while (tblend + 2 >= current_max_xpairs)
244*7e382390SJung-uk Kim 		expand_nxt_chk ();
245*7e382390SJung-uk Kim 
246*7e382390SJung-uk Kim 	while (lastdfa + 1 >= current_max_dfas)
247*7e382390SJung-uk Kim 		increase_max_dfas ();
248*7e382390SJung-uk Kim 
249*7e382390SJung-uk Kim 	base[lastdfa + 1] = tblend + 2;
250*7e382390SJung-uk Kim 	nxt[tblend + 1] = end_of_buffer_action;
251*7e382390SJung-uk Kim 	chk[tblend + 1] = numecs + 1;
252*7e382390SJung-uk Kim 	chk[tblend + 2] = 1;	/* anything but EOB */
253*7e382390SJung-uk Kim 
254*7e382390SJung-uk Kim 	/* So that "make test" won't show arb. differences. */
255*7e382390SJung-uk Kim 	nxt[tblend + 2] = 0;
256*7e382390SJung-uk Kim 
257*7e382390SJung-uk Kim 	/* Make sure every state has an end-of-buffer transition and an
258*7e382390SJung-uk Kim 	 * action #.
259*7e382390SJung-uk Kim 	 */
260*7e382390SJung-uk Kim 	for (i = 0; i <= lastdfa; ++i) {
261*7e382390SJung-uk Kim 		int     anum = dfaacc[i].dfaacc_state;
262*7e382390SJung-uk Kim 		int     offset = base[i];
263*7e382390SJung-uk Kim 
264*7e382390SJung-uk Kim 		chk[offset] = EOB_POSITION;
265*7e382390SJung-uk Kim 		chk[offset - 1] = ACTION_POSITION;
266*7e382390SJung-uk Kim 		nxt[offset - 1] = anum;	/* action number */
267*7e382390SJung-uk Kim 	}
268*7e382390SJung-uk Kim 
269*7e382390SJung-uk Kim 	for (i = 0; i <= tblend; ++i) {
270*7e382390SJung-uk Kim 		if (chk[i] == EOB_POSITION) {
271*7e382390SJung-uk Kim 			tdata[curr++] = 0;
272*7e382390SJung-uk Kim 			tdata[curr++] = base[lastdfa + 1] - i;
273*7e382390SJung-uk Kim 		}
274*7e382390SJung-uk Kim 
275*7e382390SJung-uk Kim 		else if (chk[i] == ACTION_POSITION) {
276*7e382390SJung-uk Kim 			tdata[curr++] = 0;
277*7e382390SJung-uk Kim 			tdata[curr++] = nxt[i];
278*7e382390SJung-uk Kim 		}
279*7e382390SJung-uk Kim 
280*7e382390SJung-uk Kim 		else if (chk[i] > numecs || chk[i] == 0) {
281*7e382390SJung-uk Kim 			tdata[curr++] = 0;
282*7e382390SJung-uk Kim 			tdata[curr++] = 0;
283*7e382390SJung-uk Kim 		}
284*7e382390SJung-uk Kim 		else {		/* verify, transition */
285*7e382390SJung-uk Kim 
286*7e382390SJung-uk Kim 			tdata[curr++] = chk[i];
287*7e382390SJung-uk Kim 			tdata[curr++] = base[nxt[i]] - (i - chk[i]);
288*7e382390SJung-uk Kim 		}
289*7e382390SJung-uk Kim 	}
290*7e382390SJung-uk Kim 
291*7e382390SJung-uk Kim 
292*7e382390SJung-uk Kim 	/* Here's the final, end-of-buffer state. */
293*7e382390SJung-uk Kim 	tdata[curr++] = chk[tblend + 1];
294*7e382390SJung-uk Kim 	tdata[curr++] = nxt[tblend + 1];
295*7e382390SJung-uk Kim 
296*7e382390SJung-uk Kim 	tdata[curr++] = chk[tblend + 2];
297*7e382390SJung-uk Kim 	tdata[curr++] = nxt[tblend + 2];
298*7e382390SJung-uk Kim 
299*7e382390SJung-uk Kim 	return tbl;
300*7e382390SJung-uk Kim }
301*7e382390SJung-uk Kim 
302*7e382390SJung-uk Kim 
303*7e382390SJung-uk Kim /** Make start_state_list table.
304*7e382390SJung-uk Kim  *  @return the newly allocated start_state_list table
305*7e382390SJung-uk Kim  */
mkssltbl(void)306*7e382390SJung-uk Kim static struct yytbl_data *mkssltbl (void)
307*7e382390SJung-uk Kim {
308*7e382390SJung-uk Kim 	struct yytbl_data *tbl = 0;
309*7e382390SJung-uk Kim 	flex_int32_t *tdata = 0;
310*7e382390SJung-uk Kim 	flex_int32_t i;
311*7e382390SJung-uk Kim 
312*7e382390SJung-uk Kim 	tbl = calloc(1, sizeof (struct yytbl_data));
313*7e382390SJung-uk Kim 	yytbl_data_init (tbl, YYTD_ID_START_STATE_LIST);
314*7e382390SJung-uk Kim 	tbl->td_flags = YYTD_DATA32 | YYTD_PTRANS;
315*7e382390SJung-uk Kim 	tbl->td_hilen = 0;
316*7e382390SJung-uk Kim 	tbl->td_lolen = (flex_uint32_t) (lastsc * 2 + 1);
317*7e382390SJung-uk Kim 
318*7e382390SJung-uk Kim 	tbl->td_data = tdata =
319*7e382390SJung-uk Kim 		calloc(tbl->td_lolen, sizeof (flex_int32_t));
320*7e382390SJung-uk Kim 
321*7e382390SJung-uk Kim 	for (i = 0; i <= lastsc * 2; ++i)
322*7e382390SJung-uk Kim 		tdata[i] = base[i];
323*7e382390SJung-uk Kim 
324*7e382390SJung-uk Kim 	buf_prints (&yydmap_buf,
325*7e382390SJung-uk Kim 		    "\t{YYTD_ID_START_STATE_LIST, (void**)&yy_start_state_list, sizeof(%s)},\n",
326*7e382390SJung-uk Kim 		    "struct yy_trans_info*");
327*7e382390SJung-uk Kim 
328*7e382390SJung-uk Kim 	return tbl;
329*7e382390SJung-uk Kim }
330*7e382390SJung-uk Kim 
331*7e382390SJung-uk Kim 
332*7e382390SJung-uk Kim 
333*7e382390SJung-uk Kim /* genctbl - generates full speed compressed transition table */
334*7e382390SJung-uk Kim 
genctbl(void)335*7e382390SJung-uk Kim void genctbl (void)
336*7e382390SJung-uk Kim {
337*7e382390SJung-uk Kim 	int i;
338*7e382390SJung-uk Kim 	int     end_of_buffer_action = num_rules + 1;
339*7e382390SJung-uk Kim 
340*7e382390SJung-uk Kim 	/* Table of verify for transition and offset to next state. */
341*7e382390SJung-uk Kim 	if (gentables)
342*7e382390SJung-uk Kim 		out_dec ("static const struct yy_trans_info yy_transition[%d] =\n    {\n", tblend + numecs + 1);
343*7e382390SJung-uk Kim 	else
344*7e382390SJung-uk Kim 		outn ("static const struct yy_trans_info *yy_transition = 0;");
345*7e382390SJung-uk Kim 
346*7e382390SJung-uk Kim 	/* We want the transition to be represented as the offset to the
347*7e382390SJung-uk Kim 	 * next state, not the actual state number, which is what it currently
348*7e382390SJung-uk Kim 	 * is.  The offset is base[nxt[i]] - (base of current state)].  That's
349*7e382390SJung-uk Kim 	 * just the difference between the starting points of the two involved
350*7e382390SJung-uk Kim 	 * states (to - from).
351*7e382390SJung-uk Kim 	 *
352*7e382390SJung-uk Kim 	 * First, though, we need to find some way to put in our end-of-buffer
353*7e382390SJung-uk Kim 	 * flags and states.  We do this by making a state with absolutely no
354*7e382390SJung-uk Kim 	 * transitions.  We put it at the end of the table.
355*7e382390SJung-uk Kim 	 */
356*7e382390SJung-uk Kim 
357*7e382390SJung-uk Kim 	/* We need to have room in nxt/chk for two more slots: One for the
358*7e382390SJung-uk Kim 	 * action and one for the end-of-buffer transition.  We now *assume*
359*7e382390SJung-uk Kim 	 * that we're guaranteed the only character we'll try to index this
360*7e382390SJung-uk Kim 	 * nxt/chk pair with is EOB, i.e., 0, so we don't have to make sure
361*7e382390SJung-uk Kim 	 * there's room for jam entries for other characters.
362*7e382390SJung-uk Kim 	 */
363*7e382390SJung-uk Kim 
364*7e382390SJung-uk Kim 	while (tblend + 2 >= current_max_xpairs)
365*7e382390SJung-uk Kim 		expand_nxt_chk ();
366*7e382390SJung-uk Kim 
367*7e382390SJung-uk Kim 	while (lastdfa + 1 >= current_max_dfas)
368*7e382390SJung-uk Kim 		increase_max_dfas ();
369*7e382390SJung-uk Kim 
370*7e382390SJung-uk Kim 	base[lastdfa + 1] = tblend + 2;
371*7e382390SJung-uk Kim 	nxt[tblend + 1] = end_of_buffer_action;
372*7e382390SJung-uk Kim 	chk[tblend + 1] = numecs + 1;
373*7e382390SJung-uk Kim 	chk[tblend + 2] = 1;	/* anything but EOB */
374*7e382390SJung-uk Kim 
375*7e382390SJung-uk Kim 	/* So that "make test" won't show arb. differences. */
376*7e382390SJung-uk Kim 	nxt[tblend + 2] = 0;
377*7e382390SJung-uk Kim 
378*7e382390SJung-uk Kim 	/* Make sure every state has an end-of-buffer transition and an
379*7e382390SJung-uk Kim 	 * action #.
380*7e382390SJung-uk Kim 	 */
381*7e382390SJung-uk Kim 	for (i = 0; i <= lastdfa; ++i) {
382*7e382390SJung-uk Kim 		int     anum = dfaacc[i].dfaacc_state;
383*7e382390SJung-uk Kim 		int     offset = base[i];
384*7e382390SJung-uk Kim 
385*7e382390SJung-uk Kim 		chk[offset] = EOB_POSITION;
386*7e382390SJung-uk Kim 		chk[offset - 1] = ACTION_POSITION;
387*7e382390SJung-uk Kim 		nxt[offset - 1] = anum;	/* action number */
388*7e382390SJung-uk Kim 	}
389*7e382390SJung-uk Kim 
390*7e382390SJung-uk Kim 	for (i = 0; i <= tblend; ++i) {
391*7e382390SJung-uk Kim 		if (chk[i] == EOB_POSITION)
392*7e382390SJung-uk Kim 			transition_struct_out (0, base[lastdfa + 1] - i);
393*7e382390SJung-uk Kim 
394*7e382390SJung-uk Kim 		else if (chk[i] == ACTION_POSITION)
395*7e382390SJung-uk Kim 			transition_struct_out (0, nxt[i]);
396*7e382390SJung-uk Kim 
397*7e382390SJung-uk Kim 		else if (chk[i] > numecs || chk[i] == 0)
398*7e382390SJung-uk Kim 			transition_struct_out (0, 0);	/* unused slot */
399*7e382390SJung-uk Kim 
400*7e382390SJung-uk Kim 		else		/* verify, transition */
401*7e382390SJung-uk Kim 			transition_struct_out (chk[i],
402*7e382390SJung-uk Kim 					       base[nxt[i]] - (i -
403*7e382390SJung-uk Kim 							       chk[i]));
404*7e382390SJung-uk Kim 	}
405*7e382390SJung-uk Kim 
406*7e382390SJung-uk Kim 
407*7e382390SJung-uk Kim 	/* Here's the final, end-of-buffer state. */
408*7e382390SJung-uk Kim 	transition_struct_out (chk[tblend + 1], nxt[tblend + 1]);
409*7e382390SJung-uk Kim 	transition_struct_out (chk[tblend + 2], nxt[tblend + 2]);
410*7e382390SJung-uk Kim 
411*7e382390SJung-uk Kim 	if (gentables)
412*7e382390SJung-uk Kim 		outn ("    };\n");
413*7e382390SJung-uk Kim 
414*7e382390SJung-uk Kim 	/* Table of pointers to start states. */
415*7e382390SJung-uk Kim 	if (gentables)
416*7e382390SJung-uk Kim 		out_dec ("static const struct yy_trans_info *yy_start_state_list[%d] =\n", lastsc * 2 + 1);
417*7e382390SJung-uk Kim 	else
418*7e382390SJung-uk Kim 		outn ("static const struct yy_trans_info **yy_start_state_list =0;");
419*7e382390SJung-uk Kim 
420*7e382390SJung-uk Kim 	if (gentables) {
421*7e382390SJung-uk Kim 		outn ("    {");
422*7e382390SJung-uk Kim 
423*7e382390SJung-uk Kim 		for (i = 0; i <= lastsc * 2; ++i)
424*7e382390SJung-uk Kim 			out_dec ("    &yy_transition[%d],\n", base[i]);
425*7e382390SJung-uk Kim 
426*7e382390SJung-uk Kim 		dataend ();
427*7e382390SJung-uk Kim 	}
428*7e382390SJung-uk Kim 
429*7e382390SJung-uk Kim 	if (useecs)
430*7e382390SJung-uk Kim 		genecs ();
431*7e382390SJung-uk Kim }
432*7e382390SJung-uk Kim 
433*7e382390SJung-uk Kim 
434*7e382390SJung-uk Kim /* mkecstbl - Make equivalence-class tables.  */
435*7e382390SJung-uk Kim 
mkecstbl(void)436*7e382390SJung-uk Kim static struct yytbl_data *mkecstbl (void)
437*7e382390SJung-uk Kim {
438*7e382390SJung-uk Kim 	int i;
439*7e382390SJung-uk Kim 	struct yytbl_data *tbl = 0;
440*7e382390SJung-uk Kim 	flex_int32_t *tdata = 0;
441*7e382390SJung-uk Kim 
442*7e382390SJung-uk Kim 	tbl = calloc(1, sizeof (struct yytbl_data));
443*7e382390SJung-uk Kim 	yytbl_data_init (tbl, YYTD_ID_EC);
444*7e382390SJung-uk Kim 	tbl->td_flags |= YYTD_DATA32;
445*7e382390SJung-uk Kim 	tbl->td_hilen = 0;
446*7e382390SJung-uk Kim 	tbl->td_lolen = (flex_uint32_t) csize;
447*7e382390SJung-uk Kim 
448*7e382390SJung-uk Kim 	tbl->td_data = tdata =
449*7e382390SJung-uk Kim 		calloc(tbl->td_lolen, sizeof (flex_int32_t));
450*7e382390SJung-uk Kim 
451*7e382390SJung-uk Kim 	for (i = 1; i < csize; ++i) {
452*7e382390SJung-uk Kim 		ecgroup[i] = ABS (ecgroup[i]);
453*7e382390SJung-uk Kim 		tdata[i] = ecgroup[i];
454*7e382390SJung-uk Kim 	}
455*7e382390SJung-uk Kim 
456*7e382390SJung-uk Kim 	buf_prints (&yydmap_buf,
457*7e382390SJung-uk Kim 		    "\t{YYTD_ID_EC, (void**)&yy_ec, sizeof(%s)},\n",
458*7e382390SJung-uk Kim 		    "YY_CHAR");
459*7e382390SJung-uk Kim 
460*7e382390SJung-uk Kim 	return tbl;
461*7e382390SJung-uk Kim }
462*7e382390SJung-uk Kim 
463*7e382390SJung-uk Kim /* Generate equivalence-class tables. */
464*7e382390SJung-uk Kim 
genecs(void)465*7e382390SJung-uk Kim void genecs (void)
466*7e382390SJung-uk Kim {
467*7e382390SJung-uk Kim 	int i, j;
468*7e382390SJung-uk Kim 	int     numrows;
469*7e382390SJung-uk Kim 
470*7e382390SJung-uk Kim 	out_str_dec (get_yy_char_decl (), "yy_ec", csize);
471*7e382390SJung-uk Kim 
472*7e382390SJung-uk Kim 	for (i = 1; i < csize; ++i) {
473*7e382390SJung-uk Kim 		ecgroup[i] = ABS (ecgroup[i]);
474*7e382390SJung-uk Kim 		mkdata (ecgroup[i]);
475*7e382390SJung-uk Kim 	}
476*7e382390SJung-uk Kim 
477*7e382390SJung-uk Kim 	dataend ();
478*7e382390SJung-uk Kim 
479*7e382390SJung-uk Kim 	if (trace) {
480*7e382390SJung-uk Kim 		fputs (_("\n\nEquivalence Classes:\n\n"), stderr);
481*7e382390SJung-uk Kim 
482*7e382390SJung-uk Kim 		numrows = csize / 8;
483*7e382390SJung-uk Kim 
484*7e382390SJung-uk Kim 		for (j = 0; j < numrows; ++j) {
485*7e382390SJung-uk Kim 			for (i = j; i < csize; i = i + numrows) {
486*7e382390SJung-uk Kim 				fprintf (stderr, "%4s = %-2d",
487*7e382390SJung-uk Kim 					 readable_form (i), ecgroup[i]);
488*7e382390SJung-uk Kim 
489*7e382390SJung-uk Kim 				putc (' ', stderr);
490*7e382390SJung-uk Kim 			}
491*7e382390SJung-uk Kim 
492*7e382390SJung-uk Kim 			putc ('\n', stderr);
493*7e382390SJung-uk Kim 		}
494*7e382390SJung-uk Kim 	}
495*7e382390SJung-uk Kim }
496*7e382390SJung-uk Kim 
497*7e382390SJung-uk Kim 
498*7e382390SJung-uk Kim /* Generate the code to find the action number. */
499*7e382390SJung-uk Kim 
gen_find_action(void)500*7e382390SJung-uk Kim void gen_find_action (void)
501*7e382390SJung-uk Kim {
502*7e382390SJung-uk Kim 	if (fullspd)
503*7e382390SJung-uk Kim 		indent_puts ("yy_act = yy_current_state[-1].yy_nxt;");
504*7e382390SJung-uk Kim 
505*7e382390SJung-uk Kim 	else if (fulltbl)
506*7e382390SJung-uk Kim 		indent_puts ("yy_act = yy_accept[yy_current_state];");
507*7e382390SJung-uk Kim 
508*7e382390SJung-uk Kim 	else if (reject) {
509*7e382390SJung-uk Kim 		indent_puts ("yy_current_state = *--YY_G(yy_state_ptr);");
510*7e382390SJung-uk Kim 		indent_puts ("YY_G(yy_lp) = yy_accept[yy_current_state];");
511*7e382390SJung-uk Kim 
512*7e382390SJung-uk Kim 		if (!variable_trailing_context_rules)
513*7e382390SJung-uk Kim 			outn ("m4_ifdef( [[M4_YY_USES_REJECT]],\n[[");
514*7e382390SJung-uk Kim 		if(reject_really_used)
515*7e382390SJung-uk Kim 			outn ("find_rule: /* we branch to this label when backing up */");
516*7e382390SJung-uk Kim 		if (!variable_trailing_context_rules)
517*7e382390SJung-uk Kim 			outn ("]])\n");
518*7e382390SJung-uk Kim 
519*7e382390SJung-uk Kim 		indent_puts
520*7e382390SJung-uk Kim 			("for ( ; ; ) /* until we find what rule we matched */");
521*7e382390SJung-uk Kim 
522*7e382390SJung-uk Kim 		++indent_level;
523*7e382390SJung-uk Kim 
524*7e382390SJung-uk Kim 		indent_puts ("{");
525*7e382390SJung-uk Kim 
526*7e382390SJung-uk Kim 		indent_puts
527*7e382390SJung-uk Kim 			("if ( YY_G(yy_lp) && YY_G(yy_lp) < yy_accept[yy_current_state + 1] )");
528*7e382390SJung-uk Kim 		++indent_level;
529*7e382390SJung-uk Kim 		indent_puts ("{");
530*7e382390SJung-uk Kim 		indent_puts ("yy_act = yy_acclist[YY_G(yy_lp)];");
531*7e382390SJung-uk Kim 
532*7e382390SJung-uk Kim 		if (variable_trailing_context_rules) {
533*7e382390SJung-uk Kim 			indent_puts
534*7e382390SJung-uk Kim 				("if ( yy_act & YY_TRAILING_HEAD_MASK ||");
535*7e382390SJung-uk Kim 			indent_puts ("     YY_G(yy_looking_for_trail_begin) )");
536*7e382390SJung-uk Kim 			++indent_level;
537*7e382390SJung-uk Kim 			indent_puts ("{");
538*7e382390SJung-uk Kim 
539*7e382390SJung-uk Kim 			indent_puts
540*7e382390SJung-uk Kim 				("if ( yy_act == YY_G(yy_looking_for_trail_begin) )");
541*7e382390SJung-uk Kim 			++indent_level;
542*7e382390SJung-uk Kim 			indent_puts ("{");
543*7e382390SJung-uk Kim 			indent_puts ("YY_G(yy_looking_for_trail_begin) = 0;");
544*7e382390SJung-uk Kim 			indent_puts ("yy_act &= ~YY_TRAILING_HEAD_MASK;");
545*7e382390SJung-uk Kim 			indent_puts ("break;");
546*7e382390SJung-uk Kim 			indent_puts ("}");
547*7e382390SJung-uk Kim 			--indent_level;
548*7e382390SJung-uk Kim 
549*7e382390SJung-uk Kim 			indent_puts ("}");
550*7e382390SJung-uk Kim 			--indent_level;
551*7e382390SJung-uk Kim 
552*7e382390SJung-uk Kim 			indent_puts
553*7e382390SJung-uk Kim 				("else if ( yy_act & YY_TRAILING_MASK )");
554*7e382390SJung-uk Kim 			++indent_level;
555*7e382390SJung-uk Kim 			indent_puts ("{");
556*7e382390SJung-uk Kim 			indent_puts
557*7e382390SJung-uk Kim 				("YY_G(yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;");
558*7e382390SJung-uk Kim 			indent_puts
559*7e382390SJung-uk Kim 				("YY_G(yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;");
560*7e382390SJung-uk Kim 
561*7e382390SJung-uk Kim 			if (real_reject) {
562*7e382390SJung-uk Kim 				/* Remember matched text in case we back up
563*7e382390SJung-uk Kim 				 * due to REJECT.
564*7e382390SJung-uk Kim 				 */
565*7e382390SJung-uk Kim 				indent_puts
566*7e382390SJung-uk Kim 					("YY_G(yy_full_match) = yy_cp;");
567*7e382390SJung-uk Kim 				indent_puts
568*7e382390SJung-uk Kim 					("YY_G(yy_full_state) = YY_G(yy_state_ptr);");
569*7e382390SJung-uk Kim 				indent_puts ("YY_G(yy_full_lp) = YY_G(yy_lp);");
570*7e382390SJung-uk Kim 			}
571*7e382390SJung-uk Kim 
572*7e382390SJung-uk Kim 			indent_puts ("}");
573*7e382390SJung-uk Kim 			--indent_level;
574*7e382390SJung-uk Kim 
575*7e382390SJung-uk Kim 			indent_puts ("else");
576*7e382390SJung-uk Kim 			++indent_level;
577*7e382390SJung-uk Kim 			indent_puts ("{");
578*7e382390SJung-uk Kim 			indent_puts ("YY_G(yy_full_match) = yy_cp;");
579*7e382390SJung-uk Kim 			indent_puts
580*7e382390SJung-uk Kim 				("YY_G(yy_full_state) = YY_G(yy_state_ptr);");
581*7e382390SJung-uk Kim 			indent_puts ("YY_G(yy_full_lp) = YY_G(yy_lp);");
582*7e382390SJung-uk Kim 			indent_puts ("break;");
583*7e382390SJung-uk Kim 			indent_puts ("}");
584*7e382390SJung-uk Kim 			--indent_level;
585*7e382390SJung-uk Kim 
586*7e382390SJung-uk Kim 			indent_puts ("++YY_G(yy_lp);");
587*7e382390SJung-uk Kim 			indent_puts ("goto find_rule;");
588*7e382390SJung-uk Kim 		}
589*7e382390SJung-uk Kim 
590*7e382390SJung-uk Kim 		else {
591*7e382390SJung-uk Kim 			/* Remember matched text in case we back up due to
592*7e382390SJung-uk Kim 			 * trailing context plus REJECT.
593*7e382390SJung-uk Kim 			 */
594*7e382390SJung-uk Kim 			++indent_level;
595*7e382390SJung-uk Kim 			indent_puts ("{");
596*7e382390SJung-uk Kim 			indent_puts ("YY_G(yy_full_match) = yy_cp;");
597*7e382390SJung-uk Kim 			indent_puts ("break;");
598*7e382390SJung-uk Kim 			indent_puts ("}");
599*7e382390SJung-uk Kim 			--indent_level;
600*7e382390SJung-uk Kim 		}
601*7e382390SJung-uk Kim 
602*7e382390SJung-uk Kim 		indent_puts ("}");
603*7e382390SJung-uk Kim 		--indent_level;
604*7e382390SJung-uk Kim 
605*7e382390SJung-uk Kim 		indent_puts ("--yy_cp;");
606*7e382390SJung-uk Kim 
607*7e382390SJung-uk Kim 		/* We could consolidate the following two lines with those at
608*7e382390SJung-uk Kim 		 * the beginning, but at the cost of complaints that we're
609*7e382390SJung-uk Kim 		 * branching inside a loop.
610*7e382390SJung-uk Kim 		 */
611*7e382390SJung-uk Kim 		indent_puts ("yy_current_state = *--YY_G(yy_state_ptr);");
612*7e382390SJung-uk Kim 		indent_puts ("YY_G(yy_lp) = yy_accept[yy_current_state];");
613*7e382390SJung-uk Kim 
614*7e382390SJung-uk Kim 		indent_puts ("}");
615*7e382390SJung-uk Kim 
616*7e382390SJung-uk Kim 		--indent_level;
617*7e382390SJung-uk Kim 	}
618*7e382390SJung-uk Kim 
619*7e382390SJung-uk Kim 	else {			/* compressed */
620*7e382390SJung-uk Kim 		indent_puts ("yy_act = yy_accept[yy_current_state];");
621*7e382390SJung-uk Kim 
622*7e382390SJung-uk Kim 		if (interactive && !reject) {
623*7e382390SJung-uk Kim 			/* Do the guaranteed-needed backing up to figure out
624*7e382390SJung-uk Kim 			 * the match.
625*7e382390SJung-uk Kim 			 */
626*7e382390SJung-uk Kim 			indent_puts ("if ( yy_act == 0 )");
627*7e382390SJung-uk Kim 			++indent_level;
628*7e382390SJung-uk Kim 			indent_puts ("{ /* have to back up */");
629*7e382390SJung-uk Kim 			indent_puts
630*7e382390SJung-uk Kim 				("yy_cp = YY_G(yy_last_accepting_cpos);");
631*7e382390SJung-uk Kim 			indent_puts
632*7e382390SJung-uk Kim 				("yy_current_state = YY_G(yy_last_accepting_state);");
633*7e382390SJung-uk Kim 			indent_puts
634*7e382390SJung-uk Kim 				("yy_act = yy_accept[yy_current_state];");
635*7e382390SJung-uk Kim 			indent_puts ("}");
636*7e382390SJung-uk Kim 			--indent_level;
637*7e382390SJung-uk Kim 		}
638*7e382390SJung-uk Kim 	}
639*7e382390SJung-uk Kim }
640*7e382390SJung-uk Kim 
641*7e382390SJung-uk Kim /* mkftbl - make the full table and return the struct .
642*7e382390SJung-uk Kim  * you should call mkecstbl() after this.
643*7e382390SJung-uk Kim  */
644*7e382390SJung-uk Kim 
mkftbl(void)645*7e382390SJung-uk Kim struct yytbl_data *mkftbl (void)
646*7e382390SJung-uk Kim {
647*7e382390SJung-uk Kim 	int i;
648*7e382390SJung-uk Kim 	int     end_of_buffer_action = num_rules + 1;
649*7e382390SJung-uk Kim 	struct yytbl_data *tbl;
650*7e382390SJung-uk Kim 	flex_int32_t *tdata = 0;
651*7e382390SJung-uk Kim 
652*7e382390SJung-uk Kim 	tbl = calloc(1, sizeof (struct yytbl_data));
653*7e382390SJung-uk Kim 	yytbl_data_init (tbl, YYTD_ID_ACCEPT);
654*7e382390SJung-uk Kim 	tbl->td_flags |= YYTD_DATA32;
655*7e382390SJung-uk Kim 	tbl->td_hilen = 0;	/* it's a one-dimensional array */
656*7e382390SJung-uk Kim 	tbl->td_lolen = (flex_uint32_t) (lastdfa + 1);
657*7e382390SJung-uk Kim 
658*7e382390SJung-uk Kim 	tbl->td_data = tdata =
659*7e382390SJung-uk Kim 		calloc(tbl->td_lolen, sizeof (flex_int32_t));
660*7e382390SJung-uk Kim 
661*7e382390SJung-uk Kim 	dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action;
662*7e382390SJung-uk Kim 
663*7e382390SJung-uk Kim 	for (i = 1; i <= lastdfa; ++i) {
664*7e382390SJung-uk Kim 		int anum = dfaacc[i].dfaacc_state;
665*7e382390SJung-uk Kim 
666*7e382390SJung-uk Kim 		tdata[i] = anum;
667*7e382390SJung-uk Kim 
668*7e382390SJung-uk Kim 		if (trace && anum)
669*7e382390SJung-uk Kim 			fprintf (stderr, _("state # %d accepts: [%d]\n"),
670*7e382390SJung-uk Kim 				 i, anum);
671*7e382390SJung-uk Kim 	}
672*7e382390SJung-uk Kim 
673*7e382390SJung-uk Kim 	buf_prints (&yydmap_buf,
674*7e382390SJung-uk Kim 		    "\t{YYTD_ID_ACCEPT, (void**)&yy_accept, sizeof(%s)},\n",
675*7e382390SJung-uk Kim 		    long_align ? "flex_int32_t" : "flex_int16_t");
676*7e382390SJung-uk Kim 	return tbl;
677*7e382390SJung-uk Kim }
678*7e382390SJung-uk Kim 
679*7e382390SJung-uk Kim 
680*7e382390SJung-uk Kim /* genftbl - generate full transition table */
681*7e382390SJung-uk Kim 
genftbl(void)682*7e382390SJung-uk Kim void genftbl (void)
683*7e382390SJung-uk Kim {
684*7e382390SJung-uk Kim 	int i;
685*7e382390SJung-uk Kim 	int     end_of_buffer_action = num_rules + 1;
686*7e382390SJung-uk Kim 
687*7e382390SJung-uk Kim 	out_str_dec (long_align ? get_int32_decl () : get_int16_decl (),
688*7e382390SJung-uk Kim 		     "yy_accept", lastdfa + 1);
689*7e382390SJung-uk Kim 
690*7e382390SJung-uk Kim 	dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action;
691*7e382390SJung-uk Kim 
692*7e382390SJung-uk Kim 	for (i = 1; i <= lastdfa; ++i) {
693*7e382390SJung-uk Kim 		int anum = dfaacc[i].dfaacc_state;
694*7e382390SJung-uk Kim 
695*7e382390SJung-uk Kim 		mkdata (anum);
696*7e382390SJung-uk Kim 
697*7e382390SJung-uk Kim 		if (trace && anum)
698*7e382390SJung-uk Kim 			fprintf (stderr, _("state # %d accepts: [%d]\n"),
699*7e382390SJung-uk Kim 				 i, anum);
700*7e382390SJung-uk Kim 	}
701*7e382390SJung-uk Kim 
702*7e382390SJung-uk Kim 	dataend ();
703*7e382390SJung-uk Kim 
704*7e382390SJung-uk Kim 	if (useecs)
705*7e382390SJung-uk Kim 		genecs ();
706*7e382390SJung-uk Kim 
707*7e382390SJung-uk Kim 	/* Don't have to dump the actual full table entries - they were
708*7e382390SJung-uk Kim 	 * created on-the-fly.
709*7e382390SJung-uk Kim 	 */
710*7e382390SJung-uk Kim }
711*7e382390SJung-uk Kim 
712*7e382390SJung-uk Kim 
713*7e382390SJung-uk Kim /* Generate the code to find the next compressed-table state. */
714*7e382390SJung-uk Kim 
gen_next_compressed_state(char * char_map)715*7e382390SJung-uk Kim void gen_next_compressed_state (char *char_map)
716*7e382390SJung-uk Kim {
717*7e382390SJung-uk Kim 	indent_put2s ("YY_CHAR yy_c = %s;", char_map);
718*7e382390SJung-uk Kim 
719*7e382390SJung-uk Kim 	/* Save the backing-up info \before/ computing the next state
720*7e382390SJung-uk Kim 	 * because we always compute one more state than needed - we
721*7e382390SJung-uk Kim 	 * always proceed until we reach a jam state
722*7e382390SJung-uk Kim 	 */
723*7e382390SJung-uk Kim 	gen_backing_up ();
724*7e382390SJung-uk Kim 
725*7e382390SJung-uk Kim 	indent_puts
726*7e382390SJung-uk Kim 		("while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )");
727*7e382390SJung-uk Kim 	++indent_level;
728*7e382390SJung-uk Kim 	indent_puts ("{");
729*7e382390SJung-uk Kim 	indent_puts ("yy_current_state = (int) yy_def[yy_current_state];");
730*7e382390SJung-uk Kim 
731*7e382390SJung-uk Kim 	if (usemecs) {
732*7e382390SJung-uk Kim 		/* We've arrange it so that templates are never chained
733*7e382390SJung-uk Kim 		 * to one another.  This means we can afford to make a
734*7e382390SJung-uk Kim 		 * very simple test to see if we need to convert to
735*7e382390SJung-uk Kim 		 * yy_c's meta-equivalence class without worrying
736*7e382390SJung-uk Kim 		 * about erroneously looking up the meta-equivalence
737*7e382390SJung-uk Kim 		 * class twice
738*7e382390SJung-uk Kim 		 */
739*7e382390SJung-uk Kim 		do_indent ();
740*7e382390SJung-uk Kim 
741*7e382390SJung-uk Kim 		/* lastdfa + 2 is the beginning of the templates */
742*7e382390SJung-uk Kim 		out_dec ("if ( yy_current_state >= %d )\n", lastdfa + 2);
743*7e382390SJung-uk Kim 
744*7e382390SJung-uk Kim 		++indent_level;
745*7e382390SJung-uk Kim 		indent_puts ("yy_c = yy_meta[yy_c];");
746*7e382390SJung-uk Kim 		--indent_level;
747*7e382390SJung-uk Kim 	}
748*7e382390SJung-uk Kim 
749*7e382390SJung-uk Kim 	indent_puts ("}");
750*7e382390SJung-uk Kim 	--indent_level;
751*7e382390SJung-uk Kim 
752*7e382390SJung-uk Kim 	indent_puts
753*7e382390SJung-uk Kim 		("yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];");
754*7e382390SJung-uk Kim }
755*7e382390SJung-uk Kim 
756*7e382390SJung-uk Kim 
757*7e382390SJung-uk Kim /* Generate the code to find the next match. */
758*7e382390SJung-uk Kim 
gen_next_match(void)759*7e382390SJung-uk Kim void gen_next_match (void)
760*7e382390SJung-uk Kim {
761*7e382390SJung-uk Kim 	/* NOTE - changes in here should be reflected in gen_next_state() and
762*7e382390SJung-uk Kim 	 * gen_NUL_trans().
763*7e382390SJung-uk Kim 	 */
764*7e382390SJung-uk Kim 	char   *char_map = useecs ?
765*7e382390SJung-uk Kim 		"yy_ec[YY_SC_TO_UI(*yy_cp)] " : "YY_SC_TO_UI(*yy_cp)";
766*7e382390SJung-uk Kim 
767*7e382390SJung-uk Kim 	char   *char_map_2 = useecs ?
768*7e382390SJung-uk Kim 		"yy_ec[YY_SC_TO_UI(*++yy_cp)] " : "YY_SC_TO_UI(*++yy_cp)";
769*7e382390SJung-uk Kim 
770*7e382390SJung-uk Kim 	if (fulltbl) {
771*7e382390SJung-uk Kim 		if (gentables)
772*7e382390SJung-uk Kim 			indent_put2s
773*7e382390SJung-uk Kim 				("while ( (yy_current_state = yy_nxt[yy_current_state][ %s ]) > 0 )",
774*7e382390SJung-uk Kim 				 char_map);
775*7e382390SJung-uk Kim 		else
776*7e382390SJung-uk Kim 			indent_put2s
777*7e382390SJung-uk Kim 				("while ( (yy_current_state = yy_nxt[yy_current_state*YY_NXT_LOLEN +  %s ]) > 0 )",
778*7e382390SJung-uk Kim 				 char_map);
779*7e382390SJung-uk Kim 
780*7e382390SJung-uk Kim 		++indent_level;
781*7e382390SJung-uk Kim 
782*7e382390SJung-uk Kim 		if (num_backing_up > 0) {
783*7e382390SJung-uk Kim 			indent_puts ("{");
784*7e382390SJung-uk Kim 			gen_backing_up ();
785*7e382390SJung-uk Kim 			outc ('\n');
786*7e382390SJung-uk Kim 		}
787*7e382390SJung-uk Kim 
788*7e382390SJung-uk Kim 		indent_puts ("++yy_cp;");
789*7e382390SJung-uk Kim 
790*7e382390SJung-uk Kim 		if (num_backing_up > 0)
791*7e382390SJung-uk Kim 
792*7e382390SJung-uk Kim 			indent_puts ("}");
793*7e382390SJung-uk Kim 
794*7e382390SJung-uk Kim 		--indent_level;
795*7e382390SJung-uk Kim 
796*7e382390SJung-uk Kim 		outc ('\n');
797*7e382390SJung-uk Kim 		indent_puts ("yy_current_state = -yy_current_state;");
798*7e382390SJung-uk Kim 	}
799*7e382390SJung-uk Kim 
800*7e382390SJung-uk Kim 	else if (fullspd) {
801*7e382390SJung-uk Kim 		indent_puts ("{");
802*7e382390SJung-uk Kim 		indent_puts
803*7e382390SJung-uk Kim 			("const struct yy_trans_info *yy_trans_info;\n");
804*7e382390SJung-uk Kim 		indent_puts ("YY_CHAR yy_c;\n");
805*7e382390SJung-uk Kim 		indent_put2s ("for ( yy_c = %s;", char_map);
806*7e382390SJung-uk Kim 		indent_puts
807*7e382390SJung-uk Kim 			("      (yy_trans_info = &yy_current_state[yy_c])->");
808*7e382390SJung-uk Kim 		indent_puts ("yy_verify == yy_c;");
809*7e382390SJung-uk Kim 		indent_put2s ("      yy_c = %s )", char_map_2);
810*7e382390SJung-uk Kim 
811*7e382390SJung-uk Kim 		++indent_level;
812*7e382390SJung-uk Kim 
813*7e382390SJung-uk Kim 		if (num_backing_up > 0)
814*7e382390SJung-uk Kim 			indent_puts ("{");
815*7e382390SJung-uk Kim 
816*7e382390SJung-uk Kim 		indent_puts ("yy_current_state += yy_trans_info->yy_nxt;");
817*7e382390SJung-uk Kim 
818*7e382390SJung-uk Kim 		if (num_backing_up > 0) {
819*7e382390SJung-uk Kim 			outc ('\n');
820*7e382390SJung-uk Kim 			gen_backing_up ();
821*7e382390SJung-uk Kim 			indent_puts ("}");
822*7e382390SJung-uk Kim 		}
823*7e382390SJung-uk Kim 
824*7e382390SJung-uk Kim 		--indent_level;
825*7e382390SJung-uk Kim 		indent_puts ("}");
826*7e382390SJung-uk Kim 	}
827*7e382390SJung-uk Kim 
828*7e382390SJung-uk Kim 	else {			/* compressed */
829*7e382390SJung-uk Kim 		indent_puts ("do");
830*7e382390SJung-uk Kim 
831*7e382390SJung-uk Kim 		++indent_level;
832*7e382390SJung-uk Kim 		indent_puts ("{");
833*7e382390SJung-uk Kim 
834*7e382390SJung-uk Kim 		gen_next_state (false);
835*7e382390SJung-uk Kim 
836*7e382390SJung-uk Kim 		indent_puts ("++yy_cp;");
837*7e382390SJung-uk Kim 
838*7e382390SJung-uk Kim 
839*7e382390SJung-uk Kim 		indent_puts ("}");
840*7e382390SJung-uk Kim 		--indent_level;
841*7e382390SJung-uk Kim 
842*7e382390SJung-uk Kim 		do_indent ();
843*7e382390SJung-uk Kim 
844*7e382390SJung-uk Kim 		if (interactive)
845*7e382390SJung-uk Kim 			out_dec ("while ( yy_base[yy_current_state] != %d );\n", jambase);
846*7e382390SJung-uk Kim 		else
847*7e382390SJung-uk Kim 			out_dec ("while ( yy_current_state != %d );\n",
848*7e382390SJung-uk Kim 				 jamstate);
849*7e382390SJung-uk Kim 
850*7e382390SJung-uk Kim 		if (!reject && !interactive) {
851*7e382390SJung-uk Kim 			/* Do the guaranteed-needed backing up to figure out
852*7e382390SJung-uk Kim 			 * the match.
853*7e382390SJung-uk Kim 			 */
854*7e382390SJung-uk Kim 			indent_puts
855*7e382390SJung-uk Kim 				("yy_cp = YY_G(yy_last_accepting_cpos);");
856*7e382390SJung-uk Kim 			indent_puts
857*7e382390SJung-uk Kim 				("yy_current_state = YY_G(yy_last_accepting_state);");
858*7e382390SJung-uk Kim 		}
859*7e382390SJung-uk Kim 	}
860*7e382390SJung-uk Kim }
861*7e382390SJung-uk Kim 
862*7e382390SJung-uk Kim 
863*7e382390SJung-uk Kim /* Generate the code to find the next state. */
864*7e382390SJung-uk Kim 
gen_next_state(int worry_about_NULs)865*7e382390SJung-uk Kim void gen_next_state (int worry_about_NULs)
866*7e382390SJung-uk Kim {				/* NOTE - changes in here should be reflected in gen_next_match() */
867*7e382390SJung-uk Kim 	char    char_map[256];
868*7e382390SJung-uk Kim 
869*7e382390SJung-uk Kim 	if (worry_about_NULs && !nultrans) {
870*7e382390SJung-uk Kim 		if (useecs)
871*7e382390SJung-uk Kim 			snprintf (char_map, sizeof(char_map),
872*7e382390SJung-uk Kim 					"(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : %d)",
873*7e382390SJung-uk Kim 					NUL_ec);
874*7e382390SJung-uk Kim 		else
875*7e382390SJung-uk Kim             snprintf (char_map, sizeof(char_map),
876*7e382390SJung-uk Kim 					"(*yy_cp ? YY_SC_TO_UI(*yy_cp) : %d)",
877*7e382390SJung-uk Kim 					NUL_ec);
878*7e382390SJung-uk Kim 	}
879*7e382390SJung-uk Kim 
880*7e382390SJung-uk Kim 	else
881*7e382390SJung-uk Kim 		strcpy (char_map, useecs ?
882*7e382390SJung-uk Kim 			"yy_ec[YY_SC_TO_UI(*yy_cp)] " :
883*7e382390SJung-uk Kim 			"YY_SC_TO_UI(*yy_cp)");
884*7e382390SJung-uk Kim 
885*7e382390SJung-uk Kim 	if (worry_about_NULs && nultrans) {
886*7e382390SJung-uk Kim 		if (!fulltbl && !fullspd)
887*7e382390SJung-uk Kim 			/* Compressed tables back up *before* they match. */
888*7e382390SJung-uk Kim 			gen_backing_up ();
889*7e382390SJung-uk Kim 
890*7e382390SJung-uk Kim 		indent_puts ("if ( *yy_cp )");
891*7e382390SJung-uk Kim 		++indent_level;
892*7e382390SJung-uk Kim 		indent_puts ("{");
893*7e382390SJung-uk Kim 	}
894*7e382390SJung-uk Kim 
895*7e382390SJung-uk Kim 	if (fulltbl) {
896*7e382390SJung-uk Kim 		if (gentables)
897*7e382390SJung-uk Kim 			indent_put2s
898*7e382390SJung-uk Kim 				("yy_current_state = yy_nxt[yy_current_state][%s];",
899*7e382390SJung-uk Kim 				 char_map);
900*7e382390SJung-uk Kim 		else
901*7e382390SJung-uk Kim 			indent_put2s
902*7e382390SJung-uk Kim 				("yy_current_state = yy_nxt[yy_current_state*YY_NXT_LOLEN + %s];",
903*7e382390SJung-uk Kim 				 char_map);
904*7e382390SJung-uk Kim 	}
905*7e382390SJung-uk Kim 
906*7e382390SJung-uk Kim 	else if (fullspd)
907*7e382390SJung-uk Kim 		indent_put2s
908*7e382390SJung-uk Kim 			("yy_current_state += yy_current_state[%s].yy_nxt;",
909*7e382390SJung-uk Kim 			 char_map);
910*7e382390SJung-uk Kim 
911*7e382390SJung-uk Kim 	else
912*7e382390SJung-uk Kim 		gen_next_compressed_state (char_map);
913*7e382390SJung-uk Kim 
914*7e382390SJung-uk Kim 	if (worry_about_NULs && nultrans) {
915*7e382390SJung-uk Kim 
916*7e382390SJung-uk Kim 		indent_puts ("}");
917*7e382390SJung-uk Kim 		--indent_level;
918*7e382390SJung-uk Kim 		indent_puts ("else");
919*7e382390SJung-uk Kim 		++indent_level;
920*7e382390SJung-uk Kim 		indent_puts
921*7e382390SJung-uk Kim 			("yy_current_state = yy_NUL_trans[yy_current_state];");
922*7e382390SJung-uk Kim 		--indent_level;
923*7e382390SJung-uk Kim 	}
924*7e382390SJung-uk Kim 
925*7e382390SJung-uk Kim 	if (fullspd || fulltbl)
926*7e382390SJung-uk Kim 		gen_backing_up ();
927*7e382390SJung-uk Kim 
928*7e382390SJung-uk Kim 	if (reject)
929*7e382390SJung-uk Kim 		indent_puts ("*YY_G(yy_state_ptr)++ = yy_current_state;");
930*7e382390SJung-uk Kim }
931*7e382390SJung-uk Kim 
932*7e382390SJung-uk Kim 
933*7e382390SJung-uk Kim /* Generate the code to make a NUL transition. */
934*7e382390SJung-uk Kim 
gen_NUL_trans(void)935*7e382390SJung-uk Kim void gen_NUL_trans (void)
936*7e382390SJung-uk Kim {				/* NOTE - changes in here should be reflected in gen_next_match() */
937*7e382390SJung-uk Kim 	/* Only generate a definition for "yy_cp" if we'll generate code
938*7e382390SJung-uk Kim 	 * that uses it.  Otherwise lint and the like complain.
939*7e382390SJung-uk Kim 	 */
940*7e382390SJung-uk Kim 	int     need_backing_up = (num_backing_up > 0 && !reject);
941*7e382390SJung-uk Kim 
942*7e382390SJung-uk Kim 	if (need_backing_up && (!nultrans || fullspd || fulltbl))
943*7e382390SJung-uk Kim 		/* We're going to need yy_cp lying around for the call
944*7e382390SJung-uk Kim 		 * below to gen_backing_up().
945*7e382390SJung-uk Kim 		 */
946*7e382390SJung-uk Kim 		indent_puts ("char *yy_cp = YY_G(yy_c_buf_p);");
947*7e382390SJung-uk Kim 
948*7e382390SJung-uk Kim 	outc ('\n');
949*7e382390SJung-uk Kim 
950*7e382390SJung-uk Kim 	if (nultrans) {
951*7e382390SJung-uk Kim 		indent_puts
952*7e382390SJung-uk Kim 			("yy_current_state = yy_NUL_trans[yy_current_state];");
953*7e382390SJung-uk Kim 		indent_puts ("yy_is_jam = (yy_current_state == 0);");
954*7e382390SJung-uk Kim 	}
955*7e382390SJung-uk Kim 
956*7e382390SJung-uk Kim 	else if (fulltbl) {
957*7e382390SJung-uk Kim 		do_indent ();
958*7e382390SJung-uk Kim 		if (gentables)
959*7e382390SJung-uk Kim 			out_dec ("yy_current_state = yy_nxt[yy_current_state][%d];\n", NUL_ec);
960*7e382390SJung-uk Kim 		else
961*7e382390SJung-uk Kim 			out_dec ("yy_current_state = yy_nxt[yy_current_state*YY_NXT_LOLEN + %d];\n", NUL_ec);
962*7e382390SJung-uk Kim 		indent_puts ("yy_is_jam = (yy_current_state <= 0);");
963*7e382390SJung-uk Kim 	}
964*7e382390SJung-uk Kim 
965*7e382390SJung-uk Kim 	else if (fullspd) {
966*7e382390SJung-uk Kim 		do_indent ();
967*7e382390SJung-uk Kim 		out_dec ("int yy_c = %d;\n", NUL_ec);
968*7e382390SJung-uk Kim 
969*7e382390SJung-uk Kim 		indent_puts
970*7e382390SJung-uk Kim 			("const struct yy_trans_info *yy_trans_info;\n");
971*7e382390SJung-uk Kim 		indent_puts
972*7e382390SJung-uk Kim 			("yy_trans_info = &yy_current_state[(unsigned int) yy_c];");
973*7e382390SJung-uk Kim 		indent_puts ("yy_current_state += yy_trans_info->yy_nxt;");
974*7e382390SJung-uk Kim 
975*7e382390SJung-uk Kim 		indent_puts
976*7e382390SJung-uk Kim 			("yy_is_jam = (yy_trans_info->yy_verify != yy_c);");
977*7e382390SJung-uk Kim 	}
978*7e382390SJung-uk Kim 
979*7e382390SJung-uk Kim 	else {
980*7e382390SJung-uk Kim 		char    NUL_ec_str[20];
981*7e382390SJung-uk Kim 
982*7e382390SJung-uk Kim 		snprintf (NUL_ec_str, sizeof(NUL_ec_str), "%d", NUL_ec);
983*7e382390SJung-uk Kim 		gen_next_compressed_state (NUL_ec_str);
984*7e382390SJung-uk Kim 
985*7e382390SJung-uk Kim 		do_indent ();
986*7e382390SJung-uk Kim 		out_dec ("yy_is_jam = (yy_current_state == %d);\n",
987*7e382390SJung-uk Kim 			 jamstate);
988*7e382390SJung-uk Kim 
989*7e382390SJung-uk Kim 		if (reject) {
990*7e382390SJung-uk Kim 			/* Only stack this state if it's a transition we
991*7e382390SJung-uk Kim 			 * actually make.  If we stack it on a jam, then
992*7e382390SJung-uk Kim 			 * the state stack and yy_c_buf_p get out of sync.
993*7e382390SJung-uk Kim 			 */
994*7e382390SJung-uk Kim 			indent_puts ("if ( ! yy_is_jam )");
995*7e382390SJung-uk Kim 			++indent_level;
996*7e382390SJung-uk Kim 			indent_puts
997*7e382390SJung-uk Kim 				("*YY_G(yy_state_ptr)++ = yy_current_state;");
998*7e382390SJung-uk Kim 			--indent_level;
999*7e382390SJung-uk Kim 		}
1000*7e382390SJung-uk Kim 	}
1001*7e382390SJung-uk Kim 
1002*7e382390SJung-uk Kim 	/* If we've entered an accepting state, back up; note that
1003*7e382390SJung-uk Kim 	 * compressed tables have *already* done such backing up, so
1004*7e382390SJung-uk Kim 	 * we needn't bother with it again.
1005*7e382390SJung-uk Kim 	 */
1006*7e382390SJung-uk Kim 	if (need_backing_up && (fullspd || fulltbl)) {
1007*7e382390SJung-uk Kim 		outc ('\n');
1008*7e382390SJung-uk Kim 		indent_puts ("if ( ! yy_is_jam )");
1009*7e382390SJung-uk Kim 		++indent_level;
1010*7e382390SJung-uk Kim 		indent_puts ("{");
1011*7e382390SJung-uk Kim 		gen_backing_up ();
1012*7e382390SJung-uk Kim 		indent_puts ("}");
1013*7e382390SJung-uk Kim 		--indent_level;
1014*7e382390SJung-uk Kim 	}
1015*7e382390SJung-uk Kim }
1016*7e382390SJung-uk Kim 
1017*7e382390SJung-uk Kim 
1018*7e382390SJung-uk Kim /* Generate the code to find the start state. */
1019*7e382390SJung-uk Kim 
gen_start_state(void)1020*7e382390SJung-uk Kim void gen_start_state (void)
1021*7e382390SJung-uk Kim {
1022*7e382390SJung-uk Kim 	if (fullspd) {
1023*7e382390SJung-uk Kim 		if (bol_needed) {
1024*7e382390SJung-uk Kim 			indent_puts
1025*7e382390SJung-uk Kim 				("yy_current_state = yy_start_state_list[YY_G(yy_start) + YY_AT_BOL()];");
1026*7e382390SJung-uk Kim 		}
1027*7e382390SJung-uk Kim 		else
1028*7e382390SJung-uk Kim 			indent_puts
1029*7e382390SJung-uk Kim 				("yy_current_state = yy_start_state_list[YY_G(yy_start)];");
1030*7e382390SJung-uk Kim 	}
1031*7e382390SJung-uk Kim 
1032*7e382390SJung-uk Kim 	else {
1033*7e382390SJung-uk Kim 		indent_puts ("yy_current_state = YY_G(yy_start);");
1034*7e382390SJung-uk Kim 
1035*7e382390SJung-uk Kim 		if (bol_needed)
1036*7e382390SJung-uk Kim 			indent_puts ("yy_current_state += YY_AT_BOL();");
1037*7e382390SJung-uk Kim 
1038*7e382390SJung-uk Kim 		if (reject) {
1039*7e382390SJung-uk Kim 			/* Set up for storing up states. */
1040*7e382390SJung-uk Kim 			outn ("m4_ifdef( [[M4_YY_USES_REJECT]],\n[[");
1041*7e382390SJung-uk Kim 			indent_puts
1042*7e382390SJung-uk Kim 				("YY_G(yy_state_ptr) = YY_G(yy_state_buf);");
1043*7e382390SJung-uk Kim 			indent_puts
1044*7e382390SJung-uk Kim 				("*YY_G(yy_state_ptr)++ = yy_current_state;");
1045*7e382390SJung-uk Kim 			outn ("]])");
1046*7e382390SJung-uk Kim 		}
1047*7e382390SJung-uk Kim 	}
1048*7e382390SJung-uk Kim }
1049*7e382390SJung-uk Kim 
1050*7e382390SJung-uk Kim 
1051*7e382390SJung-uk Kim /* gentabs - generate data statements for the transition tables */
1052*7e382390SJung-uk Kim 
gentabs(void)1053*7e382390SJung-uk Kim void gentabs (void)
1054*7e382390SJung-uk Kim {
1055*7e382390SJung-uk Kim 	int     i, j, k, *accset, nacc, *acc_array, total_states;
1056*7e382390SJung-uk Kim 	int     end_of_buffer_action = num_rules + 1;
1057*7e382390SJung-uk Kim 	struct yytbl_data *yyacc_tbl = 0, *yymeta_tbl = 0, *yybase_tbl = 0,
1058*7e382390SJung-uk Kim 		*yydef_tbl = 0, *yynxt_tbl = 0, *yychk_tbl = 0, *yyacclist_tbl=0;
1059*7e382390SJung-uk Kim 	flex_int32_t *yyacc_data = 0, *yybase_data = 0, *yydef_data = 0,
1060*7e382390SJung-uk Kim 		*yynxt_data = 0, *yychk_data = 0, *yyacclist_data=0;
1061*7e382390SJung-uk Kim 	flex_int32_t yybase_curr = 0, yyacclist_curr=0,yyacc_curr=0;
1062*7e382390SJung-uk Kim 
1063*7e382390SJung-uk Kim 	acc_array = allocate_integer_array (current_max_dfas);
1064*7e382390SJung-uk Kim 	nummt = 0;
1065*7e382390SJung-uk Kim 
1066*7e382390SJung-uk Kim 	/* The compressed table format jams by entering the "jam state",
1067*7e382390SJung-uk Kim 	 * losing information about the previous state in the process.
1068*7e382390SJung-uk Kim 	 * In order to recover the previous state, we effectively need
1069*7e382390SJung-uk Kim 	 * to keep backing-up information.
1070*7e382390SJung-uk Kim 	 */
1071*7e382390SJung-uk Kim 	++num_backing_up;
1072*7e382390SJung-uk Kim 
1073*7e382390SJung-uk Kim 	if (reject) {
1074*7e382390SJung-uk Kim 		/* Write out accepting list and pointer list.
1075*7e382390SJung-uk Kim 
1076*7e382390SJung-uk Kim 		 * First we generate the "yy_acclist" array.  In the process,
1077*7e382390SJung-uk Kim 		 * we compute the indices that will go into the "yy_accept"
1078*7e382390SJung-uk Kim 		 * array, and save the indices in the dfaacc array.
1079*7e382390SJung-uk Kim 		 */
1080*7e382390SJung-uk Kim 		int     EOB_accepting_list[2];
1081*7e382390SJung-uk Kim 
1082*7e382390SJung-uk Kim 		/* Set up accepting structures for the End Of Buffer state. */
1083*7e382390SJung-uk Kim 		EOB_accepting_list[0] = 0;
1084*7e382390SJung-uk Kim 		EOB_accepting_list[1] = end_of_buffer_action;
1085*7e382390SJung-uk Kim 		accsiz[end_of_buffer_state] = 1;
1086*7e382390SJung-uk Kim 		dfaacc[end_of_buffer_state].dfaacc_set =
1087*7e382390SJung-uk Kim 			EOB_accepting_list;
1088*7e382390SJung-uk Kim 
1089*7e382390SJung-uk Kim 		out_str_dec (long_align ? get_int32_decl () :
1090*7e382390SJung-uk Kim 			     get_int16_decl (), "yy_acclist", MAX (numas,
1091*7e382390SJung-uk Kim 								   1) + 1);
1092*7e382390SJung-uk Kim 
1093*7e382390SJung-uk Kim         buf_prints (&yydmap_buf,
1094*7e382390SJung-uk Kim                 "\t{YYTD_ID_ACCLIST, (void**)&yy_acclist, sizeof(%s)},\n",
1095*7e382390SJung-uk Kim                 long_align ? "flex_int32_t" : "flex_int16_t");
1096*7e382390SJung-uk Kim 
1097*7e382390SJung-uk Kim         yyacclist_tbl = calloc(1,sizeof(struct yytbl_data));
1098*7e382390SJung-uk Kim         yytbl_data_init (yyacclist_tbl, YYTD_ID_ACCLIST);
1099*7e382390SJung-uk Kim         yyacclist_tbl->td_lolen  = (flex_uint32_t) (MAX(numas,1) + 1);
1100*7e382390SJung-uk Kim         yyacclist_tbl->td_data = yyacclist_data =
1101*7e382390SJung-uk Kim             calloc(yyacclist_tbl->td_lolen, sizeof (flex_int32_t));
1102*7e382390SJung-uk Kim         yyacclist_curr = 1;
1103*7e382390SJung-uk Kim 
1104*7e382390SJung-uk Kim 		j = 1;		/* index into "yy_acclist" array */
1105*7e382390SJung-uk Kim 
1106*7e382390SJung-uk Kim 		for (i = 1; i <= lastdfa; ++i) {
1107*7e382390SJung-uk Kim 			acc_array[i] = j;
1108*7e382390SJung-uk Kim 
1109*7e382390SJung-uk Kim 			if (accsiz[i] != 0) {
1110*7e382390SJung-uk Kim 				accset = dfaacc[i].dfaacc_set;
1111*7e382390SJung-uk Kim 				nacc = accsiz[i];
1112*7e382390SJung-uk Kim 
1113*7e382390SJung-uk Kim 				if (trace)
1114*7e382390SJung-uk Kim 					fprintf (stderr,
1115*7e382390SJung-uk Kim 						 _("state # %d accepts: "),
1116*7e382390SJung-uk Kim 						 i);
1117*7e382390SJung-uk Kim 
1118*7e382390SJung-uk Kim 				for (k = 1; k <= nacc; ++k) {
1119*7e382390SJung-uk Kim 					int     accnum = accset[k];
1120*7e382390SJung-uk Kim 
1121*7e382390SJung-uk Kim 					++j;
1122*7e382390SJung-uk Kim 
1123*7e382390SJung-uk Kim 					if (variable_trailing_context_rules
1124*7e382390SJung-uk Kim 					    && !(accnum &
1125*7e382390SJung-uk Kim 						 YY_TRAILING_HEAD_MASK)
1126*7e382390SJung-uk Kim 					    && accnum > 0
1127*7e382390SJung-uk Kim 					    && accnum <= num_rules
1128*7e382390SJung-uk Kim 					    && rule_type[accnum] ==
1129*7e382390SJung-uk Kim 					    RULE_VARIABLE) {
1130*7e382390SJung-uk Kim 						/* Special hack to flag
1131*7e382390SJung-uk Kim 						 * accepting number as part
1132*7e382390SJung-uk Kim 						 * of trailing context rule.
1133*7e382390SJung-uk Kim 						 */
1134*7e382390SJung-uk Kim 						accnum |= YY_TRAILING_MASK;
1135*7e382390SJung-uk Kim 					}
1136*7e382390SJung-uk Kim 
1137*7e382390SJung-uk Kim 					mkdata (accnum);
1138*7e382390SJung-uk Kim                     yyacclist_data[yyacclist_curr++] = accnum;
1139*7e382390SJung-uk Kim 
1140*7e382390SJung-uk Kim 					if (trace) {
1141*7e382390SJung-uk Kim 						fprintf (stderr, "[%d]",
1142*7e382390SJung-uk Kim 							 accset[k]);
1143*7e382390SJung-uk Kim 
1144*7e382390SJung-uk Kim 						if (k < nacc)
1145*7e382390SJung-uk Kim 							fputs (", ",
1146*7e382390SJung-uk Kim 							       stderr);
1147*7e382390SJung-uk Kim 						else
1148*7e382390SJung-uk Kim 							putc ('\n',
1149*7e382390SJung-uk Kim 							      stderr);
1150*7e382390SJung-uk Kim 					}
1151*7e382390SJung-uk Kim 				}
1152*7e382390SJung-uk Kim 			}
1153*7e382390SJung-uk Kim 		}
1154*7e382390SJung-uk Kim 
1155*7e382390SJung-uk Kim 		/* add accepting number for the "jam" state */
1156*7e382390SJung-uk Kim 		acc_array[i] = j;
1157*7e382390SJung-uk Kim 
1158*7e382390SJung-uk Kim 		dataend ();
1159*7e382390SJung-uk Kim         if (tablesext) {
1160*7e382390SJung-uk Kim             yytbl_data_compress (yyacclist_tbl);
1161*7e382390SJung-uk Kim             if (yytbl_data_fwrite (&tableswr, yyacclist_tbl) < 0)
1162*7e382390SJung-uk Kim                 flexerror (_("Could not write yyacclist_tbl"));
1163*7e382390SJung-uk Kim             yytbl_data_destroy (yyacclist_tbl);
1164*7e382390SJung-uk Kim             yyacclist_tbl = NULL;
1165*7e382390SJung-uk Kim         }
1166*7e382390SJung-uk Kim 	}
1167*7e382390SJung-uk Kim 
1168*7e382390SJung-uk Kim 	else {
1169*7e382390SJung-uk Kim 		dfaacc[end_of_buffer_state].dfaacc_state =
1170*7e382390SJung-uk Kim 			end_of_buffer_action;
1171*7e382390SJung-uk Kim 
1172*7e382390SJung-uk Kim 		for (i = 1; i <= lastdfa; ++i)
1173*7e382390SJung-uk Kim 			acc_array[i] = dfaacc[i].dfaacc_state;
1174*7e382390SJung-uk Kim 
1175*7e382390SJung-uk Kim 		/* add accepting number for jam state */
1176*7e382390SJung-uk Kim 		acc_array[i] = 0;
1177*7e382390SJung-uk Kim 	}
1178*7e382390SJung-uk Kim 
1179*7e382390SJung-uk Kim 	/* Begin generating yy_accept */
1180*7e382390SJung-uk Kim 
1181*7e382390SJung-uk Kim 	/* Spit out "yy_accept" array.  If we're doing "reject", it'll be
1182*7e382390SJung-uk Kim 	 * pointers into the "yy_acclist" array.  Otherwise it's actual
1183*7e382390SJung-uk Kim 	 * accepting numbers.  In either case, we just dump the numbers.
1184*7e382390SJung-uk Kim 	 */
1185*7e382390SJung-uk Kim 
1186*7e382390SJung-uk Kim 	/* "lastdfa + 2" is the size of "yy_accept"; includes room for C arrays
1187*7e382390SJung-uk Kim 	 * beginning at 0 and for "jam" state.
1188*7e382390SJung-uk Kim 	 */
1189*7e382390SJung-uk Kim 	k = lastdfa + 2;
1190*7e382390SJung-uk Kim 
1191*7e382390SJung-uk Kim 	if (reject)
1192*7e382390SJung-uk Kim 		/* We put a "cap" on the table associating lists of accepting
1193*7e382390SJung-uk Kim 		 * numbers with state numbers.  This is needed because we tell
1194*7e382390SJung-uk Kim 		 * where the end of an accepting list is by looking at where
1195*7e382390SJung-uk Kim 		 * the list for the next state starts.
1196*7e382390SJung-uk Kim 		 */
1197*7e382390SJung-uk Kim 		++k;
1198*7e382390SJung-uk Kim 
1199*7e382390SJung-uk Kim 	out_str_dec (long_align ? get_int32_decl () : get_int16_decl (),
1200*7e382390SJung-uk Kim 		     "yy_accept", k);
1201*7e382390SJung-uk Kim 
1202*7e382390SJung-uk Kim 	buf_prints (&yydmap_buf,
1203*7e382390SJung-uk Kim 		    "\t{YYTD_ID_ACCEPT, (void**)&yy_accept, sizeof(%s)},\n",
1204*7e382390SJung-uk Kim 		    long_align ? "flex_int32_t" : "flex_int16_t");
1205*7e382390SJung-uk Kim 
1206*7e382390SJung-uk Kim 	yyacc_tbl = calloc(1, sizeof (struct yytbl_data));
1207*7e382390SJung-uk Kim 	yytbl_data_init (yyacc_tbl, YYTD_ID_ACCEPT);
1208*7e382390SJung-uk Kim 	yyacc_tbl->td_lolen = (flex_uint32_t) k;
1209*7e382390SJung-uk Kim 	yyacc_tbl->td_data = yyacc_data =
1210*7e382390SJung-uk Kim 		calloc(yyacc_tbl->td_lolen, sizeof (flex_int32_t));
1211*7e382390SJung-uk Kim     yyacc_curr=1;
1212*7e382390SJung-uk Kim 
1213*7e382390SJung-uk Kim 	for (i = 1; i <= lastdfa; ++i) {
1214*7e382390SJung-uk Kim 		mkdata (acc_array[i]);
1215*7e382390SJung-uk Kim 		yyacc_data[yyacc_curr++] = acc_array[i];
1216*7e382390SJung-uk Kim 
1217*7e382390SJung-uk Kim 		if (!reject && trace && acc_array[i])
1218*7e382390SJung-uk Kim 			fprintf (stderr, _("state # %d accepts: [%d]\n"),
1219*7e382390SJung-uk Kim 				 i, acc_array[i]);
1220*7e382390SJung-uk Kim 	}
1221*7e382390SJung-uk Kim 
1222*7e382390SJung-uk Kim 	/* Add entry for "jam" state. */
1223*7e382390SJung-uk Kim 	mkdata (acc_array[i]);
1224*7e382390SJung-uk Kim 	yyacc_data[yyacc_curr++] = acc_array[i];
1225*7e382390SJung-uk Kim 
1226*7e382390SJung-uk Kim 	if (reject) {
1227*7e382390SJung-uk Kim 		/* Add "cap" for the list. */
1228*7e382390SJung-uk Kim 		mkdata (acc_array[i]);
1229*7e382390SJung-uk Kim 		yyacc_data[yyacc_curr++] = acc_array[i];
1230*7e382390SJung-uk Kim 	}
1231*7e382390SJung-uk Kim 
1232*7e382390SJung-uk Kim 	dataend ();
1233*7e382390SJung-uk Kim 	if (tablesext) {
1234*7e382390SJung-uk Kim 		yytbl_data_compress (yyacc_tbl);
1235*7e382390SJung-uk Kim 		if (yytbl_data_fwrite (&tableswr, yyacc_tbl) < 0)
1236*7e382390SJung-uk Kim 			flexerror (_("Could not write yyacc_tbl"));
1237*7e382390SJung-uk Kim 		yytbl_data_destroy (yyacc_tbl);
1238*7e382390SJung-uk Kim 		yyacc_tbl = NULL;
1239*7e382390SJung-uk Kim 	}
1240*7e382390SJung-uk Kim 	/* End generating yy_accept */
1241*7e382390SJung-uk Kim 
1242*7e382390SJung-uk Kim 	if (useecs) {
1243*7e382390SJung-uk Kim 
1244*7e382390SJung-uk Kim 		genecs ();
1245*7e382390SJung-uk Kim 		if (tablesext) {
1246*7e382390SJung-uk Kim 			struct yytbl_data *tbl;
1247*7e382390SJung-uk Kim 
1248*7e382390SJung-uk Kim 			tbl = mkecstbl ();
1249*7e382390SJung-uk Kim 			yytbl_data_compress (tbl);
1250*7e382390SJung-uk Kim 			if (yytbl_data_fwrite (&tableswr, tbl) < 0)
1251*7e382390SJung-uk Kim 				flexerror (_("Could not write ecstbl"));
1252*7e382390SJung-uk Kim 			yytbl_data_destroy (tbl);
1253*7e382390SJung-uk Kim 			tbl = 0;
1254*7e382390SJung-uk Kim 		}
1255*7e382390SJung-uk Kim 	}
1256*7e382390SJung-uk Kim 
1257*7e382390SJung-uk Kim 	if (usemecs) {
1258*7e382390SJung-uk Kim 		/* Begin generating yy_meta */
1259*7e382390SJung-uk Kim 		/* Write out meta-equivalence classes (used to index
1260*7e382390SJung-uk Kim 		 * templates with).
1261*7e382390SJung-uk Kim 		 */
1262*7e382390SJung-uk Kim 		flex_int32_t *yymecs_data = 0;
1263*7e382390SJung-uk Kim 		yymeta_tbl = calloc(1, sizeof (struct yytbl_data));
1264*7e382390SJung-uk Kim 		yytbl_data_init (yymeta_tbl, YYTD_ID_META);
1265*7e382390SJung-uk Kim 		yymeta_tbl->td_lolen = (flex_uint32_t) (numecs + 1);
1266*7e382390SJung-uk Kim 		yymeta_tbl->td_data = yymecs_data =
1267*7e382390SJung-uk Kim 			calloc(yymeta_tbl->td_lolen,
1268*7e382390SJung-uk Kim 					    sizeof (flex_int32_t));
1269*7e382390SJung-uk Kim 
1270*7e382390SJung-uk Kim 		if (trace)
1271*7e382390SJung-uk Kim 			fputs (_("\n\nMeta-Equivalence Classes:\n"),
1272*7e382390SJung-uk Kim 			       stderr);
1273*7e382390SJung-uk Kim 
1274*7e382390SJung-uk Kim 		out_str_dec (get_yy_char_decl (), "yy_meta", numecs + 1);
1275*7e382390SJung-uk Kim 		buf_prints (&yydmap_buf,
1276*7e382390SJung-uk Kim 			    "\t{YYTD_ID_META, (void**)&yy_meta, sizeof(%s)},\n",
1277*7e382390SJung-uk Kim 			    "YY_CHAR");
1278*7e382390SJung-uk Kim 
1279*7e382390SJung-uk Kim 		for (i = 1; i <= numecs; ++i) {
1280*7e382390SJung-uk Kim 			if (trace)
1281*7e382390SJung-uk Kim 				fprintf (stderr, "%d = %d\n",
1282*7e382390SJung-uk Kim 					 i, ABS (tecbck[i]));
1283*7e382390SJung-uk Kim 
1284*7e382390SJung-uk Kim 			mkdata (ABS (tecbck[i]));
1285*7e382390SJung-uk Kim 			yymecs_data[i] = ABS (tecbck[i]);
1286*7e382390SJung-uk Kim 		}
1287*7e382390SJung-uk Kim 
1288*7e382390SJung-uk Kim 		dataend ();
1289*7e382390SJung-uk Kim 		if (tablesext) {
1290*7e382390SJung-uk Kim 			yytbl_data_compress (yymeta_tbl);
1291*7e382390SJung-uk Kim 			if (yytbl_data_fwrite (&tableswr, yymeta_tbl) < 0)
1292*7e382390SJung-uk Kim 				flexerror (_
1293*7e382390SJung-uk Kim 					   ("Could not write yymeta_tbl"));
1294*7e382390SJung-uk Kim 			yytbl_data_destroy (yymeta_tbl);
1295*7e382390SJung-uk Kim 			yymeta_tbl = NULL;
1296*7e382390SJung-uk Kim 		}
1297*7e382390SJung-uk Kim 		/* End generating yy_meta */
1298*7e382390SJung-uk Kim 	}
1299*7e382390SJung-uk Kim 
1300*7e382390SJung-uk Kim 	total_states = lastdfa + numtemps;
1301*7e382390SJung-uk Kim 
1302*7e382390SJung-uk Kim 	/* Begin generating yy_base */
1303*7e382390SJung-uk Kim 	out_str_dec ((tblend >= INT16_MAX || long_align) ?
1304*7e382390SJung-uk Kim 		     get_int32_decl () : get_int16_decl (),
1305*7e382390SJung-uk Kim 		     "yy_base", total_states + 1);
1306*7e382390SJung-uk Kim 
1307*7e382390SJung-uk Kim 	buf_prints (&yydmap_buf,
1308*7e382390SJung-uk Kim 		    "\t{YYTD_ID_BASE, (void**)&yy_base, sizeof(%s)},\n",
1309*7e382390SJung-uk Kim 		    (tblend >= INT16_MAX
1310*7e382390SJung-uk Kim 		     || long_align) ? "flex_int32_t" : "flex_int16_t");
1311*7e382390SJung-uk Kim 	yybase_tbl = calloc (1, sizeof (struct yytbl_data));
1312*7e382390SJung-uk Kim 	yytbl_data_init (yybase_tbl, YYTD_ID_BASE);
1313*7e382390SJung-uk Kim 	yybase_tbl->td_lolen = (flex_uint32_t) (total_states + 1);
1314*7e382390SJung-uk Kim 	yybase_tbl->td_data = yybase_data =
1315*7e382390SJung-uk Kim 		calloc(yybase_tbl->td_lolen,
1316*7e382390SJung-uk Kim 				    sizeof (flex_int32_t));
1317*7e382390SJung-uk Kim 	yybase_curr = 1;
1318*7e382390SJung-uk Kim 
1319*7e382390SJung-uk Kim 	for (i = 1; i <= lastdfa; ++i) {
1320*7e382390SJung-uk Kim 		int d = def[i];
1321*7e382390SJung-uk Kim 
1322*7e382390SJung-uk Kim 		if (base[i] == JAMSTATE)
1323*7e382390SJung-uk Kim 			base[i] = jambase;
1324*7e382390SJung-uk Kim 
1325*7e382390SJung-uk Kim 		if (d == JAMSTATE)
1326*7e382390SJung-uk Kim 			def[i] = jamstate;
1327*7e382390SJung-uk Kim 
1328*7e382390SJung-uk Kim 		else if (d < 0) {
1329*7e382390SJung-uk Kim 			/* Template reference. */
1330*7e382390SJung-uk Kim 			++tmpuses;
1331*7e382390SJung-uk Kim 			def[i] = lastdfa - d + 1;
1332*7e382390SJung-uk Kim 		}
1333*7e382390SJung-uk Kim 
1334*7e382390SJung-uk Kim 		mkdata (base[i]);
1335*7e382390SJung-uk Kim 		yybase_data[yybase_curr++] = base[i];
1336*7e382390SJung-uk Kim 	}
1337*7e382390SJung-uk Kim 
1338*7e382390SJung-uk Kim 	/* Generate jam state's base index. */
1339*7e382390SJung-uk Kim 	mkdata (base[i]);
1340*7e382390SJung-uk Kim 	yybase_data[yybase_curr++] = base[i];
1341*7e382390SJung-uk Kim 
1342*7e382390SJung-uk Kim 	for (++i /* skip jam state */ ; i <= total_states; ++i) {
1343*7e382390SJung-uk Kim 		mkdata (base[i]);
1344*7e382390SJung-uk Kim 		yybase_data[yybase_curr++] = base[i];
1345*7e382390SJung-uk Kim 		def[i] = jamstate;
1346*7e382390SJung-uk Kim 	}
1347*7e382390SJung-uk Kim 
1348*7e382390SJung-uk Kim 	dataend ();
1349*7e382390SJung-uk Kim 	if (tablesext) {
1350*7e382390SJung-uk Kim 		yytbl_data_compress (yybase_tbl);
1351*7e382390SJung-uk Kim 		if (yytbl_data_fwrite (&tableswr, yybase_tbl) < 0)
1352*7e382390SJung-uk Kim 			flexerror (_("Could not write yybase_tbl"));
1353*7e382390SJung-uk Kim 		yytbl_data_destroy (yybase_tbl);
1354*7e382390SJung-uk Kim 		yybase_tbl = NULL;
1355*7e382390SJung-uk Kim 	}
1356*7e382390SJung-uk Kim 	/* End generating yy_base */
1357*7e382390SJung-uk Kim 
1358*7e382390SJung-uk Kim 
1359*7e382390SJung-uk Kim 	/* Begin generating yy_def */
1360*7e382390SJung-uk Kim 	out_str_dec ((total_states >= INT16_MAX || long_align) ?
1361*7e382390SJung-uk Kim 		     get_int32_decl () : get_int16_decl (),
1362*7e382390SJung-uk Kim 		     "yy_def", total_states + 1);
1363*7e382390SJung-uk Kim 
1364*7e382390SJung-uk Kim 	buf_prints (&yydmap_buf,
1365*7e382390SJung-uk Kim 		    "\t{YYTD_ID_DEF, (void**)&yy_def, sizeof(%s)},\n",
1366*7e382390SJung-uk Kim 		    (total_states >= INT16_MAX
1367*7e382390SJung-uk Kim 		     || long_align) ? "flex_int32_t" : "flex_int16_t");
1368*7e382390SJung-uk Kim 
1369*7e382390SJung-uk Kim 	yydef_tbl = calloc(1, sizeof (struct yytbl_data));
1370*7e382390SJung-uk Kim 	yytbl_data_init (yydef_tbl, YYTD_ID_DEF);
1371*7e382390SJung-uk Kim 	yydef_tbl->td_lolen = (flex_uint32_t) (total_states + 1);
1372*7e382390SJung-uk Kim 	yydef_tbl->td_data = yydef_data =
1373*7e382390SJung-uk Kim 		calloc(yydef_tbl->td_lolen, sizeof (flex_int32_t));
1374*7e382390SJung-uk Kim 
1375*7e382390SJung-uk Kim 	for (i = 1; i <= total_states; ++i) {
1376*7e382390SJung-uk Kim 		mkdata (def[i]);
1377*7e382390SJung-uk Kim 		yydef_data[i] = def[i];
1378*7e382390SJung-uk Kim 	}
1379*7e382390SJung-uk Kim 
1380*7e382390SJung-uk Kim 	dataend ();
1381*7e382390SJung-uk Kim 	if (tablesext) {
1382*7e382390SJung-uk Kim 		yytbl_data_compress (yydef_tbl);
1383*7e382390SJung-uk Kim 		if (yytbl_data_fwrite (&tableswr, yydef_tbl) < 0)
1384*7e382390SJung-uk Kim 			flexerror (_("Could not write yydef_tbl"));
1385*7e382390SJung-uk Kim 		yytbl_data_destroy (yydef_tbl);
1386*7e382390SJung-uk Kim 		yydef_tbl = NULL;
1387*7e382390SJung-uk Kim 	}
1388*7e382390SJung-uk Kim 	/* End generating yy_def */
1389*7e382390SJung-uk Kim 
1390*7e382390SJung-uk Kim 
1391*7e382390SJung-uk Kim 	/* Begin generating yy_nxt */
1392*7e382390SJung-uk Kim 	out_str_dec ((total_states >= INT16_MAX || long_align) ?
1393*7e382390SJung-uk Kim 		     get_int32_decl () : get_int16_decl (), "yy_nxt",
1394*7e382390SJung-uk Kim 		     tblend + 1);
1395*7e382390SJung-uk Kim 
1396*7e382390SJung-uk Kim 	buf_prints (&yydmap_buf,
1397*7e382390SJung-uk Kim 		    "\t{YYTD_ID_NXT, (void**)&yy_nxt, sizeof(%s)},\n",
1398*7e382390SJung-uk Kim 		    (total_states >= INT16_MAX
1399*7e382390SJung-uk Kim 		     || long_align) ? "flex_int32_t" : "flex_int16_t");
1400*7e382390SJung-uk Kim 
1401*7e382390SJung-uk Kim 	yynxt_tbl = calloc (1, sizeof (struct yytbl_data));
1402*7e382390SJung-uk Kim 	yytbl_data_init (yynxt_tbl, YYTD_ID_NXT);
1403*7e382390SJung-uk Kim 	yynxt_tbl->td_lolen = (flex_uint32_t) (tblend + 1);
1404*7e382390SJung-uk Kim 	yynxt_tbl->td_data = yynxt_data =
1405*7e382390SJung-uk Kim 		calloc (yynxt_tbl->td_lolen, sizeof (flex_int32_t));
1406*7e382390SJung-uk Kim 
1407*7e382390SJung-uk Kim 	for (i = 1; i <= tblend; ++i) {
1408*7e382390SJung-uk Kim 		/* Note, the order of the following test is important.
1409*7e382390SJung-uk Kim 		 * If chk[i] is 0, then nxt[i] is undefined.
1410*7e382390SJung-uk Kim 		 */
1411*7e382390SJung-uk Kim 		if (chk[i] == 0 || nxt[i] == 0)
1412*7e382390SJung-uk Kim 			nxt[i] = jamstate;	/* new state is the JAM state */
1413*7e382390SJung-uk Kim 
1414*7e382390SJung-uk Kim 		mkdata (nxt[i]);
1415*7e382390SJung-uk Kim 		yynxt_data[i] = nxt[i];
1416*7e382390SJung-uk Kim 	}
1417*7e382390SJung-uk Kim 
1418*7e382390SJung-uk Kim 	dataend ();
1419*7e382390SJung-uk Kim 	if (tablesext) {
1420*7e382390SJung-uk Kim 		yytbl_data_compress (yynxt_tbl);
1421*7e382390SJung-uk Kim 		if (yytbl_data_fwrite (&tableswr, yynxt_tbl) < 0)
1422*7e382390SJung-uk Kim 			flexerror (_("Could not write yynxt_tbl"));
1423*7e382390SJung-uk Kim 		yytbl_data_destroy (yynxt_tbl);
1424*7e382390SJung-uk Kim 		yynxt_tbl = NULL;
1425*7e382390SJung-uk Kim 	}
1426*7e382390SJung-uk Kim 	/* End generating yy_nxt */
1427*7e382390SJung-uk Kim 
1428*7e382390SJung-uk Kim 	/* Begin generating yy_chk */
1429*7e382390SJung-uk Kim 	out_str_dec ((total_states >= INT16_MAX || long_align) ?
1430*7e382390SJung-uk Kim 		     get_int32_decl () : get_int16_decl (), "yy_chk",
1431*7e382390SJung-uk Kim 		     tblend + 1);
1432*7e382390SJung-uk Kim 
1433*7e382390SJung-uk Kim 	buf_prints (&yydmap_buf,
1434*7e382390SJung-uk Kim 		    "\t{YYTD_ID_CHK, (void**)&yy_chk, sizeof(%s)},\n",
1435*7e382390SJung-uk Kim 		    (total_states >= INT16_MAX
1436*7e382390SJung-uk Kim 		     || long_align) ? "flex_int32_t" : "flex_int16_t");
1437*7e382390SJung-uk Kim 
1438*7e382390SJung-uk Kim 	yychk_tbl = calloc (1, sizeof (struct yytbl_data));
1439*7e382390SJung-uk Kim 	yytbl_data_init (yychk_tbl, YYTD_ID_CHK);
1440*7e382390SJung-uk Kim 	yychk_tbl->td_lolen = (flex_uint32_t) (tblend + 1);
1441*7e382390SJung-uk Kim 	yychk_tbl->td_data = yychk_data =
1442*7e382390SJung-uk Kim 		calloc(yychk_tbl->td_lolen, sizeof (flex_int32_t));
1443*7e382390SJung-uk Kim 
1444*7e382390SJung-uk Kim 	for (i = 1; i <= tblend; ++i) {
1445*7e382390SJung-uk Kim 		if (chk[i] == 0)
1446*7e382390SJung-uk Kim 			++nummt;
1447*7e382390SJung-uk Kim 
1448*7e382390SJung-uk Kim 		mkdata (chk[i]);
1449*7e382390SJung-uk Kim 		yychk_data[i] = chk[i];
1450*7e382390SJung-uk Kim 	}
1451*7e382390SJung-uk Kim 
1452*7e382390SJung-uk Kim 	dataend ();
1453*7e382390SJung-uk Kim 	if (tablesext) {
1454*7e382390SJung-uk Kim 		yytbl_data_compress (yychk_tbl);
1455*7e382390SJung-uk Kim 		if (yytbl_data_fwrite (&tableswr, yychk_tbl) < 0)
1456*7e382390SJung-uk Kim 			flexerror (_("Could not write yychk_tbl"));
1457*7e382390SJung-uk Kim 		yytbl_data_destroy (yychk_tbl);
1458*7e382390SJung-uk Kim 		yychk_tbl = NULL;
1459*7e382390SJung-uk Kim 	}
1460*7e382390SJung-uk Kim 	/* End generating yy_chk */
1461*7e382390SJung-uk Kim 
1462*7e382390SJung-uk Kim 	free(acc_array);
1463*7e382390SJung-uk Kim }
1464*7e382390SJung-uk Kim 
1465*7e382390SJung-uk Kim 
1466*7e382390SJung-uk Kim /* Write out a formatted string (with a secondary string argument) at the
1467*7e382390SJung-uk Kim  * current indentation level, adding a final newline.
1468*7e382390SJung-uk Kim  */
1469*7e382390SJung-uk Kim 
indent_put2s(const char * fmt,const char * arg)1470*7e382390SJung-uk Kim void indent_put2s (const char *fmt, const char *arg)
1471*7e382390SJung-uk Kim {
1472*7e382390SJung-uk Kim 	do_indent ();
1473*7e382390SJung-uk Kim 	out_str (fmt, arg);
1474*7e382390SJung-uk Kim 	outn ("");
1475*7e382390SJung-uk Kim }
1476*7e382390SJung-uk Kim 
1477*7e382390SJung-uk Kim 
1478*7e382390SJung-uk Kim /* Write out a string at the current indentation level, adding a final
1479*7e382390SJung-uk Kim  * newline.
1480*7e382390SJung-uk Kim  */
1481*7e382390SJung-uk Kim 
indent_puts(const char * str)1482*7e382390SJung-uk Kim void indent_puts (const char *str)
1483*7e382390SJung-uk Kim {
1484*7e382390SJung-uk Kim 	do_indent ();
1485*7e382390SJung-uk Kim 	outn (str);
1486*7e382390SJung-uk Kim }
1487*7e382390SJung-uk Kim 
1488*7e382390SJung-uk Kim 
1489*7e382390SJung-uk Kim /* make_tables - generate transition tables and finishes generating output file
1490*7e382390SJung-uk Kim  */
1491*7e382390SJung-uk Kim 
make_tables(void)1492*7e382390SJung-uk Kim void make_tables (void)
1493*7e382390SJung-uk Kim {
1494*7e382390SJung-uk Kim 	int i;
1495*7e382390SJung-uk Kim 	int did_eof_rule = false;
1496*7e382390SJung-uk Kim 	struct yytbl_data *yynultrans_tbl = NULL;
1497*7e382390SJung-uk Kim 
1498*7e382390SJung-uk Kim 
1499*7e382390SJung-uk Kim 	skelout ();		/* %% [2.0] - break point in skel */
1500*7e382390SJung-uk Kim 
1501*7e382390SJung-uk Kim 	/* First, take care of YY_DO_BEFORE_ACTION depending on yymore
1502*7e382390SJung-uk Kim 	 * being used.
1503*7e382390SJung-uk Kim 	 */
1504*7e382390SJung-uk Kim 	set_indent (1);
1505*7e382390SJung-uk Kim 
1506*7e382390SJung-uk Kim 	if (yymore_used && !yytext_is_array) {
1507*7e382390SJung-uk Kim 		indent_puts ("YY_G(yytext_ptr) -= YY_G(yy_more_len); \\");
1508*7e382390SJung-uk Kim 		indent_puts
1509*7e382390SJung-uk Kim 			("yyleng = (int) (yy_cp - YY_G(yytext_ptr)); \\");
1510*7e382390SJung-uk Kim 	}
1511*7e382390SJung-uk Kim 
1512*7e382390SJung-uk Kim 	else
1513*7e382390SJung-uk Kim 		indent_puts ("yyleng = (int) (yy_cp - yy_bp); \\");
1514*7e382390SJung-uk Kim 
1515*7e382390SJung-uk Kim 	/* Now also deal with copying yytext_ptr to yytext if needed. */
1516*7e382390SJung-uk Kim 	skelout ();		/* %% [3.0] - break point in skel */
1517*7e382390SJung-uk Kim 	if (yytext_is_array) {
1518*7e382390SJung-uk Kim 		if (yymore_used)
1519*7e382390SJung-uk Kim 			indent_puts
1520*7e382390SJung-uk Kim 				("if ( yyleng + YY_G(yy_more_offset) >= YYLMAX ) \\");
1521*7e382390SJung-uk Kim 		else
1522*7e382390SJung-uk Kim 			indent_puts ("if ( yyleng >= YYLMAX ) \\");
1523*7e382390SJung-uk Kim 
1524*7e382390SJung-uk Kim 		++indent_level;
1525*7e382390SJung-uk Kim 		indent_puts
1526*7e382390SJung-uk Kim 			("YY_FATAL_ERROR( \"token too large, exceeds YYLMAX\" ); \\");
1527*7e382390SJung-uk Kim 		--indent_level;
1528*7e382390SJung-uk Kim 
1529*7e382390SJung-uk Kim 		if (yymore_used) {
1530*7e382390SJung-uk Kim 			indent_puts
1531*7e382390SJung-uk Kim 				("yy_flex_strncpy( &yytext[YY_G(yy_more_offset)], YY_G(yytext_ptr), yyleng + 1 M4_YY_CALL_LAST_ARG); \\");
1532*7e382390SJung-uk Kim 			indent_puts ("yyleng += YY_G(yy_more_offset); \\");
1533*7e382390SJung-uk Kim 			indent_puts
1534*7e382390SJung-uk Kim 				("YY_G(yy_prev_more_offset) = YY_G(yy_more_offset); \\");
1535*7e382390SJung-uk Kim 			indent_puts ("YY_G(yy_more_offset) = 0; \\");
1536*7e382390SJung-uk Kim 		}
1537*7e382390SJung-uk Kim 		else {
1538*7e382390SJung-uk Kim 			indent_puts
1539*7e382390SJung-uk Kim 				("yy_flex_strncpy( yytext, YY_G(yytext_ptr), yyleng + 1 M4_YY_CALL_LAST_ARG); \\");
1540*7e382390SJung-uk Kim 		}
1541*7e382390SJung-uk Kim 	}
1542*7e382390SJung-uk Kim 
1543*7e382390SJung-uk Kim 	set_indent (0);
1544*7e382390SJung-uk Kim 
1545*7e382390SJung-uk Kim 	skelout ();		/* %% [4.0] - break point in skel */
1546*7e382390SJung-uk Kim 
1547*7e382390SJung-uk Kim 
1548*7e382390SJung-uk Kim 	/* This is where we REALLY begin generating the tables. */
1549*7e382390SJung-uk Kim 
1550*7e382390SJung-uk Kim 	out_dec ("#define YY_NUM_RULES %d\n", num_rules);
1551*7e382390SJung-uk Kim 	out_dec ("#define YY_END_OF_BUFFER %d\n", num_rules + 1);
1552*7e382390SJung-uk Kim 
1553*7e382390SJung-uk Kim 	if (fullspd) {
1554*7e382390SJung-uk Kim 		/* Need to define the transet type as a size large
1555*7e382390SJung-uk Kim 		 * enough to hold the biggest offset.
1556*7e382390SJung-uk Kim 		 */
1557*7e382390SJung-uk Kim 		int     total_table_size = tblend + numecs + 1;
1558*7e382390SJung-uk Kim 		char   *trans_offset_type =
1559*7e382390SJung-uk Kim 			(total_table_size >= INT16_MAX || long_align) ?
1560*7e382390SJung-uk Kim 			"flex_int32_t" : "flex_int16_t";
1561*7e382390SJung-uk Kim 
1562*7e382390SJung-uk Kim 		set_indent (0);
1563*7e382390SJung-uk Kim 		indent_puts ("struct yy_trans_info");
1564*7e382390SJung-uk Kim 		++indent_level;
1565*7e382390SJung-uk Kim 		indent_puts ("{");
1566*7e382390SJung-uk Kim 
1567*7e382390SJung-uk Kim 		/* We require that yy_verify and yy_nxt must be of the same size int. */
1568*7e382390SJung-uk Kim 		indent_put2s ("%s yy_verify;", trans_offset_type);
1569*7e382390SJung-uk Kim 
1570*7e382390SJung-uk Kim 		/* In cases where its sister yy_verify *is* a "yes, there is
1571*7e382390SJung-uk Kim 		 * a transition", yy_nxt is the offset (in records) to the
1572*7e382390SJung-uk Kim 		 * next state.  In most cases where there is no transition,
1573*7e382390SJung-uk Kim 		 * the value of yy_nxt is irrelevant.  If yy_nxt is the -1th
1574*7e382390SJung-uk Kim 		 * record of a state, though, then yy_nxt is the action number
1575*7e382390SJung-uk Kim 		 * for that state.
1576*7e382390SJung-uk Kim 		 */
1577*7e382390SJung-uk Kim 
1578*7e382390SJung-uk Kim 		indent_put2s ("%s yy_nxt;", trans_offset_type);
1579*7e382390SJung-uk Kim 		indent_puts ("};");
1580*7e382390SJung-uk Kim 		--indent_level;
1581*7e382390SJung-uk Kim 	}
1582*7e382390SJung-uk Kim 	else {
1583*7e382390SJung-uk Kim 		/* We generate a bogus 'struct yy_trans_info' data type
1584*7e382390SJung-uk Kim 		 * so we can guarantee that it is always declared in the skel.
1585*7e382390SJung-uk Kim 		 * This is so we can compile "sizeof(struct yy_trans_info)"
1586*7e382390SJung-uk Kim 		 * in any scanner.
1587*7e382390SJung-uk Kim 		 */
1588*7e382390SJung-uk Kim 		indent_puts
1589*7e382390SJung-uk Kim 			("/* This struct is not used in this scanner,");
1590*7e382390SJung-uk Kim 		indent_puts ("   but its presence is necessary. */");
1591*7e382390SJung-uk Kim 		indent_puts ("struct yy_trans_info");
1592*7e382390SJung-uk Kim 		++indent_level;
1593*7e382390SJung-uk Kim 		indent_puts ("{");
1594*7e382390SJung-uk Kim 		indent_puts ("flex_int32_t yy_verify;");
1595*7e382390SJung-uk Kim 		indent_puts ("flex_int32_t yy_nxt;");
1596*7e382390SJung-uk Kim 		indent_puts ("};");
1597*7e382390SJung-uk Kim 		--indent_level;
1598*7e382390SJung-uk Kim 	}
1599*7e382390SJung-uk Kim 
1600*7e382390SJung-uk Kim 	if (fullspd) {
1601*7e382390SJung-uk Kim 		genctbl ();
1602*7e382390SJung-uk Kim 		if (tablesext) {
1603*7e382390SJung-uk Kim 			struct yytbl_data *tbl;
1604*7e382390SJung-uk Kim 
1605*7e382390SJung-uk Kim 			tbl = mkctbl ();
1606*7e382390SJung-uk Kim 			yytbl_data_compress (tbl);
1607*7e382390SJung-uk Kim 			if (yytbl_data_fwrite (&tableswr, tbl) < 0)
1608*7e382390SJung-uk Kim 				flexerror (_("Could not write ftbl"));
1609*7e382390SJung-uk Kim 			yytbl_data_destroy (tbl);
1610*7e382390SJung-uk Kim 
1611*7e382390SJung-uk Kim 			tbl = mkssltbl ();
1612*7e382390SJung-uk Kim 			yytbl_data_compress (tbl);
1613*7e382390SJung-uk Kim 			if (yytbl_data_fwrite (&tableswr, tbl) < 0)
1614*7e382390SJung-uk Kim 				flexerror (_("Could not write ssltbl"));
1615*7e382390SJung-uk Kim 			yytbl_data_destroy (tbl);
1616*7e382390SJung-uk Kim 			tbl = 0;
1617*7e382390SJung-uk Kim 
1618*7e382390SJung-uk Kim 			if (useecs) {
1619*7e382390SJung-uk Kim 				tbl = mkecstbl ();
1620*7e382390SJung-uk Kim 				yytbl_data_compress (tbl);
1621*7e382390SJung-uk Kim 				if (yytbl_data_fwrite (&tableswr, tbl) < 0)
1622*7e382390SJung-uk Kim 					flexerror (_
1623*7e382390SJung-uk Kim 						   ("Could not write ecstbl"));
1624*7e382390SJung-uk Kim 				yytbl_data_destroy (tbl);
1625*7e382390SJung-uk Kim 				tbl = 0;
1626*7e382390SJung-uk Kim 			}
1627*7e382390SJung-uk Kim 		}
1628*7e382390SJung-uk Kim 	}
1629*7e382390SJung-uk Kim 	else if (fulltbl) {
1630*7e382390SJung-uk Kim 		genftbl ();
1631*7e382390SJung-uk Kim 		if (tablesext) {
1632*7e382390SJung-uk Kim 			struct yytbl_data *tbl;
1633*7e382390SJung-uk Kim 
1634*7e382390SJung-uk Kim 			tbl = mkftbl ();
1635*7e382390SJung-uk Kim 			yytbl_data_compress (tbl);
1636*7e382390SJung-uk Kim 			if (yytbl_data_fwrite (&tableswr, tbl) < 0)
1637*7e382390SJung-uk Kim 				flexerror (_("Could not write ftbl"));
1638*7e382390SJung-uk Kim 			yytbl_data_destroy (tbl);
1639*7e382390SJung-uk Kim 			tbl = 0;
1640*7e382390SJung-uk Kim 
1641*7e382390SJung-uk Kim 			if (useecs) {
1642*7e382390SJung-uk Kim 				tbl = mkecstbl ();
1643*7e382390SJung-uk Kim 				yytbl_data_compress (tbl);
1644*7e382390SJung-uk Kim 				if (yytbl_data_fwrite (&tableswr, tbl) < 0)
1645*7e382390SJung-uk Kim 					flexerror (_
1646*7e382390SJung-uk Kim 						   ("Could not write ecstbl"));
1647*7e382390SJung-uk Kim 				yytbl_data_destroy (tbl);
1648*7e382390SJung-uk Kim 				tbl = 0;
1649*7e382390SJung-uk Kim 			}
1650*7e382390SJung-uk Kim 		}
1651*7e382390SJung-uk Kim 	}
1652*7e382390SJung-uk Kim 	else
1653*7e382390SJung-uk Kim 		gentabs ();
1654*7e382390SJung-uk Kim 
1655*7e382390SJung-uk Kim 	if (do_yylineno) {
1656*7e382390SJung-uk Kim 
1657*7e382390SJung-uk Kim 		geneoltbl ();
1658*7e382390SJung-uk Kim 
1659*7e382390SJung-uk Kim 		if (tablesext) {
1660*7e382390SJung-uk Kim 			struct yytbl_data *tbl;
1661*7e382390SJung-uk Kim 
1662*7e382390SJung-uk Kim 			tbl = mkeoltbl ();
1663*7e382390SJung-uk Kim 			yytbl_data_compress (tbl);
1664*7e382390SJung-uk Kim 			if (yytbl_data_fwrite (&tableswr, tbl) < 0)
1665*7e382390SJung-uk Kim 				flexerror (_("Could not write eoltbl"));
1666*7e382390SJung-uk Kim 			yytbl_data_destroy (tbl);
1667*7e382390SJung-uk Kim 			tbl = 0;
1668*7e382390SJung-uk Kim 		}
1669*7e382390SJung-uk Kim 	}
1670*7e382390SJung-uk Kim 
1671*7e382390SJung-uk Kim 	/* Definitions for backing up.  We don't need them if REJECT
1672*7e382390SJung-uk Kim 	 * is being used because then we use an alternative backin-up
1673*7e382390SJung-uk Kim 	 * technique instead.
1674*7e382390SJung-uk Kim 	 */
1675*7e382390SJung-uk Kim 	if (num_backing_up > 0 && !reject) {
1676*7e382390SJung-uk Kim 		if (!C_plus_plus && !reentrant) {
1677*7e382390SJung-uk Kim 			indent_puts
1678*7e382390SJung-uk Kim 				("static yy_state_type yy_last_accepting_state;");
1679*7e382390SJung-uk Kim 			indent_puts
1680*7e382390SJung-uk Kim 				("static char *yy_last_accepting_cpos;\n");
1681*7e382390SJung-uk Kim 		}
1682*7e382390SJung-uk Kim 	}
1683*7e382390SJung-uk Kim 
1684*7e382390SJung-uk Kim 	if (nultrans) {
1685*7e382390SJung-uk Kim 		flex_int32_t *yynultrans_data = 0;
1686*7e382390SJung-uk Kim 
1687*7e382390SJung-uk Kim 		/* Begin generating yy_NUL_trans */
1688*7e382390SJung-uk Kim 		out_str_dec (get_state_decl (), "yy_NUL_trans",
1689*7e382390SJung-uk Kim 			     lastdfa + 1);
1690*7e382390SJung-uk Kim 		buf_prints (&yydmap_buf,
1691*7e382390SJung-uk Kim 			    "\t{YYTD_ID_NUL_TRANS, (void**)&yy_NUL_trans, sizeof(%s)},\n",
1692*7e382390SJung-uk Kim 			    (fullspd) ? "struct yy_trans_info*" :
1693*7e382390SJung-uk Kim 			    "flex_int32_t");
1694*7e382390SJung-uk Kim 
1695*7e382390SJung-uk Kim 		yynultrans_tbl = calloc(1, sizeof (struct yytbl_data));
1696*7e382390SJung-uk Kim 		yytbl_data_init (yynultrans_tbl, YYTD_ID_NUL_TRANS);
1697*7e382390SJung-uk Kim 		if (fullspd)
1698*7e382390SJung-uk Kim 			yynultrans_tbl->td_flags |= YYTD_PTRANS;
1699*7e382390SJung-uk Kim 		yynultrans_tbl->td_lolen = (flex_uint32_t) (lastdfa + 1);
1700*7e382390SJung-uk Kim 		yynultrans_tbl->td_data = yynultrans_data =
1701*7e382390SJung-uk Kim 			calloc(yynultrans_tbl->td_lolen,
1702*7e382390SJung-uk Kim 					    sizeof (flex_int32_t));
1703*7e382390SJung-uk Kim 
1704*7e382390SJung-uk Kim 		for (i = 1; i <= lastdfa; ++i) {
1705*7e382390SJung-uk Kim 			if (fullspd) {
1706*7e382390SJung-uk Kim 				out_dec ("    &yy_transition[%d],\n",
1707*7e382390SJung-uk Kim 					 base[i]);
1708*7e382390SJung-uk Kim 				yynultrans_data[i] = base[i];
1709*7e382390SJung-uk Kim 			}
1710*7e382390SJung-uk Kim 			else {
1711*7e382390SJung-uk Kim 				mkdata (nultrans[i]);
1712*7e382390SJung-uk Kim 				yynultrans_data[i] = nultrans[i];
1713*7e382390SJung-uk Kim 			}
1714*7e382390SJung-uk Kim 		}
1715*7e382390SJung-uk Kim 
1716*7e382390SJung-uk Kim 		dataend ();
1717*7e382390SJung-uk Kim 		if (tablesext) {
1718*7e382390SJung-uk Kim 			yytbl_data_compress (yynultrans_tbl);
1719*7e382390SJung-uk Kim 			if (yytbl_data_fwrite (&tableswr, yynultrans_tbl) <
1720*7e382390SJung-uk Kim 			    0)
1721*7e382390SJung-uk Kim 				flexerror (_
1722*7e382390SJung-uk Kim 					   ("Could not write yynultrans_tbl"));
1723*7e382390SJung-uk Kim 		}
1724*7e382390SJung-uk Kim 
1725*7e382390SJung-uk Kim 		if (yynultrans_tbl != NULL) {
1726*7e382390SJung-uk Kim 			yytbl_data_destroy (yynultrans_tbl);
1727*7e382390SJung-uk Kim 			yynultrans_tbl = NULL;
1728*7e382390SJung-uk Kim         }
1729*7e382390SJung-uk Kim 
1730*7e382390SJung-uk Kim 		/* End generating yy_NUL_trans */
1731*7e382390SJung-uk Kim 	}
1732*7e382390SJung-uk Kim 
1733*7e382390SJung-uk Kim 	if (!C_plus_plus && !reentrant) {
1734*7e382390SJung-uk Kim 		indent_puts ("extern int yy_flex_debug;");
1735*7e382390SJung-uk Kim 		indent_put2s ("int yy_flex_debug = %s;\n",
1736*7e382390SJung-uk Kim 			      ddebug ? "1" : "0");
1737*7e382390SJung-uk Kim 	}
1738*7e382390SJung-uk Kim 
1739*7e382390SJung-uk Kim 	if (ddebug) {		/* Spit out table mapping rules to line numbers. */
1740*7e382390SJung-uk Kim 		out_str_dec (long_align ? get_int32_decl () :
1741*7e382390SJung-uk Kim 			     get_int16_decl (), "yy_rule_linenum",
1742*7e382390SJung-uk Kim 			     num_rules);
1743*7e382390SJung-uk Kim 		for (i = 1; i < num_rules; ++i)
1744*7e382390SJung-uk Kim 			mkdata (rule_linenum[i]);
1745*7e382390SJung-uk Kim 		dataend ();
1746*7e382390SJung-uk Kim 	}
1747*7e382390SJung-uk Kim 
1748*7e382390SJung-uk Kim 	if (reject) {
1749*7e382390SJung-uk Kim 		outn ("m4_ifdef( [[M4_YY_USES_REJECT]],\n[[");
1750*7e382390SJung-uk Kim 		/* Declare state buffer variables. */
1751*7e382390SJung-uk Kim 		if (!C_plus_plus && !reentrant) {
1752*7e382390SJung-uk Kim 			outn ("static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;");
1753*7e382390SJung-uk Kim 			outn ("static char *yy_full_match;");
1754*7e382390SJung-uk Kim 			outn ("static int yy_lp;");
1755*7e382390SJung-uk Kim 		}
1756*7e382390SJung-uk Kim 
1757*7e382390SJung-uk Kim 		if (variable_trailing_context_rules) {
1758*7e382390SJung-uk Kim 			if (!C_plus_plus && !reentrant) {
1759*7e382390SJung-uk Kim 				outn ("static int yy_looking_for_trail_begin = 0;");
1760*7e382390SJung-uk Kim 				outn ("static int yy_full_lp;");
1761*7e382390SJung-uk Kim 				outn ("static int *yy_full_state;");
1762*7e382390SJung-uk Kim 			}
1763*7e382390SJung-uk Kim 
1764*7e382390SJung-uk Kim 			out_hex ("#define YY_TRAILING_MASK 0x%x\n",
1765*7e382390SJung-uk Kim 				 (unsigned int) YY_TRAILING_MASK);
1766*7e382390SJung-uk Kim 			out_hex ("#define YY_TRAILING_HEAD_MASK 0x%x\n",
1767*7e382390SJung-uk Kim 				 (unsigned int) YY_TRAILING_HEAD_MASK);
1768*7e382390SJung-uk Kim 		}
1769*7e382390SJung-uk Kim 
1770*7e382390SJung-uk Kim 		outn ("#define REJECT \\");
1771*7e382390SJung-uk Kim 		outn ("{ \\");
1772*7e382390SJung-uk Kim 		outn ("*yy_cp = YY_G(yy_hold_char); /* undo effects of setting up yytext */ \\");
1773*7e382390SJung-uk Kim 		outn ("yy_cp = YY_G(yy_full_match); /* restore poss. backed-over text */ \\");
1774*7e382390SJung-uk Kim 
1775*7e382390SJung-uk Kim 		if (variable_trailing_context_rules) {
1776*7e382390SJung-uk Kim 			outn ("YY_G(yy_lp) = YY_G(yy_full_lp); /* restore orig. accepting pos. */ \\");
1777*7e382390SJung-uk Kim 			outn ("YY_G(yy_state_ptr) = YY_G(yy_full_state); /* restore orig. state */ \\");
1778*7e382390SJung-uk Kim 			outn ("yy_current_state = *YY_G(yy_state_ptr); /* restore curr. state */ \\");
1779*7e382390SJung-uk Kim 		}
1780*7e382390SJung-uk Kim 
1781*7e382390SJung-uk Kim 		outn ("++YY_G(yy_lp); \\");
1782*7e382390SJung-uk Kim 		outn ("goto find_rule; \\");
1783*7e382390SJung-uk Kim 
1784*7e382390SJung-uk Kim 		outn ("}");
1785*7e382390SJung-uk Kim 		outn ("]])\n");
1786*7e382390SJung-uk Kim 	}
1787*7e382390SJung-uk Kim 
1788*7e382390SJung-uk Kim 	else {
1789*7e382390SJung-uk Kim 		outn ("/* The intent behind this definition is that it'll catch");
1790*7e382390SJung-uk Kim 		outn (" * any uses of REJECT which flex missed.");
1791*7e382390SJung-uk Kim 		outn (" */");
1792*7e382390SJung-uk Kim 		outn ("#define REJECT reject_used_but_not_detected");
1793*7e382390SJung-uk Kim 	}
1794*7e382390SJung-uk Kim 
1795*7e382390SJung-uk Kim 	if (yymore_used) {
1796*7e382390SJung-uk Kim 		if (!C_plus_plus) {
1797*7e382390SJung-uk Kim 			if (yytext_is_array) {
1798*7e382390SJung-uk Kim 				if (!reentrant){
1799*7e382390SJung-uk Kim     				indent_puts ("static int yy_more_offset = 0;");
1800*7e382390SJung-uk Kim                     indent_puts ("static int yy_prev_more_offset = 0;");
1801*7e382390SJung-uk Kim                 }
1802*7e382390SJung-uk Kim 			}
1803*7e382390SJung-uk Kim 			else if (!reentrant) {
1804*7e382390SJung-uk Kim 				indent_puts
1805*7e382390SJung-uk Kim 					("static int yy_more_flag = 0;");
1806*7e382390SJung-uk Kim 				indent_puts
1807*7e382390SJung-uk Kim 					("static int yy_more_len = 0;");
1808*7e382390SJung-uk Kim 			}
1809*7e382390SJung-uk Kim 		}
1810*7e382390SJung-uk Kim 
1811*7e382390SJung-uk Kim 		if (yytext_is_array) {
1812*7e382390SJung-uk Kim 			indent_puts
1813*7e382390SJung-uk Kim 				("#define yymore() (YY_G(yy_more_offset) = yy_flex_strlen( yytext M4_YY_CALL_LAST_ARG))");
1814*7e382390SJung-uk Kim 			indent_puts ("#define YY_NEED_STRLEN");
1815*7e382390SJung-uk Kim 			indent_puts ("#define YY_MORE_ADJ 0");
1816*7e382390SJung-uk Kim 			indent_puts
1817*7e382390SJung-uk Kim 				("#define YY_RESTORE_YY_MORE_OFFSET \\");
1818*7e382390SJung-uk Kim 			++indent_level;
1819*7e382390SJung-uk Kim 			indent_puts ("{ \\");
1820*7e382390SJung-uk Kim 			indent_puts
1821*7e382390SJung-uk Kim 				("YY_G(yy_more_offset) = YY_G(yy_prev_more_offset); \\");
1822*7e382390SJung-uk Kim 			indent_puts ("yyleng -= YY_G(yy_more_offset); \\");
1823*7e382390SJung-uk Kim 			indent_puts ("}");
1824*7e382390SJung-uk Kim 			--indent_level;
1825*7e382390SJung-uk Kim 		}
1826*7e382390SJung-uk Kim 		else {
1827*7e382390SJung-uk Kim 			indent_puts
1828*7e382390SJung-uk Kim 				("#define yymore() (YY_G(yy_more_flag) = 1)");
1829*7e382390SJung-uk Kim 			indent_puts
1830*7e382390SJung-uk Kim 				("#define YY_MORE_ADJ YY_G(yy_more_len)");
1831*7e382390SJung-uk Kim 			indent_puts ("#define YY_RESTORE_YY_MORE_OFFSET");
1832*7e382390SJung-uk Kim 		}
1833*7e382390SJung-uk Kim 	}
1834*7e382390SJung-uk Kim 
1835*7e382390SJung-uk Kim 	else {
1836*7e382390SJung-uk Kim 		indent_puts
1837*7e382390SJung-uk Kim 			("#define yymore() yymore_used_but_not_detected");
1838*7e382390SJung-uk Kim 		indent_puts ("#define YY_MORE_ADJ 0");
1839*7e382390SJung-uk Kim 		indent_puts ("#define YY_RESTORE_YY_MORE_OFFSET");
1840*7e382390SJung-uk Kim 	}
1841*7e382390SJung-uk Kim 
1842*7e382390SJung-uk Kim 	if (!C_plus_plus) {
1843*7e382390SJung-uk Kim 		if (yytext_is_array) {
1844*7e382390SJung-uk Kim 			outn ("#ifndef YYLMAX");
1845*7e382390SJung-uk Kim 			outn ("#define YYLMAX 8192");
1846*7e382390SJung-uk Kim 			outn ("#endif\n");
1847*7e382390SJung-uk Kim 			if (!reentrant){
1848*7e382390SJung-uk Kim                 outn ("char yytext[YYLMAX];");
1849*7e382390SJung-uk Kim                 outn ("char *yytext_ptr;");
1850*7e382390SJung-uk Kim             }
1851*7e382390SJung-uk Kim 		}
1852*7e382390SJung-uk Kim 
1853*7e382390SJung-uk Kim 		else {
1854*7e382390SJung-uk Kim 			if(! reentrant)
1855*7e382390SJung-uk Kim                 outn ("char *yytext;");
1856*7e382390SJung-uk Kim 		}
1857*7e382390SJung-uk Kim 	}
1858*7e382390SJung-uk Kim 
1859*7e382390SJung-uk Kim 	out (&action_array[defs1_offset]);
1860*7e382390SJung-uk Kim 
1861*7e382390SJung-uk Kim 	line_directive_out (stdout, 0);
1862*7e382390SJung-uk Kim 
1863*7e382390SJung-uk Kim 	skelout ();		/* %% [5.0] - break point in skel */
1864*7e382390SJung-uk Kim 
1865*7e382390SJung-uk Kim 	if (!C_plus_plus) {
1866*7e382390SJung-uk Kim 		if (use_read) {
1867*7e382390SJung-uk Kim 			outn ("\terrno=0; \\");
1868*7e382390SJung-uk Kim 			outn ("\twhile ( (result = (int) read( fileno(yyin), buf, (yy_size_t) max_size )) < 0 ) \\");
1869*7e382390SJung-uk Kim 			outn ("\t{ \\");
1870*7e382390SJung-uk Kim 			outn ("\t\tif( errno != EINTR) \\");
1871*7e382390SJung-uk Kim 			outn ("\t\t{ \\");
1872*7e382390SJung-uk Kim 			outn ("\t\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" ); \\");
1873*7e382390SJung-uk Kim 			outn ("\t\t\tbreak; \\");
1874*7e382390SJung-uk Kim 			outn ("\t\t} \\");
1875*7e382390SJung-uk Kim 			outn ("\t\terrno=0; \\");
1876*7e382390SJung-uk Kim 			outn ("\t\tclearerr(yyin); \\");
1877*7e382390SJung-uk Kim 			outn ("\t}\\");
1878*7e382390SJung-uk Kim 		}
1879*7e382390SJung-uk Kim 
1880*7e382390SJung-uk Kim 		else {
1881*7e382390SJung-uk Kim 			outn ("\tif ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \\");
1882*7e382390SJung-uk Kim 			outn ("\t\t{ \\");
1883*7e382390SJung-uk Kim 			outn ("\t\tint c = '*'; \\");
1884*7e382390SJung-uk Kim 			outn ("\t\tint n; \\");
1885*7e382390SJung-uk Kim 			outn ("\t\tfor ( n = 0; n < max_size && \\");
1886*7e382390SJung-uk Kim 			outn ("\t\t\t     (c = getc( yyin )) != EOF && c != '\\n'; ++n ) \\");
1887*7e382390SJung-uk Kim 			outn ("\t\t\tbuf[n] = (char) c; \\");
1888*7e382390SJung-uk Kim 			outn ("\t\tif ( c == '\\n' ) \\");
1889*7e382390SJung-uk Kim 			outn ("\t\t\tbuf[n++] = (char) c; \\");
1890*7e382390SJung-uk Kim 			outn ("\t\tif ( c == EOF && ferror( yyin ) ) \\");
1891*7e382390SJung-uk Kim 			outn ("\t\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" ); \\");
1892*7e382390SJung-uk Kim 			outn ("\t\tresult = n; \\");
1893*7e382390SJung-uk Kim 			outn ("\t\t} \\");
1894*7e382390SJung-uk Kim 			outn ("\telse \\");
1895*7e382390SJung-uk Kim 			outn ("\t\t{ \\");
1896*7e382390SJung-uk Kim 			outn ("\t\terrno=0; \\");
1897*7e382390SJung-uk Kim 			outn ("\t\twhile ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \\");
1898*7e382390SJung-uk Kim 			outn ("\t\t\t{ \\");
1899*7e382390SJung-uk Kim 			outn ("\t\t\tif( errno != EINTR) \\");
1900*7e382390SJung-uk Kim 			outn ("\t\t\t\t{ \\");
1901*7e382390SJung-uk Kim 			outn ("\t\t\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" ); \\");
1902*7e382390SJung-uk Kim 			outn ("\t\t\t\tbreak; \\");
1903*7e382390SJung-uk Kim 			outn ("\t\t\t\t} \\");
1904*7e382390SJung-uk Kim 			outn ("\t\t\terrno=0; \\");
1905*7e382390SJung-uk Kim 			outn ("\t\t\tclearerr(yyin); \\");
1906*7e382390SJung-uk Kim 			outn ("\t\t\t} \\");
1907*7e382390SJung-uk Kim 			outn ("\t\t}\\");
1908*7e382390SJung-uk Kim 		}
1909*7e382390SJung-uk Kim 	}
1910*7e382390SJung-uk Kim 
1911*7e382390SJung-uk Kim 	skelout ();		/* %% [6.0] - break point in skel */
1912*7e382390SJung-uk Kim 
1913*7e382390SJung-uk Kim 	indent_puts ("#define YY_RULE_SETUP \\");
1914*7e382390SJung-uk Kim 	++indent_level;
1915*7e382390SJung-uk Kim 	if (bol_needed) {
1916*7e382390SJung-uk Kim 		indent_puts ("if ( yyleng > 0 ) \\");
1917*7e382390SJung-uk Kim 		++indent_level;
1918*7e382390SJung-uk Kim 		indent_puts ("YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \\");
1919*7e382390SJung-uk Kim 		indent_puts ("\t\t(yytext[yyleng - 1] == '\\n'); \\");
1920*7e382390SJung-uk Kim 		--indent_level;
1921*7e382390SJung-uk Kim 	}
1922*7e382390SJung-uk Kim 	indent_puts ("YY_USER_ACTION");
1923*7e382390SJung-uk Kim 	--indent_level;
1924*7e382390SJung-uk Kim 
1925*7e382390SJung-uk Kim 	skelout ();		/* %% [7.0] - break point in skel */
1926*7e382390SJung-uk Kim 
1927*7e382390SJung-uk Kim 	/* Copy prolog to output file. */
1928*7e382390SJung-uk Kim 	out (&action_array[prolog_offset]);
1929*7e382390SJung-uk Kim 
1930*7e382390SJung-uk Kim 	line_directive_out (stdout, 0);
1931*7e382390SJung-uk Kim 
1932*7e382390SJung-uk Kim 	skelout ();		/* %% [8.0] - break point in skel */
1933*7e382390SJung-uk Kim 
1934*7e382390SJung-uk Kim 	set_indent (2);
1935*7e382390SJung-uk Kim 
1936*7e382390SJung-uk Kim 	if (yymore_used && !yytext_is_array) {
1937*7e382390SJung-uk Kim 		indent_puts ("YY_G(yy_more_len) = 0;");
1938*7e382390SJung-uk Kim 		indent_puts ("if ( YY_G(yy_more_flag) )");
1939*7e382390SJung-uk Kim 		++indent_level;
1940*7e382390SJung-uk Kim 		indent_puts ("{");
1941*7e382390SJung-uk Kim 		indent_puts
1942*7e382390SJung-uk Kim 			("YY_G(yy_more_len) = (int) (YY_G(yy_c_buf_p) - YY_G(yytext_ptr));");
1943*7e382390SJung-uk Kim 		indent_puts ("YY_G(yy_more_flag) = 0;");
1944*7e382390SJung-uk Kim 		indent_puts ("}");
1945*7e382390SJung-uk Kim 		--indent_level;
1946*7e382390SJung-uk Kim 	}
1947*7e382390SJung-uk Kim 
1948*7e382390SJung-uk Kim 	skelout ();		/* %% [9.0] - break point in skel */
1949*7e382390SJung-uk Kim 
1950*7e382390SJung-uk Kim 	gen_start_state ();
1951*7e382390SJung-uk Kim 
1952*7e382390SJung-uk Kim 	/* Note, don't use any indentation. */
1953*7e382390SJung-uk Kim 	outn ("yy_match:");
1954*7e382390SJung-uk Kim 	gen_next_match ();
1955*7e382390SJung-uk Kim 
1956*7e382390SJung-uk Kim 	skelout ();		/* %% [10.0] - break point in skel */
1957*7e382390SJung-uk Kim 	set_indent (2);
1958*7e382390SJung-uk Kim 	gen_find_action ();
1959*7e382390SJung-uk Kim 
1960*7e382390SJung-uk Kim 	skelout ();		/* %% [11.0] - break point in skel */
1961*7e382390SJung-uk Kim 	outn ("m4_ifdef( [[M4_YY_USE_LINENO]],[[");
1962*7e382390SJung-uk Kim 	indent_puts
1963*7e382390SJung-uk Kim 		("if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )");
1964*7e382390SJung-uk Kim 	++indent_level;
1965*7e382390SJung-uk Kim 	indent_puts ("{");
1966*7e382390SJung-uk Kim 	indent_puts ("int yyl;");
1967*7e382390SJung-uk Kim 	do_indent ();
1968*7e382390SJung-uk Kim 	out_str ("for ( yyl = %s; yyl < yyleng; ++yyl )\n",
1969*7e382390SJung-uk Kim 		 yymore_used ? (yytext_is_array ? "YY_G(yy_prev_more_offset)" :
1970*7e382390SJung-uk Kim 				"YY_G(yy_more_len)") : "0");
1971*7e382390SJung-uk Kim 	++indent_level;
1972*7e382390SJung-uk Kim 	indent_puts ("if ( yytext[yyl] == '\\n' )");
1973*7e382390SJung-uk Kim 	++indent_level;
1974*7e382390SJung-uk Kim 	indent_puts ("M4_YY_INCR_LINENO();");
1975*7e382390SJung-uk Kim 	--indent_level;
1976*7e382390SJung-uk Kim 	--indent_level;
1977*7e382390SJung-uk Kim 	indent_puts ("}");
1978*7e382390SJung-uk Kim 	--indent_level;
1979*7e382390SJung-uk Kim 	outn ("]])");
1980*7e382390SJung-uk Kim 
1981*7e382390SJung-uk Kim 	skelout ();		/* %% [12.0] - break point in skel */
1982*7e382390SJung-uk Kim 	if (ddebug) {
1983*7e382390SJung-uk Kim 		indent_puts ("if ( yy_flex_debug )");
1984*7e382390SJung-uk Kim 		++indent_level;
1985*7e382390SJung-uk Kim 
1986*7e382390SJung-uk Kim 		indent_puts ("{");
1987*7e382390SJung-uk Kim 		indent_puts ("if ( yy_act == 0 )");
1988*7e382390SJung-uk Kim 		++indent_level;
1989*7e382390SJung-uk Kim 		indent_puts (C_plus_plus ?
1990*7e382390SJung-uk Kim 			     "std::cerr << \"--scanner backing up\\n\";" :
1991*7e382390SJung-uk Kim 			     "fprintf( stderr, \"--scanner backing up\\n\" );");
1992*7e382390SJung-uk Kim 		--indent_level;
1993*7e382390SJung-uk Kim 
1994*7e382390SJung-uk Kim 		do_indent ();
1995*7e382390SJung-uk Kim 		out_dec ("else if ( yy_act < %d )\n", num_rules);
1996*7e382390SJung-uk Kim 		++indent_level;
1997*7e382390SJung-uk Kim 
1998*7e382390SJung-uk Kim 		if (C_plus_plus) {
1999*7e382390SJung-uk Kim 			indent_puts
2000*7e382390SJung-uk Kim 				("std::cerr << \"--accepting rule at line \" << yy_rule_linenum[yy_act] <<");
2001*7e382390SJung-uk Kim 			indent_puts
2002*7e382390SJung-uk Kim 				("         \"(\\\"\" << yytext << \"\\\")\\n\";");
2003*7e382390SJung-uk Kim 		}
2004*7e382390SJung-uk Kim 		else {
2005*7e382390SJung-uk Kim 			indent_puts
2006*7e382390SJung-uk Kim 				("fprintf( stderr, \"--accepting rule at line %ld (\\\"%s\\\")\\n\",");
2007*7e382390SJung-uk Kim 
2008*7e382390SJung-uk Kim 			indent_puts
2009*7e382390SJung-uk Kim 				("         (long)yy_rule_linenum[yy_act], yytext );");
2010*7e382390SJung-uk Kim 		}
2011*7e382390SJung-uk Kim 
2012*7e382390SJung-uk Kim 		--indent_level;
2013*7e382390SJung-uk Kim 
2014*7e382390SJung-uk Kim 		do_indent ();
2015*7e382390SJung-uk Kim 		out_dec ("else if ( yy_act == %d )\n", num_rules);
2016*7e382390SJung-uk Kim 		++indent_level;
2017*7e382390SJung-uk Kim 
2018*7e382390SJung-uk Kim 		if (C_plus_plus) {
2019*7e382390SJung-uk Kim 			indent_puts
2020*7e382390SJung-uk Kim 				("std::cerr << \"--accepting default rule (\\\"\" << yytext << \"\\\")\\n\";");
2021*7e382390SJung-uk Kim 		}
2022*7e382390SJung-uk Kim 		else {
2023*7e382390SJung-uk Kim 			indent_puts
2024*7e382390SJung-uk Kim 				("fprintf( stderr, \"--accepting default rule (\\\"%s\\\")\\n\",");
2025*7e382390SJung-uk Kim 			indent_puts ("         yytext );");
2026*7e382390SJung-uk Kim 		}
2027*7e382390SJung-uk Kim 
2028*7e382390SJung-uk Kim 		--indent_level;
2029*7e382390SJung-uk Kim 
2030*7e382390SJung-uk Kim 		do_indent ();
2031*7e382390SJung-uk Kim 		out_dec ("else if ( yy_act == %d )\n", num_rules + 1);
2032*7e382390SJung-uk Kim 		++indent_level;
2033*7e382390SJung-uk Kim 
2034*7e382390SJung-uk Kim 		indent_puts (C_plus_plus ?
2035*7e382390SJung-uk Kim 			     "std::cerr << \"--(end of buffer or a NUL)\\n\";" :
2036*7e382390SJung-uk Kim 			     "fprintf( stderr, \"--(end of buffer or a NUL)\\n\" );");
2037*7e382390SJung-uk Kim 
2038*7e382390SJung-uk Kim 		--indent_level;
2039*7e382390SJung-uk Kim 
2040*7e382390SJung-uk Kim 		do_indent ();
2041*7e382390SJung-uk Kim 		outn ("else");
2042*7e382390SJung-uk Kim 		++indent_level;
2043*7e382390SJung-uk Kim 
2044*7e382390SJung-uk Kim 		if (C_plus_plus) {
2045*7e382390SJung-uk Kim 			indent_puts
2046*7e382390SJung-uk Kim 				("std::cerr << \"--EOF (start condition \" << YY_START << \")\\n\";");
2047*7e382390SJung-uk Kim 		}
2048*7e382390SJung-uk Kim 		else {
2049*7e382390SJung-uk Kim 			indent_puts
2050*7e382390SJung-uk Kim 				("fprintf( stderr, \"--EOF (start condition %d)\\n\", YY_START );");
2051*7e382390SJung-uk Kim 		}
2052*7e382390SJung-uk Kim 
2053*7e382390SJung-uk Kim 		--indent_level;
2054*7e382390SJung-uk Kim 
2055*7e382390SJung-uk Kim 		indent_puts ("}");
2056*7e382390SJung-uk Kim 		--indent_level;
2057*7e382390SJung-uk Kim 	}
2058*7e382390SJung-uk Kim 
2059*7e382390SJung-uk Kim 	/* Copy actions to output file. */
2060*7e382390SJung-uk Kim 	skelout ();		/* %% [13.0] - break point in skel */
2061*7e382390SJung-uk Kim 	++indent_level;
2062*7e382390SJung-uk Kim 	gen_bu_action ();
2063*7e382390SJung-uk Kim 	out (&action_array[action_offset]);
2064*7e382390SJung-uk Kim 
2065*7e382390SJung-uk Kim 	line_directive_out (stdout, 0);
2066*7e382390SJung-uk Kim 
2067*7e382390SJung-uk Kim 	/* generate cases for any missing EOF rules */
2068*7e382390SJung-uk Kim 	for (i = 1; i <= lastsc; ++i)
2069*7e382390SJung-uk Kim 		if (!sceof[i]) {
2070*7e382390SJung-uk Kim 			do_indent ();
2071*7e382390SJung-uk Kim 			out_str ("case YY_STATE_EOF(%s):\n", scname[i]);
2072*7e382390SJung-uk Kim 			did_eof_rule = true;
2073*7e382390SJung-uk Kim 		}
2074*7e382390SJung-uk Kim 
2075*7e382390SJung-uk Kim 	if (did_eof_rule) {
2076*7e382390SJung-uk Kim 		++indent_level;
2077*7e382390SJung-uk Kim 		indent_puts ("yyterminate();");
2078*7e382390SJung-uk Kim 		--indent_level;
2079*7e382390SJung-uk Kim 	}
2080*7e382390SJung-uk Kim 
2081*7e382390SJung-uk Kim 
2082*7e382390SJung-uk Kim 	/* Generate code for handling NUL's, if needed. */
2083*7e382390SJung-uk Kim 
2084*7e382390SJung-uk Kim 	/* First, deal with backing up and setting up yy_cp if the scanner
2085*7e382390SJung-uk Kim 	 * finds that it should JAM on the NUL.
2086*7e382390SJung-uk Kim 	 */
2087*7e382390SJung-uk Kim 	skelout ();		/* %% [14.0] - break point in skel */
2088*7e382390SJung-uk Kim 	set_indent (4);
2089*7e382390SJung-uk Kim 
2090*7e382390SJung-uk Kim 	if (fullspd || fulltbl)
2091*7e382390SJung-uk Kim 		indent_puts ("yy_cp = YY_G(yy_c_buf_p);");
2092*7e382390SJung-uk Kim 
2093*7e382390SJung-uk Kim 	else {			/* compressed table */
2094*7e382390SJung-uk Kim 		if (!reject && !interactive) {
2095*7e382390SJung-uk Kim 			/* Do the guaranteed-needed backing up to figure
2096*7e382390SJung-uk Kim 			 * out the match.
2097*7e382390SJung-uk Kim 			 */
2098*7e382390SJung-uk Kim 			indent_puts
2099*7e382390SJung-uk Kim 				("yy_cp = YY_G(yy_last_accepting_cpos);");
2100*7e382390SJung-uk Kim 			indent_puts
2101*7e382390SJung-uk Kim 				("yy_current_state = YY_G(yy_last_accepting_state);");
2102*7e382390SJung-uk Kim 		}
2103*7e382390SJung-uk Kim 
2104*7e382390SJung-uk Kim 		else
2105*7e382390SJung-uk Kim 			/* Still need to initialize yy_cp, though
2106*7e382390SJung-uk Kim 			 * yy_current_state was set up by
2107*7e382390SJung-uk Kim 			 * yy_get_previous_state().
2108*7e382390SJung-uk Kim 			 */
2109*7e382390SJung-uk Kim 			indent_puts ("yy_cp = YY_G(yy_c_buf_p);");
2110*7e382390SJung-uk Kim 	}
2111*7e382390SJung-uk Kim 
2112*7e382390SJung-uk Kim 
2113*7e382390SJung-uk Kim 	/* Generate code for yy_get_previous_state(). */
2114*7e382390SJung-uk Kim 	set_indent (1);
2115*7e382390SJung-uk Kim 	skelout ();		/* %% [15.0] - break point in skel */
2116*7e382390SJung-uk Kim 
2117*7e382390SJung-uk Kim 	gen_start_state ();
2118*7e382390SJung-uk Kim 
2119*7e382390SJung-uk Kim 	set_indent (2);
2120*7e382390SJung-uk Kim 	skelout ();		/* %% [16.0] - break point in skel */
2121*7e382390SJung-uk Kim 	gen_next_state (true);
2122*7e382390SJung-uk Kim 
2123*7e382390SJung-uk Kim 	set_indent (1);
2124*7e382390SJung-uk Kim 	skelout ();		/* %% [17.0] - break point in skel */
2125*7e382390SJung-uk Kim 	gen_NUL_trans ();
2126*7e382390SJung-uk Kim 
2127*7e382390SJung-uk Kim 	skelout ();		/* %% [18.0] - break point in skel */
2128*7e382390SJung-uk Kim 	skelout ();		/* %% [19.0] - break point in skel */
2129*7e382390SJung-uk Kim 	/* Update BOL and yylineno inside of input(). */
2130*7e382390SJung-uk Kim 	if (bol_needed) {
2131*7e382390SJung-uk Kim 		indent_puts
2132*7e382390SJung-uk Kim 			("YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\\n');");
2133*7e382390SJung-uk Kim 		if (do_yylineno) {
2134*7e382390SJung-uk Kim 			indent_puts
2135*7e382390SJung-uk Kim 				("if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol )");
2136*7e382390SJung-uk Kim 			++indent_level;
2137*7e382390SJung-uk Kim 			indent_puts ("M4_YY_INCR_LINENO();");
2138*7e382390SJung-uk Kim 			--indent_level;
2139*7e382390SJung-uk Kim 		}
2140*7e382390SJung-uk Kim 	}
2141*7e382390SJung-uk Kim 
2142*7e382390SJung-uk Kim 	else if (do_yylineno) {
2143*7e382390SJung-uk Kim 		indent_puts ("if ( c == '\\n' )");
2144*7e382390SJung-uk Kim 		++indent_level;
2145*7e382390SJung-uk Kim 		indent_puts ("M4_YY_INCR_LINENO();");
2146*7e382390SJung-uk Kim 		--indent_level;
2147*7e382390SJung-uk Kim 	}
2148*7e382390SJung-uk Kim 
2149*7e382390SJung-uk Kim 	skelout ();
2150*7e382390SJung-uk Kim 
2151*7e382390SJung-uk Kim 	/* Copy remainder of input to output. */
2152*7e382390SJung-uk Kim 
2153*7e382390SJung-uk Kim 	line_directive_out (stdout, 1);
2154*7e382390SJung-uk Kim 
2155*7e382390SJung-uk Kim 	if (sectnum == 3) {
2156*7e382390SJung-uk Kim 		OUT_BEGIN_CODE ();
2157*7e382390SJung-uk Kim                 if (!no_section3_escape)
2158*7e382390SJung-uk Kim                    fputs("[[", stdout);
2159*7e382390SJung-uk Kim 		(void) flexscan ();	/* copy remainder of input to output */
2160*7e382390SJung-uk Kim                 if (!no_section3_escape)
2161*7e382390SJung-uk Kim                    fputs("]]", stdout);
2162*7e382390SJung-uk Kim 		OUT_END_CODE ();
2163*7e382390SJung-uk Kim 	}
2164*7e382390SJung-uk Kim }
2165