xref: /minix3/external/bsd/flex/dist/main.c (revision 357f1050293be536ca8309aae20889945ce99fc1)
1*357f1050SThomas Veerman /*	$NetBSD: main.c,v 1.3 2011/12/26 17:32:28 njoly Exp $	*/
2*357f1050SThomas Veerman 
3*357f1050SThomas Veerman /* flex - tool to generate fast lexical analyzers */
4*357f1050SThomas Veerman 
5*357f1050SThomas Veerman /*  Copyright (c) 1990 The Regents of the University of California. */
6*357f1050SThomas Veerman /*  All rights reserved. */
7*357f1050SThomas Veerman 
8*357f1050SThomas Veerman /*  This code is derived from software contributed to Berkeley by */
9*357f1050SThomas Veerman /*  Vern Paxson. */
10*357f1050SThomas Veerman 
11*357f1050SThomas Veerman /*  The United States Government has rights in this work pursuant */
12*357f1050SThomas Veerman /*  to contract no. DE-AC03-76SF00098 between the United States */
13*357f1050SThomas Veerman /*  Department of Energy and the University of California. */
14*357f1050SThomas Veerman 
15*357f1050SThomas Veerman /*  This file is part of flex. */
16*357f1050SThomas Veerman 
17*357f1050SThomas Veerman /*  Redistribution and use in source and binary forms, with or without */
18*357f1050SThomas Veerman /*  modification, are permitted provided that the following conditions */
19*357f1050SThomas Veerman /*  are met: */
20*357f1050SThomas Veerman 
21*357f1050SThomas Veerman /*  1. Redistributions of source code must retain the above copyright */
22*357f1050SThomas Veerman /*     notice, this list of conditions and the following disclaimer. */
23*357f1050SThomas Veerman /*  2. Redistributions in binary form must reproduce the above copyright */
24*357f1050SThomas Veerman /*     notice, this list of conditions and the following disclaimer in the */
25*357f1050SThomas Veerman /*     documentation and/or other materials provided with the distribution. */
26*357f1050SThomas Veerman 
27*357f1050SThomas Veerman /*  Neither the name of the University nor the names of its contributors */
28*357f1050SThomas Veerman /*  may be used to endorse or promote products derived from this software */
29*357f1050SThomas Veerman /*  without specific prior written permission. */
30*357f1050SThomas Veerman 
31*357f1050SThomas Veerman /*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */
32*357f1050SThomas Veerman /*  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
33*357f1050SThomas Veerman /*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */
34*357f1050SThomas Veerman /*  PURPOSE. */
35*357f1050SThomas Veerman 
36*357f1050SThomas Veerman 
37*357f1050SThomas Veerman #include "flexdef.h"
38*357f1050SThomas Veerman #include "version.h"
39*357f1050SThomas Veerman #include "options.h"
40*357f1050SThomas Veerman #include "tables.h"
41*357f1050SThomas Veerman 
42*357f1050SThomas Veerman static char flex_version[] = FLEX_VERSION;
43*357f1050SThomas Veerman 
44*357f1050SThomas Veerman /* declare functions that have forward references */
45*357f1050SThomas Veerman 
46*357f1050SThomas Veerman void flexinit PROTO ((int, char **));
47*357f1050SThomas Veerman void readin PROTO ((void));
48*357f1050SThomas Veerman void set_up_initial_allocations PROTO ((void));
49*357f1050SThomas Veerman static char *basename2 PROTO ((char *path, int should_strip_ext));
50*357f1050SThomas Veerman 
51*357f1050SThomas Veerman 
52*357f1050SThomas Veerman /* these globals are all defined and commented in flexdef.h */
53*357f1050SThomas Veerman int     printstats, syntaxerror, eofseen, ddebug, trace, nowarn, spprdflt;
54*357f1050SThomas Veerman int     interactive, lex_compat, posix_compat, do_yylineno,
55*357f1050SThomas Veerman 	useecs, fulltbl, usemecs;
56*357f1050SThomas Veerman int     fullspd, gen_line_dirs, performance_report, backing_up_report;
57*357f1050SThomas Veerman int     C_plus_plus, long_align, use_read, yytext_is_array, do_yywrap,
58*357f1050SThomas Veerman 	csize;
59*357f1050SThomas Veerman int     reentrant, bison_bridge_lval, bison_bridge_lloc;
60*357f1050SThomas Veerman int     yymore_used, reject, real_reject, continued_action, in_rule;
61*357f1050SThomas Veerman int     yymore_really_used, reject_really_used;
62*357f1050SThomas Veerman int     datapos, dataline, linenum, out_linenum;
63*357f1050SThomas Veerman FILE   *skelfile = NULL;
64*357f1050SThomas Veerman int     skel_ind = 0;
65*357f1050SThomas Veerman char   *action_array;
66*357f1050SThomas Veerman int     action_size, defs1_offset, prolog_offset, action_offset,
67*357f1050SThomas Veerman 	action_index;
68*357f1050SThomas Veerman char   *infilename = NULL, *outfilename = NULL, *headerfilename = NULL;
69*357f1050SThomas Veerman int     did_outfilename;
70*357f1050SThomas Veerman char   *prefix, *yyclass, *extra_type = NULL;
71*357f1050SThomas Veerman int     do_stdinit, use_stdout;
72*357f1050SThomas Veerman int     onestate[ONE_STACK_SIZE], onesym[ONE_STACK_SIZE];
73*357f1050SThomas Veerman int     onenext[ONE_STACK_SIZE], onedef[ONE_STACK_SIZE], onesp;
74*357f1050SThomas Veerman int     maximum_mns, current_mns, current_max_rules;
75*357f1050SThomas Veerman int     num_rules, num_eof_rules, default_rule, lastnfa;
76*357f1050SThomas Veerman int    *firstst, *lastst, *finalst, *transchar, *trans1, *trans2;
77*357f1050SThomas Veerman int    *accptnum, *assoc_rule, *state_type;
78*357f1050SThomas Veerman int    *rule_type, *rule_linenum, *rule_useful;
79*357f1050SThomas Veerman int     current_state_type;
80*357f1050SThomas Veerman int     variable_trailing_context_rules;
81*357f1050SThomas Veerman int     numtemps, numprots, protprev[MSP], protnext[MSP], prottbl[MSP];
82*357f1050SThomas Veerman int     protcomst[MSP], firstprot, lastprot, protsave[PROT_SAVE_SIZE];
83*357f1050SThomas Veerman int     numecs, nextecm[CSIZE + 1], ecgroup[CSIZE + 1], nummecs,
84*357f1050SThomas Veerman 	tecfwd[CSIZE + 1];
85*357f1050SThomas Veerman int     tecbck[CSIZE + 1];
86*357f1050SThomas Veerman int     lastsc, *scset, *scbol, *scxclu, *sceof;
87*357f1050SThomas Veerman int     current_max_scs;
88*357f1050SThomas Veerman char  **scname;
89*357f1050SThomas Veerman int     current_max_dfa_size, current_max_xpairs;
90*357f1050SThomas Veerman int     current_max_template_xpairs, current_max_dfas;
91*357f1050SThomas Veerman int     lastdfa, *nxt, *chk, *tnxt;
92*357f1050SThomas Veerman int    *base, *def, *nultrans, NUL_ec, tblend, firstfree, **dss, *dfasiz;
93*357f1050SThomas Veerman union dfaacc_union *dfaacc;
94*357f1050SThomas Veerman int    *accsiz, *dhash, numas;
95*357f1050SThomas Veerman int     numsnpairs, jambase, jamstate;
96*357f1050SThomas Veerman int     lastccl, *cclmap, *ccllen, *cclng, cclreuse;
97*357f1050SThomas Veerman int     current_maxccls, current_max_ccl_tbl_size;
98*357f1050SThomas Veerman Char   *ccltbl;
99*357f1050SThomas Veerman char    nmstr[MAXLINE];
100*357f1050SThomas Veerman int     sectnum, nummt, hshcol, dfaeql, numeps, eps2, num_reallocs;
101*357f1050SThomas Veerman int     tmpuses, totnst, peakpairs, numuniq, numdup, hshsave;
102*357f1050SThomas Veerman int     num_backing_up, bol_needed;
103*357f1050SThomas Veerman FILE   *backing_up_file;
104*357f1050SThomas Veerman int     end_of_buffer_state;
105*357f1050SThomas Veerman char  **input_files;
106*357f1050SThomas Veerman int     num_input_files;
107*357f1050SThomas Veerman jmp_buf flex_main_jmp_buf;
108*357f1050SThomas Veerman bool   *rule_has_nl, *ccl_has_nl;
109*357f1050SThomas Veerman int     nlch = '\n';
110*357f1050SThomas Veerman bool    ansi_func_defs, ansi_func_protos;
111*357f1050SThomas Veerman 
112*357f1050SThomas Veerman bool    tablesext, tablesverify, gentables;
113*357f1050SThomas Veerman char   *tablesfilename=0,*tablesname=0;
114*357f1050SThomas Veerman struct yytbl_writer tableswr;
115*357f1050SThomas Veerman 
116*357f1050SThomas Veerman /* Make sure program_name is initialized so we don't crash if writing
117*357f1050SThomas Veerman  * out an error message before getting the program name from argv[0].
118*357f1050SThomas Veerman  */
119*357f1050SThomas Veerman char   *program_name = "flex";
120*357f1050SThomas Veerman 
121*357f1050SThomas Veerman #ifndef SHORT_FILE_NAMES
122*357f1050SThomas Veerman static const char outfile_template[] = "lex.%s.%s";
123*357f1050SThomas Veerman static const char backing_name[] = "lex.backup";
124*357f1050SThomas Veerman static const char tablesfile_template[] = "lex.%s.tables";
125*357f1050SThomas Veerman #else
126*357f1050SThomas Veerman static const char outfile_template[] = "lex%s.%s";
127*357f1050SThomas Veerman static const char backing_name[] = "lex.bck";
128*357f1050SThomas Veerman static const char tablesfile_template[] = "lex%s.tbl";
129*357f1050SThomas Veerman #endif
130*357f1050SThomas Veerman 
131*357f1050SThomas Veerman #ifdef MS_DOS
132*357f1050SThomas Veerman extern unsigned _stklen = 16384;
133*357f1050SThomas Veerman #endif
134*357f1050SThomas Veerman 
135*357f1050SThomas Veerman /* From scan.l */
136*357f1050SThomas Veerman extern FILE* yyout;
137*357f1050SThomas Veerman 
138*357f1050SThomas Veerman static char outfile_path[MAXLINE];
139*357f1050SThomas Veerman static int outfile_created = 0;
140*357f1050SThomas Veerman static char *skelname = NULL;
141*357f1050SThomas Veerman static int _stdout_closed = 0; /* flag to prevent double-fclose() on stdout. */
142*357f1050SThomas Veerman const char *escaped_qstart = "[[]]M4_YY_NOOP[M4_YY_NOOP[M4_YY_NOOP[[]]";
143*357f1050SThomas Veerman const char *escaped_qend   = "[[]]M4_YY_NOOP]M4_YY_NOOP]M4_YY_NOOP[[]]";
144*357f1050SThomas Veerman 
145*357f1050SThomas Veerman /* For debugging. The max number of filters to apply to skeleton. */
146*357f1050SThomas Veerman static int preproc_level = 1000;
147*357f1050SThomas Veerman 
148*357f1050SThomas Veerman int flex_main PROTO ((int argc, char *argv[]));
149*357f1050SThomas Veerman int main PROTO ((int argc, char *argv[]));
150*357f1050SThomas Veerman 
151*357f1050SThomas Veerman int flex_main (argc, argv)
152*357f1050SThomas Veerman      int argc;
153*357f1050SThomas Veerman      char   *argv[];
154*357f1050SThomas Veerman {
155*357f1050SThomas Veerman 	int     i, exit_status, child_status;
156*357f1050SThomas Veerman 
157*357f1050SThomas Veerman 	/* Set a longjmp target. Yes, I know it's a hack, but it gets worse: The
158*357f1050SThomas Veerman 	 * return value of setjmp, if non-zero, is the desired exit code PLUS ONE.
159*357f1050SThomas Veerman 	 * For example, if you want 'main' to return with code '2', then call
160*357f1050SThomas Veerman 	 * longjmp() with an argument of 3. This is because it is invalid to
161*357f1050SThomas Veerman 	 * specify a value of 0 to longjmp. FLEX_EXIT(n) should be used instead of
162*357f1050SThomas Veerman 	 * exit(n);
163*357f1050SThomas Veerman 	 */
164*357f1050SThomas Veerman 	exit_status = setjmp (flex_main_jmp_buf);
165*357f1050SThomas Veerman 	if (exit_status){
166*357f1050SThomas Veerman         if (stdout && !_stdout_closed && !ferror(stdout)){
167*357f1050SThomas Veerman             fflush(stdout);
168*357f1050SThomas Veerman             fclose(stdout);
169*357f1050SThomas Veerman         }
170*357f1050SThomas Veerman         while (wait(&child_status) > 0){
171*357f1050SThomas Veerman             if (!WIFEXITED (child_status)
172*357f1050SThomas Veerman                 || WEXITSTATUS (child_status) != 0){
173*357f1050SThomas Veerman                 /* report an error of a child
174*357f1050SThomas Veerman                  */
175*357f1050SThomas Veerman                 if( exit_status <= 1 )
176*357f1050SThomas Veerman                     exit_status = 2;
177*357f1050SThomas Veerman 
178*357f1050SThomas Veerman             }
179*357f1050SThomas Veerman         }
180*357f1050SThomas Veerman         return exit_status - 1;
181*357f1050SThomas Veerman     }
182*357f1050SThomas Veerman 
183*357f1050SThomas Veerman 	flexinit (argc, argv);
184*357f1050SThomas Veerman 
185*357f1050SThomas Veerman 	readin ();
186*357f1050SThomas Veerman 
187*357f1050SThomas Veerman 	ntod ();
188*357f1050SThomas Veerman 
189*357f1050SThomas Veerman 	for (i = 1; i <= num_rules; ++i)
190*357f1050SThomas Veerman 		if (!rule_useful[i] && i != default_rule)
191*357f1050SThomas Veerman 			line_warning (_("rule cannot be matched"),
192*357f1050SThomas Veerman 				      rule_linenum[i]);
193*357f1050SThomas Veerman 
194*357f1050SThomas Veerman 	if (spprdflt && !reject && rule_useful[default_rule])
195*357f1050SThomas Veerman 		line_warning (_
196*357f1050SThomas Veerman 			      ("-s option given but default rule can be matched"),
197*357f1050SThomas Veerman 			      rule_linenum[default_rule]);
198*357f1050SThomas Veerman 
199*357f1050SThomas Veerman 	/* Generate the C state transition tables from the DFA. */
200*357f1050SThomas Veerman 	make_tables ();
201*357f1050SThomas Veerman 
202*357f1050SThomas Veerman 	/* Note, flexend does not return.  It exits with its argument
203*357f1050SThomas Veerman 	 * as status.
204*357f1050SThomas Veerman 	 */
205*357f1050SThomas Veerman 	flexend (0);
206*357f1050SThomas Veerman 
207*357f1050SThomas Veerman 	return 0;		/* keep compilers/lint happy */
208*357f1050SThomas Veerman }
209*357f1050SThomas Veerman 
210*357f1050SThomas Veerman /* Wrapper around flex_main, so flex_main can be built as a library. */
211*357f1050SThomas Veerman int main (argc, argv)
212*357f1050SThomas Veerman      int argc;
213*357f1050SThomas Veerman      char   *argv[];
214*357f1050SThomas Veerman {
215*357f1050SThomas Veerman #if ENABLE_NLS
216*357f1050SThomas Veerman #if HAVE_LOCALE_H
217*357f1050SThomas Veerman 	setlocale (LC_MESSAGES, "");
218*357f1050SThomas Veerman         setlocale (LC_CTYPE, "");
219*357f1050SThomas Veerman 	textdomain (PACKAGE);
220*357f1050SThomas Veerman 	bindtextdomain (PACKAGE, LOCALEDIR);
221*357f1050SThomas Veerman #endif
222*357f1050SThomas Veerman #endif
223*357f1050SThomas Veerman 
224*357f1050SThomas Veerman 	return flex_main (argc, argv);
225*357f1050SThomas Veerman }
226*357f1050SThomas Veerman 
227*357f1050SThomas Veerman /* check_options - check user-specified options */
228*357f1050SThomas Veerman 
229*357f1050SThomas Veerman void check_options ()
230*357f1050SThomas Veerman {
231*357f1050SThomas Veerman 	int     i;
232*357f1050SThomas Veerman     const char * m4 = NULL;
233*357f1050SThomas Veerman 
234*357f1050SThomas Veerman 	if (lex_compat) {
235*357f1050SThomas Veerman 		if (C_plus_plus)
236*357f1050SThomas Veerman 			flexerror (_("Can't use -+ with -l option"));
237*357f1050SThomas Veerman 
238*357f1050SThomas Veerman 		if (fulltbl || fullspd)
239*357f1050SThomas Veerman 			flexerror (_("Can't use -f or -F with -l option"));
240*357f1050SThomas Veerman 
241*357f1050SThomas Veerman 		if (reentrant || bison_bridge_lval)
242*357f1050SThomas Veerman 			flexerror (_
243*357f1050SThomas Veerman 				   ("Can't use --reentrant or --bison-bridge with -l option"));
244*357f1050SThomas Veerman 
245*357f1050SThomas Veerman 		/* Don't rely on detecting use of yymore() and REJECT,
246*357f1050SThomas Veerman 		 * just assume they'll be used.
247*357f1050SThomas Veerman 		 */
248*357f1050SThomas Veerman 		yymore_really_used = reject_really_used = true;
249*357f1050SThomas Veerman 
250*357f1050SThomas Veerman 		yytext_is_array = true;
251*357f1050SThomas Veerman 		do_yylineno = true;
252*357f1050SThomas Veerman 		use_read = false;
253*357f1050SThomas Veerman 	}
254*357f1050SThomas Veerman 
255*357f1050SThomas Veerman 
256*357f1050SThomas Veerman #if 0
257*357f1050SThomas Veerman 	/* This makes no sense whatsoever. I'm removing it. */
258*357f1050SThomas Veerman 	if (do_yylineno)
259*357f1050SThomas Veerman 		/* This should really be "maintain_backup_tables = true" */
260*357f1050SThomas Veerman 		reject_really_used = true;
261*357f1050SThomas Veerman #endif
262*357f1050SThomas Veerman 
263*357f1050SThomas Veerman 	if (csize == unspecified) {
264*357f1050SThomas Veerman 		if ((fulltbl || fullspd) && !useecs)
265*357f1050SThomas Veerman 			csize = DEFAULT_CSIZE;
266*357f1050SThomas Veerman 		else
267*357f1050SThomas Veerman 			csize = CSIZE;
268*357f1050SThomas Veerman 	}
269*357f1050SThomas Veerman 
270*357f1050SThomas Veerman 	if (interactive == unspecified) {
271*357f1050SThomas Veerman 		if (fulltbl || fullspd)
272*357f1050SThomas Veerman 			interactive = false;
273*357f1050SThomas Veerman 		else
274*357f1050SThomas Veerman 			interactive = true;
275*357f1050SThomas Veerman 	}
276*357f1050SThomas Veerman 
277*357f1050SThomas Veerman 	if (fulltbl || fullspd) {
278*357f1050SThomas Veerman 		if (usemecs)
279*357f1050SThomas Veerman 			flexerror (_
280*357f1050SThomas Veerman 				   ("-Cf/-CF and -Cm don't make sense together"));
281*357f1050SThomas Veerman 
282*357f1050SThomas Veerman 		if (interactive)
283*357f1050SThomas Veerman 			flexerror (_("-Cf/-CF and -I are incompatible"));
284*357f1050SThomas Veerman 
285*357f1050SThomas Veerman 		if (lex_compat)
286*357f1050SThomas Veerman 			flexerror (_
287*357f1050SThomas Veerman 				   ("-Cf/-CF are incompatible with lex-compatibility mode"));
288*357f1050SThomas Veerman 
289*357f1050SThomas Veerman 
290*357f1050SThomas Veerman 		if (fulltbl && fullspd)
291*357f1050SThomas Veerman 			flexerror (_
292*357f1050SThomas Veerman 				   ("-Cf and -CF are mutually exclusive"));
293*357f1050SThomas Veerman 	}
294*357f1050SThomas Veerman 
295*357f1050SThomas Veerman 	if (C_plus_plus && fullspd)
296*357f1050SThomas Veerman 		flexerror (_("Can't use -+ with -CF option"));
297*357f1050SThomas Veerman 
298*357f1050SThomas Veerman 	if (C_plus_plus && yytext_is_array) {
299*357f1050SThomas Veerman 		lwarn (_("%array incompatible with -+ option"));
300*357f1050SThomas Veerman 		yytext_is_array = false;
301*357f1050SThomas Veerman 	}
302*357f1050SThomas Veerman 
303*357f1050SThomas Veerman 	if (C_plus_plus && (reentrant))
304*357f1050SThomas Veerman 		flexerror (_("Options -+ and --reentrant are mutually exclusive."));
305*357f1050SThomas Veerman 
306*357f1050SThomas Veerman 	if (C_plus_plus && bison_bridge_lval)
307*357f1050SThomas Veerman 		flexerror (_("bison bridge not supported for the C++ scanner."));
308*357f1050SThomas Veerman 
309*357f1050SThomas Veerman 
310*357f1050SThomas Veerman 	if (useecs) {		/* Set up doubly-linked equivalence classes. */
311*357f1050SThomas Veerman 
312*357f1050SThomas Veerman 		/* We loop all the way up to csize, since ecgroup[csize] is
313*357f1050SThomas Veerman 		 * the position used for NUL characters.
314*357f1050SThomas Veerman 		 */
315*357f1050SThomas Veerman 		ecgroup[1] = NIL;
316*357f1050SThomas Veerman 
317*357f1050SThomas Veerman 		for (i = 2; i <= csize; ++i) {
318*357f1050SThomas Veerman 			ecgroup[i] = i - 1;
319*357f1050SThomas Veerman 			nextecm[i - 1] = i;
320*357f1050SThomas Veerman 		}
321*357f1050SThomas Veerman 
322*357f1050SThomas Veerman 		nextecm[csize] = NIL;
323*357f1050SThomas Veerman 	}
324*357f1050SThomas Veerman 
325*357f1050SThomas Veerman 	else {
326*357f1050SThomas Veerman 		/* Put everything in its own equivalence class. */
327*357f1050SThomas Veerman 		for (i = 1; i <= csize; ++i) {
328*357f1050SThomas Veerman 			ecgroup[i] = i;
329*357f1050SThomas Veerman 			nextecm[i] = BAD_SUBSCRIPT;	/* to catch errors */
330*357f1050SThomas Veerman 		}
331*357f1050SThomas Veerman 	}
332*357f1050SThomas Veerman 
333*357f1050SThomas Veerman     if (!ansi_func_defs)
334*357f1050SThomas Veerman         buf_m4_define( &m4defs_buf, "M4_YY_NO_ANSI_FUNC_DEFS", NULL);
335*357f1050SThomas Veerman 
336*357f1050SThomas Veerman     if (!ansi_func_protos)
337*357f1050SThomas Veerman         buf_m4_define( &m4defs_buf, "M4_YY_NO_ANSI_FUNC_PROTOS", NULL);
338*357f1050SThomas Veerman 
339*357f1050SThomas Veerman     if (extra_type)
340*357f1050SThomas Veerman         buf_m4_define( &m4defs_buf, "M4_EXTRA_TYPE_DEFS", extra_type);
341*357f1050SThomas Veerman 
342*357f1050SThomas Veerman 	if (!use_stdout) {
343*357f1050SThomas Veerman 		FILE   *prev_stdout;
344*357f1050SThomas Veerman 
345*357f1050SThomas Veerman 		if (!did_outfilename) {
346*357f1050SThomas Veerman 			char   *suffix;
347*357f1050SThomas Veerman 
348*357f1050SThomas Veerman 			if (C_plus_plus)
349*357f1050SThomas Veerman 				suffix = "cc";
350*357f1050SThomas Veerman 			else
351*357f1050SThomas Veerman 				suffix = "c";
352*357f1050SThomas Veerman 
353*357f1050SThomas Veerman 			snprintf (outfile_path, sizeof(outfile_path), outfile_template,
354*357f1050SThomas Veerman 				 prefix, suffix);
355*357f1050SThomas Veerman 
356*357f1050SThomas Veerman 			outfilename = outfile_path;
357*357f1050SThomas Veerman 		}
358*357f1050SThomas Veerman 
359*357f1050SThomas Veerman 		prev_stdout = freopen (outfilename, "w+", stdout);
360*357f1050SThomas Veerman 
361*357f1050SThomas Veerman 		if (prev_stdout == NULL)
362*357f1050SThomas Veerman 			lerrsf (_("could not create %s"), outfilename);
363*357f1050SThomas Veerman 
364*357f1050SThomas Veerman 		outfile_created = 1;
365*357f1050SThomas Veerman 	}
366*357f1050SThomas Veerman 
367*357f1050SThomas Veerman 
368*357f1050SThomas Veerman     /* Setup the filter chain. */
369*357f1050SThomas Veerman     output_chain = filter_create_int(NULL, filter_tee_header, headerfilename);
370*357f1050SThomas Veerman     if ( !(m4 = getenv("M4")))
371*357f1050SThomas Veerman         m4 = M4;
372*357f1050SThomas Veerman     filter_create_ext(output_chain, m4, "-P", 0);
373*357f1050SThomas Veerman     filter_create_int(output_chain, filter_fix_linedirs, NULL);
374*357f1050SThomas Veerman 
375*357f1050SThomas Veerman     /* For debugging, only run the requested number of filters. */
376*357f1050SThomas Veerman     if (preproc_level > 0) {
377*357f1050SThomas Veerman         filter_truncate(output_chain, preproc_level);
378*357f1050SThomas Veerman         filter_apply_chain(output_chain);
379*357f1050SThomas Veerman     }
380*357f1050SThomas Veerman     yyout = stdout;
381*357f1050SThomas Veerman 
382*357f1050SThomas Veerman 
383*357f1050SThomas Veerman 	/* always generate the tablesverify flag. */
384*357f1050SThomas Veerman 	buf_m4_define (&m4defs_buf, "M4_YY_TABLES_VERIFY", tablesverify ? "1" : "0");
385*357f1050SThomas Veerman 	if (tablesext)
386*357f1050SThomas Veerman 		gentables = false;
387*357f1050SThomas Veerman 
388*357f1050SThomas Veerman 	if (tablesverify)
389*357f1050SThomas Veerman 		/* force generation of C tables. */
390*357f1050SThomas Veerman 		gentables = true;
391*357f1050SThomas Veerman 
392*357f1050SThomas Veerman 
393*357f1050SThomas Veerman 	if (tablesext) {
394*357f1050SThomas Veerman 		FILE   *tablesout;
395*357f1050SThomas Veerman 		struct yytbl_hdr hdr;
396*357f1050SThomas Veerman 		char   *pname = 0;
397*357f1050SThomas Veerman 		int     nbytes = 0;
398*357f1050SThomas Veerman 
399*357f1050SThomas Veerman 		buf_m4_define (&m4defs_buf, "M4_YY_TABLES_EXTERNAL", NULL);
400*357f1050SThomas Veerman 
401*357f1050SThomas Veerman 		if (!tablesfilename) {
402*357f1050SThomas Veerman 			nbytes = strlen (prefix) + strlen (tablesfile_template) + 2;
403*357f1050SThomas Veerman 			tablesfilename = pname = (char *) calloc (nbytes, 1);
404*357f1050SThomas Veerman 			snprintf (pname, nbytes, tablesfile_template, prefix);
405*357f1050SThomas Veerman 		}
406*357f1050SThomas Veerman 
407*357f1050SThomas Veerman 		if ((tablesout = fopen (tablesfilename, "w")) == NULL)
408*357f1050SThomas Veerman 			lerrsf (_("could not create %s"), tablesfilename);
409*357f1050SThomas Veerman 		if (pname)
410*357f1050SThomas Veerman 			free (pname);
411*357f1050SThomas Veerman 		tablesfilename = 0;
412*357f1050SThomas Veerman 
413*357f1050SThomas Veerman 		yytbl_writer_init (&tableswr, tablesout);
414*357f1050SThomas Veerman 
415*357f1050SThomas Veerman 		nbytes = strlen (prefix) + strlen ("tables") + 2;
416*357f1050SThomas Veerman 		tablesname = (char *) calloc (nbytes, 1);
417*357f1050SThomas Veerman 		snprintf (tablesname, nbytes, "%stables", prefix);
418*357f1050SThomas Veerman 		yytbl_hdr_init (&hdr, flex_version, tablesname);
419*357f1050SThomas Veerman 
420*357f1050SThomas Veerman 		if (yytbl_hdr_fwrite (&tableswr, &hdr) <= 0)
421*357f1050SThomas Veerman 			flexerror (_("could not write tables header"));
422*357f1050SThomas Veerman 	}
423*357f1050SThomas Veerman 
424*357f1050SThomas Veerman 	if (skelname && (skelfile = fopen (skelname, "r")) == NULL)
425*357f1050SThomas Veerman 		lerrsf (_("can't open skeleton file %s"), skelname);
426*357f1050SThomas Veerman 
427*357f1050SThomas Veerman 	if (reentrant) {
428*357f1050SThomas Veerman         buf_m4_define (&m4defs_buf, "M4_YY_REENTRANT", NULL);
429*357f1050SThomas Veerman 		if (yytext_is_array)
430*357f1050SThomas Veerman 			buf_m4_define (&m4defs_buf, "M4_YY_TEXT_IS_ARRAY", NULL);
431*357f1050SThomas Veerman 	}
432*357f1050SThomas Veerman 
433*357f1050SThomas Veerman 	if ( bison_bridge_lval)
434*357f1050SThomas Veerman 		buf_m4_define (&m4defs_buf, "M4_YY_BISON_LVAL", NULL);
435*357f1050SThomas Veerman 
436*357f1050SThomas Veerman 	if ( bison_bridge_lloc)
437*357f1050SThomas Veerman         buf_m4_define (&m4defs_buf, "<M4_YY_BISON_LLOC>", NULL);
438*357f1050SThomas Veerman 
439*357f1050SThomas Veerman     buf_m4_define(&m4defs_buf, "M4_YY_PREFIX", prefix);
440*357f1050SThomas Veerman 
441*357f1050SThomas Veerman 	if (did_outfilename)
442*357f1050SThomas Veerman 		line_directive_out (stdout, 0);
443*357f1050SThomas Veerman 
444*357f1050SThomas Veerman 	if (do_yylineno)
445*357f1050SThomas Veerman 		buf_m4_define (&m4defs_buf, "M4_YY_USE_LINENO", NULL);
446*357f1050SThomas Veerman 
447*357f1050SThomas Veerman 	/* Create the alignment type. */
448*357f1050SThomas Veerman 	buf_strdefine (&userdef_buf, "YY_INT_ALIGNED",
449*357f1050SThomas Veerman 		       long_align ? "long int" : "short int");
450*357f1050SThomas Veerman 
451*357f1050SThomas Veerman     /* Define the start condition macros. */
452*357f1050SThomas Veerman     {
453*357f1050SThomas Veerman         struct Buf tmpbuf;
454*357f1050SThomas Veerman         buf_init(&tmpbuf, sizeof(char));
455*357f1050SThomas Veerman         for (i = 1; i <= lastsc; i++) {
456*357f1050SThomas Veerman              char *str, *fmt = "#define %s %d\n";
457*357f1050SThomas Veerman              size_t strsz;
458*357f1050SThomas Veerman 
459*357f1050SThomas Veerman              str = (char*)flex_alloc(strsz = strlen(fmt) + strlen(scname[i]) + (int)(1 + log10(i)) + 2);
460*357f1050SThomas Veerman              snprintf(str, strsz, fmt,      scname[i], i - 1);
461*357f1050SThomas Veerman              buf_strappend(&tmpbuf, str);
462*357f1050SThomas Veerman              free(str);
463*357f1050SThomas Veerman         }
464*357f1050SThomas Veerman         buf_m4_define(&m4defs_buf, "M4_YY_SC_DEFS", tmpbuf.elts);
465*357f1050SThomas Veerman         buf_destroy(&tmpbuf);
466*357f1050SThomas Veerman     }
467*357f1050SThomas Veerman 
468*357f1050SThomas Veerman     /* This is where we begin writing to the file. */
469*357f1050SThomas Veerman 
470*357f1050SThomas Veerman     /* Dump the %top code. */
471*357f1050SThomas Veerman     if( top_buf.elts)
472*357f1050SThomas Veerman         outn((char*) top_buf.elts);
473*357f1050SThomas Veerman 
474*357f1050SThomas Veerman     /* Dump the m4 definitions. */
475*357f1050SThomas Veerman     buf_print_strings(&m4defs_buf, stdout);
476*357f1050SThomas Veerman     m4defs_buf.nelts = 0; /* memory leak here. */
477*357f1050SThomas Veerman 
478*357f1050SThomas Veerman     /* Place a bogus line directive, it will be fixed in the filter. */
479*357f1050SThomas Veerman     outn("#line 0 \"M4_YY_OUTFILE_NAME\"\n");
480*357f1050SThomas Veerman 
481*357f1050SThomas Veerman 	/* Dump the user defined preproc directives. */
482*357f1050SThomas Veerman 	if (userdef_buf.elts)
483*357f1050SThomas Veerman 		outn ((char *) (userdef_buf.elts));
484*357f1050SThomas Veerman 
485*357f1050SThomas Veerman 	skelout ();
486*357f1050SThomas Veerman 	/* %% [1.0] */
487*357f1050SThomas Veerman }
488*357f1050SThomas Veerman 
489*357f1050SThomas Veerman /* flexend - terminate flex
490*357f1050SThomas Veerman  *
491*357f1050SThomas Veerman  * note
492*357f1050SThomas Veerman  *    This routine does not return.
493*357f1050SThomas Veerman  */
494*357f1050SThomas Veerman 
495*357f1050SThomas Veerman void flexend (exit_status)
496*357f1050SThomas Veerman      int exit_status;
497*357f1050SThomas Veerman 
498*357f1050SThomas Veerman {
499*357f1050SThomas Veerman 	static int called_before = -1;	/* prevent infinite recursion. */
500*357f1050SThomas Veerman 	int     tblsiz;
501*357f1050SThomas Veerman 
502*357f1050SThomas Veerman 	if (++called_before)
503*357f1050SThomas Veerman 		FLEX_EXIT (exit_status);
504*357f1050SThomas Veerman 
505*357f1050SThomas Veerman 	if (skelfile != NULL) {
506*357f1050SThomas Veerman 		if (ferror (skelfile))
507*357f1050SThomas Veerman 			lerrsf (_("input error reading skeleton file %s"),
508*357f1050SThomas Veerman 				skelname);
509*357f1050SThomas Veerman 
510*357f1050SThomas Veerman 		else if (fclose (skelfile))
511*357f1050SThomas Veerman 			lerrsf (_("error closing skeleton file %s"),
512*357f1050SThomas Veerman 				skelname);
513*357f1050SThomas Veerman 	}
514*357f1050SThomas Veerman 
515*357f1050SThomas Veerman #if 0
516*357f1050SThomas Veerman 		fprintf (header_out,
517*357f1050SThomas Veerman 			 "#ifdef YY_HEADER_EXPORT_START_CONDITIONS\n");
518*357f1050SThomas Veerman 		fprintf (header_out,
519*357f1050SThomas Veerman 			 "/* Beware! Start conditions are not prefixed. */\n");
520*357f1050SThomas Veerman 
521*357f1050SThomas Veerman 		/* Special case for "INITIAL" */
522*357f1050SThomas Veerman 		fprintf (header_out,
523*357f1050SThomas Veerman 			 "#undef INITIAL\n#define INITIAL 0\n");
524*357f1050SThomas Veerman 		for (i = 2; i <= lastsc; i++)
525*357f1050SThomas Veerman 			fprintf (header_out, "#define %s %d\n", scname[i], i - 1);
526*357f1050SThomas Veerman 		fprintf (header_out,
527*357f1050SThomas Veerman 			 "#endif /* YY_HEADER_EXPORT_START_CONDITIONS */\n\n");
528*357f1050SThomas Veerman 
529*357f1050SThomas Veerman 		/* Kill ALL flex-related macros. This is so the user
530*357f1050SThomas Veerman 		 * can #include more than one generated header file. */
531*357f1050SThomas Veerman 		fprintf (header_out, "#ifndef YY_HEADER_NO_UNDEFS\n");
532*357f1050SThomas Veerman 		fprintf (header_out,
533*357f1050SThomas Veerman 			 "/* Undefine all internal macros, etc., that do no belong in the header. */\n\n");
534*357f1050SThomas Veerman 
535*357f1050SThomas Veerman         {
536*357f1050SThomas Veerman             const char * undef_list[] = {
537*357f1050SThomas Veerman 
538*357f1050SThomas Veerman                 "BEGIN",
539*357f1050SThomas Veerman                 "ECHO",
540*357f1050SThomas Veerman                 "EOB_ACT_CONTINUE_SCAN",
541*357f1050SThomas Veerman                 "EOB_ACT_END_OF_FILE",
542*357f1050SThomas Veerman                 "EOB_ACT_LAST_MATCH",
543*357f1050SThomas Veerman                 "FLEX_SCANNER",
544*357f1050SThomas Veerman                 "FLEX_STD",
545*357f1050SThomas Veerman                 "REJECT",
546*357f1050SThomas Veerman                 "YYFARGS0",
547*357f1050SThomas Veerman                 "YYFARGS1",
548*357f1050SThomas Veerman                 "YYFARGS2",
549*357f1050SThomas Veerman                 "YYFARGS3",
550*357f1050SThomas Veerman                 "YYLMAX",
551*357f1050SThomas Veerman                 "YYSTATE",
552*357f1050SThomas Veerman                 "YY_AT_BOL",
553*357f1050SThomas Veerman                 "YY_BREAK",
554*357f1050SThomas Veerman                 "YY_BUFFER_EOF_PENDING",
555*357f1050SThomas Veerman                 "YY_BUFFER_NEW",
556*357f1050SThomas Veerman                 "YY_BUFFER_NORMAL",
557*357f1050SThomas Veerman                 "YY_BUF_SIZE",
558*357f1050SThomas Veerman                 "M4_YY_CALL_LAST_ARG",
559*357f1050SThomas Veerman                 "M4_YY_CALL_ONLY_ARG",
560*357f1050SThomas Veerman                 "YY_CURRENT_BUFFER",
561*357f1050SThomas Veerman                 "YY_DECL",
562*357f1050SThomas Veerman                 "M4_YY_DECL_LAST_ARG",
563*357f1050SThomas Veerman                 "M4_YY_DEF_LAST_ARG",
564*357f1050SThomas Veerman                 "M4_YY_DEF_ONLY_ARG",
565*357f1050SThomas Veerman                 "YY_DO_BEFORE_ACTION",
566*357f1050SThomas Veerman                 "YY_END_OF_BUFFER",
567*357f1050SThomas Veerman                 "YY_END_OF_BUFFER_CHAR",
568*357f1050SThomas Veerman                 "YY_EXIT_FAILURE",
569*357f1050SThomas Veerman                 "YY_EXTRA_TYPE",
570*357f1050SThomas Veerman                 "YY_FATAL_ERROR",
571*357f1050SThomas Veerman                 "YY_FLEX_DEFINED_ECHO",
572*357f1050SThomas Veerman                 "YY_FLEX_LEX_COMPAT",
573*357f1050SThomas Veerman                 "YY_FLEX_MAJOR_VERSION",
574*357f1050SThomas Veerman                 "YY_FLEX_MINOR_VERSION",
575*357f1050SThomas Veerman                 "YY_FLEX_SUBMINOR_VERSION",
576*357f1050SThomas Veerman                 "YY_FLUSH_BUFFER",
577*357f1050SThomas Veerman                 "YY_G",
578*357f1050SThomas Veerman                 "YY_INPUT",
579*357f1050SThomas Veerman                 "YY_INTERACTIVE",
580*357f1050SThomas Veerman                 "YY_INT_ALIGNED",
581*357f1050SThomas Veerman                 "YY_LAST_ARG",
582*357f1050SThomas Veerman                 "YY_LESS_LINENO",
583*357f1050SThomas Veerman                 "YY_LEX_ARGS",
584*357f1050SThomas Veerman                 "YY_LEX_DECLARATION",
585*357f1050SThomas Veerman                 "YY_LEX_PROTO",
586*357f1050SThomas Veerman                 "YY_MAIN",
587*357f1050SThomas Veerman                 "YY_MORE_ADJ",
588*357f1050SThomas Veerman                 "YY_NEED_STRLEN",
589*357f1050SThomas Veerman                 "YY_NEW_FILE",
590*357f1050SThomas Veerman                 "YY_NULL",
591*357f1050SThomas Veerman                 "YY_NUM_RULES",
592*357f1050SThomas Veerman                 "YY_ONLY_ARG",
593*357f1050SThomas Veerman                 "YY_PARAMS",
594*357f1050SThomas Veerman                 "YY_PROTO",
595*357f1050SThomas Veerman                 "M4_YY_PROTO_LAST_ARG",
596*357f1050SThomas Veerman                 "M4_YY_PROTO_ONLY_ARG void",
597*357f1050SThomas Veerman                 "YY_READ_BUF_SIZE",
598*357f1050SThomas Veerman                 "YY_REENTRANT",
599*357f1050SThomas Veerman                 "YY_RESTORE_YY_MORE_OFFSET",
600*357f1050SThomas Veerman                 "YY_RULE_SETUP",
601*357f1050SThomas Veerman                 "YY_SC_TO_UI",
602*357f1050SThomas Veerman                 "YY_SKIP_YYWRAP",
603*357f1050SThomas Veerman                 "YY_START",
604*357f1050SThomas Veerman                 "YY_START_STACK_INCR",
605*357f1050SThomas Veerman                 "YY_STATE_EOF",
606*357f1050SThomas Veerman                 "YY_STDINIT",
607*357f1050SThomas Veerman                 "YY_TRAILING_HEAD_MASK",
608*357f1050SThomas Veerman                 "YY_TRAILING_MASK",
609*357f1050SThomas Veerman                 "YY_USER_ACTION",
610*357f1050SThomas Veerman                 "YY_USE_CONST",
611*357f1050SThomas Veerman                 "YY_USE_PROTOS",
612*357f1050SThomas Veerman                 "unput",
613*357f1050SThomas Veerman                 "yyTABLES_NAME",
614*357f1050SThomas Veerman                 "yy_create_buffer",
615*357f1050SThomas Veerman                 "yy_delete_buffer",
616*357f1050SThomas Veerman                 "yy_flex_debug",
617*357f1050SThomas Veerman                 "yy_flush_buffer",
618*357f1050SThomas Veerman                 "yy_init_buffer",
619*357f1050SThomas Veerman                 "yy_load_buffer_state",
620*357f1050SThomas Veerman                 "yy_new_buffer",
621*357f1050SThomas Veerman                 "yy_scan_buffer",
622*357f1050SThomas Veerman                 "yy_scan_bytes",
623*357f1050SThomas Veerman                 "yy_scan_string",
624*357f1050SThomas Veerman                 "yy_set_bol",
625*357f1050SThomas Veerman                 "yy_set_interactive",
626*357f1050SThomas Veerman                 "yy_switch_to_buffer",
627*357f1050SThomas Veerman 				"yypush_buffer_state",
628*357f1050SThomas Veerman 				"yypop_buffer_state",
629*357f1050SThomas Veerman 				"yyensure_buffer_stack",
630*357f1050SThomas Veerman                 "yyalloc",
631*357f1050SThomas Veerman                 "yyconst",
632*357f1050SThomas Veerman                 "yyextra",
633*357f1050SThomas Veerman                 "yyfree",
634*357f1050SThomas Veerman                 "yyget_debug",
635*357f1050SThomas Veerman                 "yyget_extra",
636*357f1050SThomas Veerman                 "yyget_in",
637*357f1050SThomas Veerman                 "yyget_leng",
638*357f1050SThomas Veerman                 "yyget_lineno",
639*357f1050SThomas Veerman                 "yyget_lloc",
640*357f1050SThomas Veerman                 "yyget_lval",
641*357f1050SThomas Veerman                 "yyget_out",
642*357f1050SThomas Veerman                 "yyget_text",
643*357f1050SThomas Veerman                 "yyin",
644*357f1050SThomas Veerman                 "yyleng",
645*357f1050SThomas Veerman                 "yyless",
646*357f1050SThomas Veerman                 "yylex",
647*357f1050SThomas Veerman                 "yylex_destroy",
648*357f1050SThomas Veerman                 "yylex_init",
649*357f1050SThomas Veerman                 "yylex_init_extra",
650*357f1050SThomas Veerman                 "yylineno",
651*357f1050SThomas Veerman                 "yylloc",
652*357f1050SThomas Veerman                 "yylval",
653*357f1050SThomas Veerman                 "yymore",
654*357f1050SThomas Veerman                 "yyout",
655*357f1050SThomas Veerman                 "yyrealloc",
656*357f1050SThomas Veerman                 "yyrestart",
657*357f1050SThomas Veerman                 "yyset_debug",
658*357f1050SThomas Veerman                 "yyset_extra",
659*357f1050SThomas Veerman                 "yyset_in",
660*357f1050SThomas Veerman                 "yyset_lineno",
661*357f1050SThomas Veerman                 "yyset_lloc",
662*357f1050SThomas Veerman                 "yyset_lval",
663*357f1050SThomas Veerman                 "yyset_out",
664*357f1050SThomas Veerman                 "yytables_destroy",
665*357f1050SThomas Veerman                 "yytables_fload",
666*357f1050SThomas Veerman                 "yyterminate",
667*357f1050SThomas Veerman                 "yytext",
668*357f1050SThomas Veerman                 "yytext_ptr",
669*357f1050SThomas Veerman                 "yywrap",
670*357f1050SThomas Veerman 
671*357f1050SThomas Veerman                 /* must be null-terminated */
672*357f1050SThomas Veerman                 NULL};
673*357f1050SThomas Veerman 
674*357f1050SThomas Veerman 
675*357f1050SThomas Veerman                 for (i=0; undef_list[i] != NULL; i++)
676*357f1050SThomas Veerman                     fprintf (header_out, "#undef %s\n", undef_list[i]);
677*357f1050SThomas Veerman         }
678*357f1050SThomas Veerman 
679*357f1050SThomas Veerman 		/* undef any of the auto-generated symbols. */
680*357f1050SThomas Veerman 		for (i = 0; i < defs_buf.nelts; i++) {
681*357f1050SThomas Veerman 
682*357f1050SThomas Veerman 			/* don't undef start conditions */
683*357f1050SThomas Veerman 			if (sclookup (((char **) defs_buf.elts)[i]) > 0)
684*357f1050SThomas Veerman 				continue;
685*357f1050SThomas Veerman 			fprintf (header_out, "#undef %s\n",
686*357f1050SThomas Veerman 				 ((char **) defs_buf.elts)[i]);
687*357f1050SThomas Veerman 		}
688*357f1050SThomas Veerman 
689*357f1050SThomas Veerman 		fprintf (header_out,
690*357f1050SThomas Veerman 			 "#endif /* !YY_HEADER_NO_UNDEFS */\n");
691*357f1050SThomas Veerman 		fprintf (header_out, "\n");
692*357f1050SThomas Veerman 		fprintf (header_out, "#undef %sIN_HEADER\n", prefix);
693*357f1050SThomas Veerman 		fprintf (header_out, "#endif /* %sHEADER_H */\n", prefix);
694*357f1050SThomas Veerman 
695*357f1050SThomas Veerman 		if (ferror (header_out))
696*357f1050SThomas Veerman 			lerrsf (_("error creating header file %s"),
697*357f1050SThomas Veerman 				headerfilename);
698*357f1050SThomas Veerman 		fflush (header_out);
699*357f1050SThomas Veerman 		fclose (header_out);
700*357f1050SThomas Veerman #endif
701*357f1050SThomas Veerman 
702*357f1050SThomas Veerman 	if (exit_status != 0 && outfile_created) {
703*357f1050SThomas Veerman 		if (ferror (stdout))
704*357f1050SThomas Veerman 			lerrsf (_("error writing output file %s"),
705*357f1050SThomas Veerman 				outfilename);
706*357f1050SThomas Veerman 
707*357f1050SThomas Veerman 		else if ((_stdout_closed = 1) && fclose (stdout))
708*357f1050SThomas Veerman 			lerrsf (_("error closing output file %s"),
709*357f1050SThomas Veerman 				outfilename);
710*357f1050SThomas Veerman 
711*357f1050SThomas Veerman 		else if (unlink (outfilename))
712*357f1050SThomas Veerman 			lerrsf (_("error deleting output file %s"),
713*357f1050SThomas Veerman 				outfilename);
714*357f1050SThomas Veerman 	}
715*357f1050SThomas Veerman 
716*357f1050SThomas Veerman 
717*357f1050SThomas Veerman 	if (backing_up_report && backing_up_file) {
718*357f1050SThomas Veerman 		if (num_backing_up == 0)
719*357f1050SThomas Veerman 			fprintf (backing_up_file, _("No backing up.\n"));
720*357f1050SThomas Veerman 		else if (fullspd || fulltbl)
721*357f1050SThomas Veerman 			fprintf (backing_up_file,
722*357f1050SThomas Veerman 				 _
723*357f1050SThomas Veerman 				 ("%d backing up (non-accepting) states.\n"),
724*357f1050SThomas Veerman 				 num_backing_up);
725*357f1050SThomas Veerman 		else
726*357f1050SThomas Veerman 			fprintf (backing_up_file,
727*357f1050SThomas Veerman 				 _("Compressed tables always back up.\n"));
728*357f1050SThomas Veerman 
729*357f1050SThomas Veerman 		if (ferror (backing_up_file))
730*357f1050SThomas Veerman 			lerrsf (_("error writing backup file %s"),
731*357f1050SThomas Veerman 				backing_name);
732*357f1050SThomas Veerman 
733*357f1050SThomas Veerman 		else if (fclose (backing_up_file))
734*357f1050SThomas Veerman 			lerrsf (_("error closing backup file %s"),
735*357f1050SThomas Veerman 				backing_name);
736*357f1050SThomas Veerman 	}
737*357f1050SThomas Veerman 
738*357f1050SThomas Veerman 	if (printstats) {
739*357f1050SThomas Veerman 		fprintf (stderr, _("%s version %s usage statistics:\n"),
740*357f1050SThomas Veerman 			 program_name, flex_version);
741*357f1050SThomas Veerman 
742*357f1050SThomas Veerman 		fprintf (stderr, _("  scanner options: -"));
743*357f1050SThomas Veerman 
744*357f1050SThomas Veerman 		if (C_plus_plus)
745*357f1050SThomas Veerman 			putc ('+', stderr);
746*357f1050SThomas Veerman 		if (backing_up_report)
747*357f1050SThomas Veerman 			putc ('b', stderr);
748*357f1050SThomas Veerman 		if (ddebug)
749*357f1050SThomas Veerman 			putc ('d', stderr);
750*357f1050SThomas Veerman 		if (sf_case_ins())
751*357f1050SThomas Veerman 			putc ('i', stderr);
752*357f1050SThomas Veerman 		if (lex_compat)
753*357f1050SThomas Veerman 			putc ('l', stderr);
754*357f1050SThomas Veerman 		if (posix_compat)
755*357f1050SThomas Veerman 			putc ('X', stderr);
756*357f1050SThomas Veerman 		if (performance_report > 0)
757*357f1050SThomas Veerman 			putc ('p', stderr);
758*357f1050SThomas Veerman 		if (performance_report > 1)
759*357f1050SThomas Veerman 			putc ('p', stderr);
760*357f1050SThomas Veerman 		if (spprdflt)
761*357f1050SThomas Veerman 			putc ('s', stderr);
762*357f1050SThomas Veerman 		if (reentrant)
763*357f1050SThomas Veerman 			fputs ("--reentrant", stderr);
764*357f1050SThomas Veerman         if (bison_bridge_lval)
765*357f1050SThomas Veerman             fputs ("--bison-bridge", stderr);
766*357f1050SThomas Veerman         if (bison_bridge_lloc)
767*357f1050SThomas Veerman             fputs ("--bison-locations", stderr);
768*357f1050SThomas Veerman 		if (use_stdout)
769*357f1050SThomas Veerman 			putc ('t', stderr);
770*357f1050SThomas Veerman 		if (printstats)
771*357f1050SThomas Veerman 			putc ('v', stderr);	/* always true! */
772*357f1050SThomas Veerman 		if (nowarn)
773*357f1050SThomas Veerman 			putc ('w', stderr);
774*357f1050SThomas Veerman 		if (interactive == false)
775*357f1050SThomas Veerman 			putc ('B', stderr);
776*357f1050SThomas Veerman 		if (interactive == true)
777*357f1050SThomas Veerman 			putc ('I', stderr);
778*357f1050SThomas Veerman 		if (!gen_line_dirs)
779*357f1050SThomas Veerman 			putc ('L', stderr);
780*357f1050SThomas Veerman 		if (trace)
781*357f1050SThomas Veerman 			putc ('T', stderr);
782*357f1050SThomas Veerman 
783*357f1050SThomas Veerman 		if (csize == unspecified)
784*357f1050SThomas Veerman 			/* We encountered an error fairly early on, so csize
785*357f1050SThomas Veerman 			 * never got specified.  Define it now, to prevent
786*357f1050SThomas Veerman 			 * bogus table sizes being written out below.
787*357f1050SThomas Veerman 			 */
788*357f1050SThomas Veerman 			csize = 256;
789*357f1050SThomas Veerman 
790*357f1050SThomas Veerman 		if (csize == 128)
791*357f1050SThomas Veerman 			putc ('7', stderr);
792*357f1050SThomas Veerman 		else
793*357f1050SThomas Veerman 			putc ('8', stderr);
794*357f1050SThomas Veerman 
795*357f1050SThomas Veerman 		fprintf (stderr, " -C");
796*357f1050SThomas Veerman 
797*357f1050SThomas Veerman 		if (long_align)
798*357f1050SThomas Veerman 			putc ('a', stderr);
799*357f1050SThomas Veerman 		if (fulltbl)
800*357f1050SThomas Veerman 			putc ('f', stderr);
801*357f1050SThomas Veerman 		if (fullspd)
802*357f1050SThomas Veerman 			putc ('F', stderr);
803*357f1050SThomas Veerman 		if (useecs)
804*357f1050SThomas Veerman 			putc ('e', stderr);
805*357f1050SThomas Veerman 		if (usemecs)
806*357f1050SThomas Veerman 			putc ('m', stderr);
807*357f1050SThomas Veerman 		if (use_read)
808*357f1050SThomas Veerman 			putc ('r', stderr);
809*357f1050SThomas Veerman 
810*357f1050SThomas Veerman 		if (did_outfilename)
811*357f1050SThomas Veerman 			fprintf (stderr, " -o%s", outfilename);
812*357f1050SThomas Veerman 
813*357f1050SThomas Veerman 		if (skelname)
814*357f1050SThomas Veerman 			fprintf (stderr, " -S%s", skelname);
815*357f1050SThomas Veerman 
816*357f1050SThomas Veerman 		if (strcmp (prefix, "yy"))
817*357f1050SThomas Veerman 			fprintf (stderr, " -P%s", prefix);
818*357f1050SThomas Veerman 
819*357f1050SThomas Veerman 		putc ('\n', stderr);
820*357f1050SThomas Veerman 
821*357f1050SThomas Veerman 		fprintf (stderr, _("  %d/%d NFA states\n"),
822*357f1050SThomas Veerman 			 lastnfa, current_mns);
823*357f1050SThomas Veerman 		fprintf (stderr, _("  %d/%d DFA states (%d words)\n"),
824*357f1050SThomas Veerman 			 lastdfa, current_max_dfas, totnst);
825*357f1050SThomas Veerman 		fprintf (stderr, _("  %d rules\n"),
826*357f1050SThomas Veerman 			 num_rules + num_eof_rules -
827*357f1050SThomas Veerman 			 1 /* - 1 for def. rule */ );
828*357f1050SThomas Veerman 
829*357f1050SThomas Veerman 		if (num_backing_up == 0)
830*357f1050SThomas Veerman 			fprintf (stderr, _("  No backing up\n"));
831*357f1050SThomas Veerman 		else if (fullspd || fulltbl)
832*357f1050SThomas Veerman 			fprintf (stderr,
833*357f1050SThomas Veerman 				 _
834*357f1050SThomas Veerman 				 ("  %d backing-up (non-accepting) states\n"),
835*357f1050SThomas Veerman 				 num_backing_up);
836*357f1050SThomas Veerman 		else
837*357f1050SThomas Veerman 			fprintf (stderr,
838*357f1050SThomas Veerman 				 _
839*357f1050SThomas Veerman 				 ("  Compressed tables always back-up\n"));
840*357f1050SThomas Veerman 
841*357f1050SThomas Veerman 		if (bol_needed)
842*357f1050SThomas Veerman 			fprintf (stderr,
843*357f1050SThomas Veerman 				 _("  Beginning-of-line patterns used\n"));
844*357f1050SThomas Veerman 
845*357f1050SThomas Veerman 		fprintf (stderr, _("  %d/%d start conditions\n"), lastsc,
846*357f1050SThomas Veerman 			 current_max_scs);
847*357f1050SThomas Veerman 		fprintf (stderr,
848*357f1050SThomas Veerman 			 _
849*357f1050SThomas Veerman 			 ("  %d epsilon states, %d double epsilon states\n"),
850*357f1050SThomas Veerman 			 numeps, eps2);
851*357f1050SThomas Veerman 
852*357f1050SThomas Veerman 		if (lastccl == 0)
853*357f1050SThomas Veerman 			fprintf (stderr, _("  no character classes\n"));
854*357f1050SThomas Veerman 		else
855*357f1050SThomas Veerman 			fprintf (stderr,
856*357f1050SThomas Veerman 				 _
857*357f1050SThomas Veerman 				 ("  %d/%d character classes needed %d/%d words of storage, %d reused\n"),
858*357f1050SThomas Veerman 				 lastccl, current_maxccls,
859*357f1050SThomas Veerman 				 cclmap[lastccl] + ccllen[lastccl],
860*357f1050SThomas Veerman 				 current_max_ccl_tbl_size, cclreuse);
861*357f1050SThomas Veerman 
862*357f1050SThomas Veerman 		fprintf (stderr, _("  %d state/nextstate pairs created\n"),
863*357f1050SThomas Veerman 			 numsnpairs);
864*357f1050SThomas Veerman 		fprintf (stderr,
865*357f1050SThomas Veerman 			 _("  %d/%d unique/duplicate transitions\n"),
866*357f1050SThomas Veerman 			 numuniq, numdup);
867*357f1050SThomas Veerman 
868*357f1050SThomas Veerman 		if (fulltbl) {
869*357f1050SThomas Veerman 			tblsiz = lastdfa * numecs;
870*357f1050SThomas Veerman 			fprintf (stderr, _("  %d table entries\n"),
871*357f1050SThomas Veerman 				 tblsiz);
872*357f1050SThomas Veerman 		}
873*357f1050SThomas Veerman 
874*357f1050SThomas Veerman 		else {
875*357f1050SThomas Veerman 			tblsiz = 2 * (lastdfa + numtemps) + 2 * tblend;
876*357f1050SThomas Veerman 
877*357f1050SThomas Veerman 			fprintf (stderr,
878*357f1050SThomas Veerman 				 _("  %d/%d base-def entries created\n"),
879*357f1050SThomas Veerman 				 lastdfa + numtemps, current_max_dfas);
880*357f1050SThomas Veerman 			fprintf (stderr,
881*357f1050SThomas Veerman 				 _
882*357f1050SThomas Veerman 				 ("  %d/%d (peak %d) nxt-chk entries created\n"),
883*357f1050SThomas Veerman 				 tblend, current_max_xpairs, peakpairs);
884*357f1050SThomas Veerman 			fprintf (stderr,
885*357f1050SThomas Veerman 				 _
886*357f1050SThomas Veerman 				 ("  %d/%d (peak %d) template nxt-chk entries created\n"),
887*357f1050SThomas Veerman 				 numtemps * nummecs,
888*357f1050SThomas Veerman 				 current_max_template_xpairs,
889*357f1050SThomas Veerman 				 numtemps * numecs);
890*357f1050SThomas Veerman 			fprintf (stderr, _("  %d empty table entries\n"),
891*357f1050SThomas Veerman 				 nummt);
892*357f1050SThomas Veerman 			fprintf (stderr, _("  %d protos created\n"),
893*357f1050SThomas Veerman 				 numprots);
894*357f1050SThomas Veerman 			fprintf (stderr,
895*357f1050SThomas Veerman 				 _("  %d templates created, %d uses\n"),
896*357f1050SThomas Veerman 				 numtemps, tmpuses);
897*357f1050SThomas Veerman 		}
898*357f1050SThomas Veerman 
899*357f1050SThomas Veerman 		if (useecs) {
900*357f1050SThomas Veerman 			tblsiz = tblsiz + csize;
901*357f1050SThomas Veerman 			fprintf (stderr,
902*357f1050SThomas Veerman 				 _
903*357f1050SThomas Veerman 				 ("  %d/%d equivalence classes created\n"),
904*357f1050SThomas Veerman 				 numecs, csize);
905*357f1050SThomas Veerman 		}
906*357f1050SThomas Veerman 
907*357f1050SThomas Veerman 		if (usemecs) {
908*357f1050SThomas Veerman 			tblsiz = tblsiz + numecs;
909*357f1050SThomas Veerman 			fprintf (stderr,
910*357f1050SThomas Veerman 				 _
911*357f1050SThomas Veerman 				 ("  %d/%d meta-equivalence classes created\n"),
912*357f1050SThomas Veerman 				 nummecs, csize);
913*357f1050SThomas Veerman 		}
914*357f1050SThomas Veerman 
915*357f1050SThomas Veerman 		fprintf (stderr,
916*357f1050SThomas Veerman 			 _
917*357f1050SThomas Veerman 			 ("  %d (%d saved) hash collisions, %d DFAs equal\n"),
918*357f1050SThomas Veerman 			 hshcol, hshsave, dfaeql);
919*357f1050SThomas Veerman 		fprintf (stderr, _("  %d sets of reallocations needed\n"),
920*357f1050SThomas Veerman 			 num_reallocs);
921*357f1050SThomas Veerman 		fprintf (stderr, _("  %d total table entries needed\n"),
922*357f1050SThomas Veerman 			 tblsiz);
923*357f1050SThomas Veerman 	}
924*357f1050SThomas Veerman 
925*357f1050SThomas Veerman 	FLEX_EXIT (exit_status);
926*357f1050SThomas Veerman }
927*357f1050SThomas Veerman 
928*357f1050SThomas Veerman 
929*357f1050SThomas Veerman /* flexinit - initialize flex */
930*357f1050SThomas Veerman 
931*357f1050SThomas Veerman void flexinit (argc, argv)
932*357f1050SThomas Veerman      int argc;
933*357f1050SThomas Veerman      char  **argv;
934*357f1050SThomas Veerman {
935*357f1050SThomas Veerman 	int     i, sawcmpflag, rv, optind;
936*357f1050SThomas Veerman 	char   *arg;
937*357f1050SThomas Veerman 	scanopt_t sopt;
938*357f1050SThomas Veerman 
939*357f1050SThomas Veerman 	printstats = syntaxerror = trace = spprdflt = false;
940*357f1050SThomas Veerman 	lex_compat = posix_compat = C_plus_plus = backing_up_report =
941*357f1050SThomas Veerman 		ddebug = fulltbl = false;
942*357f1050SThomas Veerman 	fullspd = long_align = nowarn = yymore_used = continued_action =
943*357f1050SThomas Veerman 		false;
944*357f1050SThomas Veerman 	do_yylineno = yytext_is_array = in_rule = reject = do_stdinit =
945*357f1050SThomas Veerman 		false;
946*357f1050SThomas Veerman 	yymore_really_used = reject_really_used = unspecified;
947*357f1050SThomas Veerman 	interactive = csize = unspecified;
948*357f1050SThomas Veerman 	do_yywrap = gen_line_dirs = usemecs = useecs = true;
949*357f1050SThomas Veerman 	reentrant = bison_bridge_lval = bison_bridge_lloc = false;
950*357f1050SThomas Veerman 	performance_report = 0;
951*357f1050SThomas Veerman 	did_outfilename = 0;
952*357f1050SThomas Veerman 	prefix = "yy";
953*357f1050SThomas Veerman 	yyclass = 0;
954*357f1050SThomas Veerman 	use_read = use_stdout = false;
955*357f1050SThomas Veerman 	tablesext = tablesverify = false;
956*357f1050SThomas Veerman 	gentables = true;
957*357f1050SThomas Veerman 	tablesfilename = tablesname = NULL;
958*357f1050SThomas Veerman     ansi_func_defs = ansi_func_protos = true;
959*357f1050SThomas Veerman 
960*357f1050SThomas Veerman 	sawcmpflag = false;
961*357f1050SThomas Veerman 
962*357f1050SThomas Veerman 	/* Initialize dynamic array for holding the rule actions. */
963*357f1050SThomas Veerman 	action_size = 2048;	/* default size of action array in bytes */
964*357f1050SThomas Veerman 	action_array = allocate_character_array (action_size);
965*357f1050SThomas Veerman 	defs1_offset = prolog_offset = action_offset = action_index = 0;
966*357f1050SThomas Veerman 	action_array[0] = '\0';
967*357f1050SThomas Veerman 
968*357f1050SThomas Veerman 	/* Initialize any buffers. */
969*357f1050SThomas Veerman 	buf_init (&userdef_buf, sizeof (char));	/* one long string */
970*357f1050SThomas Veerman 	buf_init (&defs_buf, sizeof (char *));	/* list of strings */
971*357f1050SThomas Veerman 	buf_init (&yydmap_buf, sizeof (char));	/* one long string */
972*357f1050SThomas Veerman 	buf_init (&top_buf, sizeof (char));	    /* one long string */
973*357f1050SThomas Veerman 
974*357f1050SThomas Veerman     {
975*357f1050SThomas Veerman         const char * m4defs_init_str[] = {"m4_changequote\n",
976*357f1050SThomas Veerman                                           "m4_changequote([[, ]])\n"};
977*357f1050SThomas Veerman         buf_init (&m4defs_buf, sizeof (char *));
978*357f1050SThomas Veerman         buf_append (&m4defs_buf, &m4defs_init_str, 2);
979*357f1050SThomas Veerman     }
980*357f1050SThomas Veerman 
981*357f1050SThomas Veerman     sf_init ();
982*357f1050SThomas Veerman 
983*357f1050SThomas Veerman     /* initialize regex lib */
984*357f1050SThomas Veerman     flex_init_regex();
985*357f1050SThomas Veerman 
986*357f1050SThomas Veerman 	/* Enable C++ if program name ends with '+'. */
987*357f1050SThomas Veerman 	program_name = basename2 (argv[0], 0);
988*357f1050SThomas Veerman 
989*357f1050SThomas Veerman 	if (program_name[0] != '\0' &&
990*357f1050SThomas Veerman 	    program_name[strlen (program_name) - 1] == '+')
991*357f1050SThomas Veerman 		C_plus_plus = true;
992*357f1050SThomas Veerman 
993*357f1050SThomas Veerman 	/* read flags */
994*357f1050SThomas Veerman 	sopt = scanopt_init (flexopts, argc, argv, 0);
995*357f1050SThomas Veerman 	if (!sopt) {
996*357f1050SThomas Veerman 		/* This will only happen when flexopts array is altered. */
997*357f1050SThomas Veerman 		fprintf (stderr,
998*357f1050SThomas Veerman 			 _("Internal error. flexopts are malformed.\n"));
999*357f1050SThomas Veerman 		FLEX_EXIT (1);
1000*357f1050SThomas Veerman 	}
1001*357f1050SThomas Veerman 
1002*357f1050SThomas Veerman 	while ((rv = scanopt (sopt, &arg, &optind)) != 0) {
1003*357f1050SThomas Veerman 
1004*357f1050SThomas Veerman 		if (rv < 0) {
1005*357f1050SThomas Veerman 			/* Scanopt has already printed an option-specific error message. */
1006*357f1050SThomas Veerman 			fprintf (stderr,
1007*357f1050SThomas Veerman 				 _
1008*357f1050SThomas Veerman 				 ("Try `%s --help' for more information.\n"),
1009*357f1050SThomas Veerman 				 program_name);
1010*357f1050SThomas Veerman 			FLEX_EXIT (1);
1011*357f1050SThomas Veerman 		}
1012*357f1050SThomas Veerman 
1013*357f1050SThomas Veerman 		switch ((enum flexopt_flag_t) rv) {
1014*357f1050SThomas Veerman 		case OPT_CPLUSPLUS:
1015*357f1050SThomas Veerman 			C_plus_plus = true;
1016*357f1050SThomas Veerman 			break;
1017*357f1050SThomas Veerman 
1018*357f1050SThomas Veerman 		case OPT_BATCH:
1019*357f1050SThomas Veerman 			interactive = false;
1020*357f1050SThomas Veerman 			break;
1021*357f1050SThomas Veerman 
1022*357f1050SThomas Veerman 		case OPT_BACKUP:
1023*357f1050SThomas Veerman 			backing_up_report = true;
1024*357f1050SThomas Veerman 			break;
1025*357f1050SThomas Veerman 
1026*357f1050SThomas Veerman 		case OPT_DONOTHING:
1027*357f1050SThomas Veerman 			break;
1028*357f1050SThomas Veerman 
1029*357f1050SThomas Veerman 		case OPT_COMPRESSION:
1030*357f1050SThomas Veerman 			if (!sawcmpflag) {
1031*357f1050SThomas Veerman 				useecs = false;
1032*357f1050SThomas Veerman 				usemecs = false;
1033*357f1050SThomas Veerman 				fulltbl = false;
1034*357f1050SThomas Veerman 				sawcmpflag = true;
1035*357f1050SThomas Veerman 			}
1036*357f1050SThomas Veerman 
1037*357f1050SThomas Veerman 			for (i = 0; arg && arg[i] != '\0'; i++)
1038*357f1050SThomas Veerman 				switch (arg[i]) {
1039*357f1050SThomas Veerman 				case 'a':
1040*357f1050SThomas Veerman 					long_align = true;
1041*357f1050SThomas Veerman 					break;
1042*357f1050SThomas Veerman 
1043*357f1050SThomas Veerman 				case 'e':
1044*357f1050SThomas Veerman 					useecs = true;
1045*357f1050SThomas Veerman 					break;
1046*357f1050SThomas Veerman 
1047*357f1050SThomas Veerman 				case 'F':
1048*357f1050SThomas Veerman 					fullspd = true;
1049*357f1050SThomas Veerman 					break;
1050*357f1050SThomas Veerman 
1051*357f1050SThomas Veerman 				case 'f':
1052*357f1050SThomas Veerman 					fulltbl = true;
1053*357f1050SThomas Veerman 					break;
1054*357f1050SThomas Veerman 
1055*357f1050SThomas Veerman 				case 'm':
1056*357f1050SThomas Veerman 					usemecs = true;
1057*357f1050SThomas Veerman 					break;
1058*357f1050SThomas Veerman 
1059*357f1050SThomas Veerman 				case 'r':
1060*357f1050SThomas Veerman 					use_read = true;
1061*357f1050SThomas Veerman 					break;
1062*357f1050SThomas Veerman 
1063*357f1050SThomas Veerman 				default:
1064*357f1050SThomas Veerman 					lerrif (_
1065*357f1050SThomas Veerman 						("unknown -C option '%c'"),
1066*357f1050SThomas Veerman 						(int) arg[i]);
1067*357f1050SThomas Veerman 					break;
1068*357f1050SThomas Veerman 				}
1069*357f1050SThomas Veerman 			break;
1070*357f1050SThomas Veerman 
1071*357f1050SThomas Veerman 		case OPT_DEBUG:
1072*357f1050SThomas Veerman 			ddebug = true;
1073*357f1050SThomas Veerman 			break;
1074*357f1050SThomas Veerman 
1075*357f1050SThomas Veerman 		case OPT_NO_DEBUG:
1076*357f1050SThomas Veerman 			ddebug = false;
1077*357f1050SThomas Veerman 			break;
1078*357f1050SThomas Veerman 
1079*357f1050SThomas Veerman 		case OPT_FULL:
1080*357f1050SThomas Veerman 			useecs = usemecs = false;
1081*357f1050SThomas Veerman 			use_read = fulltbl = true;
1082*357f1050SThomas Veerman 			break;
1083*357f1050SThomas Veerman 
1084*357f1050SThomas Veerman 		case OPT_FAST:
1085*357f1050SThomas Veerman 			useecs = usemecs = false;
1086*357f1050SThomas Veerman 			use_read = fullspd = true;
1087*357f1050SThomas Veerman 			break;
1088*357f1050SThomas Veerman 
1089*357f1050SThomas Veerman 		case OPT_HELP:
1090*357f1050SThomas Veerman 			usage ();
1091*357f1050SThomas Veerman 			FLEX_EXIT (0);
1092*357f1050SThomas Veerman 
1093*357f1050SThomas Veerman 		case OPT_INTERACTIVE:
1094*357f1050SThomas Veerman 			interactive = true;
1095*357f1050SThomas Veerman 			break;
1096*357f1050SThomas Veerman 
1097*357f1050SThomas Veerman 		case OPT_CASE_INSENSITIVE:
1098*357f1050SThomas Veerman 			sf_set_case_ins(true);
1099*357f1050SThomas Veerman 			break;
1100*357f1050SThomas Veerman 
1101*357f1050SThomas Veerman 		case OPT_LEX_COMPAT:
1102*357f1050SThomas Veerman 			lex_compat = true;
1103*357f1050SThomas Veerman 			break;
1104*357f1050SThomas Veerman 
1105*357f1050SThomas Veerman 		case OPT_POSIX_COMPAT:
1106*357f1050SThomas Veerman 			posix_compat = true;
1107*357f1050SThomas Veerman 			break;
1108*357f1050SThomas Veerman 
1109*357f1050SThomas Veerman         case OPT_PREPROC_LEVEL:
1110*357f1050SThomas Veerman             preproc_level = strtol(arg,NULL,0);
1111*357f1050SThomas Veerman             break;
1112*357f1050SThomas Veerman 
1113*357f1050SThomas Veerman 		case OPT_MAIN:
1114*357f1050SThomas Veerman 			buf_strdefine (&userdef_buf, "YY_MAIN", "1");
1115*357f1050SThomas Veerman 			do_yywrap = false;
1116*357f1050SThomas Veerman 			break;
1117*357f1050SThomas Veerman 
1118*357f1050SThomas Veerman 		case OPT_NO_MAIN:
1119*357f1050SThomas Veerman 			buf_strdefine (&userdef_buf, "YY_MAIN", "0");
1120*357f1050SThomas Veerman 			break;
1121*357f1050SThomas Veerman 
1122*357f1050SThomas Veerman 		case OPT_NO_LINE:
1123*357f1050SThomas Veerman 			gen_line_dirs = false;
1124*357f1050SThomas Veerman 			break;
1125*357f1050SThomas Veerman 
1126*357f1050SThomas Veerman 		case OPT_OUTFILE:
1127*357f1050SThomas Veerman 			outfilename = arg;
1128*357f1050SThomas Veerman 			did_outfilename = 1;
1129*357f1050SThomas Veerman 			break;
1130*357f1050SThomas Veerman 
1131*357f1050SThomas Veerman 		case OPT_PREFIX:
1132*357f1050SThomas Veerman 			prefix = arg;
1133*357f1050SThomas Veerman 			break;
1134*357f1050SThomas Veerman 
1135*357f1050SThomas Veerman 		case OPT_PERF_REPORT:
1136*357f1050SThomas Veerman 			++performance_report;
1137*357f1050SThomas Veerman 			break;
1138*357f1050SThomas Veerman 
1139*357f1050SThomas Veerman 		case OPT_BISON_BRIDGE:
1140*357f1050SThomas Veerman 			bison_bridge_lval = true;
1141*357f1050SThomas Veerman 			break;
1142*357f1050SThomas Veerman 
1143*357f1050SThomas Veerman 		case OPT_BISON_BRIDGE_LOCATIONS:
1144*357f1050SThomas Veerman 			bison_bridge_lval = bison_bridge_lloc = true;
1145*357f1050SThomas Veerman 			break;
1146*357f1050SThomas Veerman 
1147*357f1050SThomas Veerman 		case OPT_REENTRANT:
1148*357f1050SThomas Veerman 			reentrant = true;
1149*357f1050SThomas Veerman 			break;
1150*357f1050SThomas Veerman 
1151*357f1050SThomas Veerman 		case OPT_NO_REENTRANT:
1152*357f1050SThomas Veerman 			reentrant = false;
1153*357f1050SThomas Veerman 			break;
1154*357f1050SThomas Veerman 
1155*357f1050SThomas Veerman 		case OPT_SKEL:
1156*357f1050SThomas Veerman 			skelname = arg;
1157*357f1050SThomas Veerman 			break;
1158*357f1050SThomas Veerman 
1159*357f1050SThomas Veerman 		case OPT_DEFAULT:
1160*357f1050SThomas Veerman 			spprdflt = false;
1161*357f1050SThomas Veerman 			break;
1162*357f1050SThomas Veerman 
1163*357f1050SThomas Veerman 		case OPT_NO_DEFAULT:
1164*357f1050SThomas Veerman 			spprdflt = true;
1165*357f1050SThomas Veerman 			break;
1166*357f1050SThomas Veerman 
1167*357f1050SThomas Veerman 		case OPT_STDOUT:
1168*357f1050SThomas Veerman 			use_stdout = true;
1169*357f1050SThomas Veerman 			break;
1170*357f1050SThomas Veerman 
1171*357f1050SThomas Veerman 		case OPT_NO_UNISTD_H:
1172*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_UNISTD_H", "1");
1173*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_UNISTD_H",0);
1174*357f1050SThomas Veerman 			break;
1175*357f1050SThomas Veerman 
1176*357f1050SThomas Veerman 		case OPT_TABLES_FILE:
1177*357f1050SThomas Veerman 			tablesext = true;
1178*357f1050SThomas Veerman 			tablesfilename = arg;
1179*357f1050SThomas Veerman 			break;
1180*357f1050SThomas Veerman 
1181*357f1050SThomas Veerman 		case OPT_TABLES_VERIFY:
1182*357f1050SThomas Veerman 			tablesverify = true;
1183*357f1050SThomas Veerman 			break;
1184*357f1050SThomas Veerman 
1185*357f1050SThomas Veerman 		case OPT_TRACE:
1186*357f1050SThomas Veerman 			trace = true;
1187*357f1050SThomas Veerman 			break;
1188*357f1050SThomas Veerman 
1189*357f1050SThomas Veerman 		case OPT_VERBOSE:
1190*357f1050SThomas Veerman 			printstats = true;
1191*357f1050SThomas Veerman 			break;
1192*357f1050SThomas Veerman 
1193*357f1050SThomas Veerman 		case OPT_VERSION:
1194*357f1050SThomas Veerman 			printf (_("%s %s\n"), program_name, flex_version);
1195*357f1050SThomas Veerman 			FLEX_EXIT (0);
1196*357f1050SThomas Veerman 
1197*357f1050SThomas Veerman 		case OPT_WARN:
1198*357f1050SThomas Veerman 			nowarn = false;
1199*357f1050SThomas Veerman 			break;
1200*357f1050SThomas Veerman 
1201*357f1050SThomas Veerman 		case OPT_NO_WARN:
1202*357f1050SThomas Veerman 			nowarn = true;
1203*357f1050SThomas Veerman 			break;
1204*357f1050SThomas Veerman 
1205*357f1050SThomas Veerman 		case OPT_7BIT:
1206*357f1050SThomas Veerman 			csize = 128;
1207*357f1050SThomas Veerman 			break;
1208*357f1050SThomas Veerman 
1209*357f1050SThomas Veerman 		case OPT_8BIT:
1210*357f1050SThomas Veerman 			csize = CSIZE;
1211*357f1050SThomas Veerman 			break;
1212*357f1050SThomas Veerman 
1213*357f1050SThomas Veerman 		case OPT_ALIGN:
1214*357f1050SThomas Veerman 			long_align = true;
1215*357f1050SThomas Veerman 			break;
1216*357f1050SThomas Veerman 
1217*357f1050SThomas Veerman 		case OPT_NO_ALIGN:
1218*357f1050SThomas Veerman 			long_align = false;
1219*357f1050SThomas Veerman 			break;
1220*357f1050SThomas Veerman 
1221*357f1050SThomas Veerman 		case OPT_ALWAYS_INTERACTIVE:
1222*357f1050SThomas Veerman 			buf_m4_define (&m4defs_buf, "M4_YY_ALWAYS_INTERACTIVE", 0);
1223*357f1050SThomas Veerman 			break;
1224*357f1050SThomas Veerman 
1225*357f1050SThomas Veerman 		case OPT_NEVER_INTERACTIVE:
1226*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NEVER_INTERACTIVE", 0);
1227*357f1050SThomas Veerman 			break;
1228*357f1050SThomas Veerman 
1229*357f1050SThomas Veerman 		case OPT_ARRAY:
1230*357f1050SThomas Veerman 			yytext_is_array = true;
1231*357f1050SThomas Veerman 			break;
1232*357f1050SThomas Veerman 
1233*357f1050SThomas Veerman 		case OPT_POINTER:
1234*357f1050SThomas Veerman 			yytext_is_array = false;
1235*357f1050SThomas Veerman 			break;
1236*357f1050SThomas Veerman 
1237*357f1050SThomas Veerman 		case OPT_ECS:
1238*357f1050SThomas Veerman 			useecs = true;
1239*357f1050SThomas Veerman 			break;
1240*357f1050SThomas Veerman 
1241*357f1050SThomas Veerman 		case OPT_NO_ECS:
1242*357f1050SThomas Veerman 			useecs = false;
1243*357f1050SThomas Veerman 			break;
1244*357f1050SThomas Veerman 
1245*357f1050SThomas Veerman 		case OPT_HEADER_FILE:
1246*357f1050SThomas Veerman 			headerfilename = arg;
1247*357f1050SThomas Veerman 			break;
1248*357f1050SThomas Veerman 
1249*357f1050SThomas Veerman 		case OPT_META_ECS:
1250*357f1050SThomas Veerman 			usemecs = true;
1251*357f1050SThomas Veerman 			break;
1252*357f1050SThomas Veerman 
1253*357f1050SThomas Veerman 		case OPT_NO_META_ECS:
1254*357f1050SThomas Veerman 			usemecs = false;
1255*357f1050SThomas Veerman 			break;
1256*357f1050SThomas Veerman 
1257*357f1050SThomas Veerman 		case OPT_PREPROCDEFINE:
1258*357f1050SThomas Veerman 			{
1259*357f1050SThomas Veerman 				/* arg is "symbol" or "symbol=definition". */
1260*357f1050SThomas Veerman 				char   *def;
1261*357f1050SThomas Veerman 
1262*357f1050SThomas Veerman 				for (def = arg;
1263*357f1050SThomas Veerman 				     *def != '\0' && *def != '='; ++def) ;
1264*357f1050SThomas Veerman 
1265*357f1050SThomas Veerman 				buf_strappend (&userdef_buf, "#define ");
1266*357f1050SThomas Veerman 				if (*def == '\0') {
1267*357f1050SThomas Veerman 					buf_strappend (&userdef_buf, arg);
1268*357f1050SThomas Veerman 					buf_strappend (&userdef_buf,
1269*357f1050SThomas Veerman 						       " 1\n");
1270*357f1050SThomas Veerman 				}
1271*357f1050SThomas Veerman 				else {
1272*357f1050SThomas Veerman 					buf_strnappend (&userdef_buf, arg,
1273*357f1050SThomas Veerman 							def - arg);
1274*357f1050SThomas Veerman 					buf_strappend (&userdef_buf, " ");
1275*357f1050SThomas Veerman 					buf_strappend (&userdef_buf,
1276*357f1050SThomas Veerman 						       def + 1);
1277*357f1050SThomas Veerman 					buf_strappend (&userdef_buf, "\n");
1278*357f1050SThomas Veerman 				}
1279*357f1050SThomas Veerman 			}
1280*357f1050SThomas Veerman 			break;
1281*357f1050SThomas Veerman 
1282*357f1050SThomas Veerman 		case OPT_READ:
1283*357f1050SThomas Veerman 			use_read = true;
1284*357f1050SThomas Veerman 			break;
1285*357f1050SThomas Veerman 
1286*357f1050SThomas Veerman 		case OPT_STACK:
1287*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_STACK_USED", "1");
1288*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_STACK_USED",0);
1289*357f1050SThomas Veerman 			break;
1290*357f1050SThomas Veerman 
1291*357f1050SThomas Veerman 		case OPT_STDINIT:
1292*357f1050SThomas Veerman 			do_stdinit = true;
1293*357f1050SThomas Veerman 			break;
1294*357f1050SThomas Veerman 
1295*357f1050SThomas Veerman 		case OPT_NO_STDINIT:
1296*357f1050SThomas Veerman 			do_stdinit = false;
1297*357f1050SThomas Veerman 			break;
1298*357f1050SThomas Veerman 
1299*357f1050SThomas Veerman 		case OPT_YYCLASS:
1300*357f1050SThomas Veerman 			yyclass = arg;
1301*357f1050SThomas Veerman 			break;
1302*357f1050SThomas Veerman 
1303*357f1050SThomas Veerman 		case OPT_YYLINENO:
1304*357f1050SThomas Veerman 			do_yylineno = true;
1305*357f1050SThomas Veerman 			break;
1306*357f1050SThomas Veerman 
1307*357f1050SThomas Veerman 		case OPT_NO_YYLINENO:
1308*357f1050SThomas Veerman 			do_yylineno = false;
1309*357f1050SThomas Veerman 			break;
1310*357f1050SThomas Veerman 
1311*357f1050SThomas Veerman 		case OPT_YYWRAP:
1312*357f1050SThomas Veerman 			do_yywrap = true;
1313*357f1050SThomas Veerman 			break;
1314*357f1050SThomas Veerman 
1315*357f1050SThomas Veerman 		case OPT_NO_YYWRAP:
1316*357f1050SThomas Veerman 			do_yywrap = false;
1317*357f1050SThomas Veerman 			break;
1318*357f1050SThomas Veerman 
1319*357f1050SThomas Veerman 		case OPT_YYMORE:
1320*357f1050SThomas Veerman 			yymore_really_used = true;
1321*357f1050SThomas Veerman 			break;
1322*357f1050SThomas Veerman 
1323*357f1050SThomas Veerman 		case OPT_NO_YYMORE:
1324*357f1050SThomas Veerman 			yymore_really_used = false;
1325*357f1050SThomas Veerman 			break;
1326*357f1050SThomas Veerman 
1327*357f1050SThomas Veerman 		case OPT_REJECT:
1328*357f1050SThomas Veerman 			reject_really_used = true;
1329*357f1050SThomas Veerman 			break;
1330*357f1050SThomas Veerman 
1331*357f1050SThomas Veerman 		case OPT_NO_REJECT:
1332*357f1050SThomas Veerman 			reject_really_used = false;
1333*357f1050SThomas Veerman 			break;
1334*357f1050SThomas Veerman 
1335*357f1050SThomas Veerman         case OPT_NO_ANSI_FUNC_DEFS:
1336*357f1050SThomas Veerman             ansi_func_defs = false;
1337*357f1050SThomas Veerman             break;
1338*357f1050SThomas Veerman 
1339*357f1050SThomas Veerman         case OPT_NO_ANSI_FUNC_PROTOS:
1340*357f1050SThomas Veerman             ansi_func_protos = false;
1341*357f1050SThomas Veerman             break;
1342*357f1050SThomas Veerman 
1343*357f1050SThomas Veerman 		case OPT_NO_YY_PUSH_STATE:
1344*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_PUSH_STATE", "1");
1345*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_PUSH_STATE",0);
1346*357f1050SThomas Veerman 			break;
1347*357f1050SThomas Veerman 		case OPT_NO_YY_POP_STATE:
1348*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_POP_STATE", "1");
1349*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_POP_STATE",0);
1350*357f1050SThomas Veerman 			break;
1351*357f1050SThomas Veerman 		case OPT_NO_YY_TOP_STATE:
1352*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_TOP_STATE", "1");
1353*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_TOP_STATE",0);
1354*357f1050SThomas Veerman 			break;
1355*357f1050SThomas Veerman 		case OPT_NO_UNPUT:
1356*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_UNPUT", "1");
1357*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_UNPUT",0);
1358*357f1050SThomas Veerman 			break;
1359*357f1050SThomas Veerman 		case OPT_NO_YY_SCAN_BUFFER:
1360*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_SCAN_BUFFER", "1");
1361*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_SCAN_BUFFER",0);
1362*357f1050SThomas Veerman 			break;
1363*357f1050SThomas Veerman 		case OPT_NO_YY_SCAN_BYTES:
1364*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_SCAN_BYTES", "1");
1365*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_SCAN_BYTES",0);
1366*357f1050SThomas Veerman 			break;
1367*357f1050SThomas Veerman 		case OPT_NO_YY_SCAN_STRING:
1368*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_SCAN_STRING", "1");
1369*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_SCAN_STRING",0);
1370*357f1050SThomas Veerman 			break;
1371*357f1050SThomas Veerman 		case OPT_NO_YYGET_EXTRA:
1372*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_GET_EXTRA", "1");
1373*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_EXTRA",0);
1374*357f1050SThomas Veerman 			break;
1375*357f1050SThomas Veerman 		case OPT_NO_YYSET_EXTRA:
1376*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_SET_EXTRA", "1");
1377*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_EXTRA",0);
1378*357f1050SThomas Veerman 			break;
1379*357f1050SThomas Veerman 		case OPT_NO_YYGET_LENG:
1380*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_GET_LENG", "1");
1381*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_LENG",0);
1382*357f1050SThomas Veerman 			break;
1383*357f1050SThomas Veerman 		case OPT_NO_YYGET_TEXT:
1384*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_GET_TEXT", "1");
1385*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_TEXT",0);
1386*357f1050SThomas Veerman 			break;
1387*357f1050SThomas Veerman 		case OPT_NO_YYGET_LINENO:
1388*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_GET_LINENO", "1");
1389*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_LINENO",0);
1390*357f1050SThomas Veerman 			break;
1391*357f1050SThomas Veerman 		case OPT_NO_YYSET_LINENO:
1392*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_SET_LINENO", "1");
1393*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_LINENO",0);
1394*357f1050SThomas Veerman 			break;
1395*357f1050SThomas Veerman 		case OPT_NO_YYGET_IN:
1396*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_GET_IN", "1");
1397*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_IN",0);
1398*357f1050SThomas Veerman 			break;
1399*357f1050SThomas Veerman 		case OPT_NO_YYSET_IN:
1400*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_SET_IN", "1");
1401*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_IN",0);
1402*357f1050SThomas Veerman 			break;
1403*357f1050SThomas Veerman 		case OPT_NO_YYGET_OUT:
1404*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_GET_OUT", "1");
1405*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_OUT",0);
1406*357f1050SThomas Veerman 			break;
1407*357f1050SThomas Veerman 		case OPT_NO_YYSET_OUT:
1408*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_SET_OUT", "1");
1409*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_OUT",0);
1410*357f1050SThomas Veerman 			break;
1411*357f1050SThomas Veerman 		case OPT_NO_YYGET_LVAL:
1412*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_GET_LVAL", "1");
1413*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_LVAL",0);
1414*357f1050SThomas Veerman 			break;
1415*357f1050SThomas Veerman 		case OPT_NO_YYSET_LVAL:
1416*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_SET_LVAL", "1");
1417*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_LVAL",0);
1418*357f1050SThomas Veerman 			break;
1419*357f1050SThomas Veerman 		case OPT_NO_YYGET_LLOC:
1420*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_GET_LLOC", "1");
1421*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_GET_LLOC",0);
1422*357f1050SThomas Veerman 			break;
1423*357f1050SThomas Veerman 		case OPT_NO_YYSET_LLOC:
1424*357f1050SThomas Veerman 			//buf_strdefine (&userdef_buf, "YY_NO_SET_LLOC", "1");
1425*357f1050SThomas Veerman             buf_m4_define( &m4defs_buf, "M4_YY_NO_SET_LLOC",0);
1426*357f1050SThomas Veerman 			break;
1427*357f1050SThomas Veerman 
1428*357f1050SThomas Veerman 		}		/* switch */
1429*357f1050SThomas Veerman 	}			/* while scanopt() */
1430*357f1050SThomas Veerman 
1431*357f1050SThomas Veerman 	scanopt_destroy (sopt);
1432*357f1050SThomas Veerman 
1433*357f1050SThomas Veerman 	num_input_files = argc - optind;
1434*357f1050SThomas Veerman 	input_files = argv + optind;
1435*357f1050SThomas Veerman 	set_input_file (num_input_files > 0 ? input_files[0] : NULL);
1436*357f1050SThomas Veerman 
1437*357f1050SThomas Veerman 	lastccl = lastsc = lastdfa = lastnfa = 0;
1438*357f1050SThomas Veerman 	num_rules = num_eof_rules = default_rule = 0;
1439*357f1050SThomas Veerman 	numas = numsnpairs = tmpuses = 0;
1440*357f1050SThomas Veerman 	numecs = numeps = eps2 = num_reallocs = hshcol = dfaeql = totnst =
1441*357f1050SThomas Veerman 		0;
1442*357f1050SThomas Veerman 	numuniq = numdup = hshsave = eofseen = datapos = dataline = 0;
1443*357f1050SThomas Veerman 	num_backing_up = onesp = numprots = 0;
1444*357f1050SThomas Veerman 	variable_trailing_context_rules = bol_needed = false;
1445*357f1050SThomas Veerman 
1446*357f1050SThomas Veerman 	out_linenum = linenum = sectnum = 1;
1447*357f1050SThomas Veerman 	firstprot = NIL;
1448*357f1050SThomas Veerman 
1449*357f1050SThomas Veerman 	/* Used in mkprot() so that the first proto goes in slot 1
1450*357f1050SThomas Veerman 	 * of the proto queue.
1451*357f1050SThomas Veerman 	 */
1452*357f1050SThomas Veerman 	lastprot = 1;
1453*357f1050SThomas Veerman 
1454*357f1050SThomas Veerman 	set_up_initial_allocations ();
1455*357f1050SThomas Veerman }
1456*357f1050SThomas Veerman 
1457*357f1050SThomas Veerman 
1458*357f1050SThomas Veerman /* readin - read in the rules section of the input file(s) */
1459*357f1050SThomas Veerman 
1460*357f1050SThomas Veerman void readin ()
1461*357f1050SThomas Veerman {
1462*357f1050SThomas Veerman 	static char yy_stdinit[] = "FILE *yyin = stdin, *yyout = stdout;";
1463*357f1050SThomas Veerman 	static char yy_nostdinit[] =
1464*357f1050SThomas Veerman 		"FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;";
1465*357f1050SThomas Veerman 
1466*357f1050SThomas Veerman 	line_directive_out ((FILE *) 0, 1);
1467*357f1050SThomas Veerman 
1468*357f1050SThomas Veerman 	if (yyparse ()) {
1469*357f1050SThomas Veerman 		pinpoint_message (_("fatal parse error"));
1470*357f1050SThomas Veerman 		flexend (1);
1471*357f1050SThomas Veerman 	}
1472*357f1050SThomas Veerman 
1473*357f1050SThomas Veerman 	if (syntaxerror)
1474*357f1050SThomas Veerman 		flexend (1);
1475*357f1050SThomas Veerman 
1476*357f1050SThomas Veerman 	/* If the user explicitly requested posix compatibility by specifing the
1477*357f1050SThomas Veerman 	 * posix-compat option, then we check for conflicting options. However, if
1478*357f1050SThomas Veerman 	 * the POSIXLY_CORRECT variable is set, then we quietly make flex as
1479*357f1050SThomas Veerman 	 * posix-compatible as possible.  This is the recommended behavior
1480*357f1050SThomas Veerman 	 * according to the GNU Coding Standards.
1481*357f1050SThomas Veerman 	 *
1482*357f1050SThomas Veerman 	 * Note: The posix option was added to flex to provide the posix behavior
1483*357f1050SThomas Veerman 	 * of the repeat operator in regular expressions, e.g., `ab{3}'
1484*357f1050SThomas Veerman 	 */
1485*357f1050SThomas Veerman 	if (posix_compat) {
1486*357f1050SThomas Veerman 		/* TODO: This is where we try to make flex behave according to
1487*357f1050SThomas Veerman 		 * posiz, AND check for conflicting options. How far should we go
1488*357f1050SThomas Veerman 		 * with this? Should we disable all the neat-o flex features?
1489*357f1050SThomas Veerman 		 */
1490*357f1050SThomas Veerman 		/* Update: Estes says no, since other flex features don't violate posix. */
1491*357f1050SThomas Veerman 	}
1492*357f1050SThomas Veerman 
1493*357f1050SThomas Veerman 	if (getenv ("POSIXLY_CORRECT")) {
1494*357f1050SThomas Veerman 		posix_compat = true;
1495*357f1050SThomas Veerman 	}
1496*357f1050SThomas Veerman 
1497*357f1050SThomas Veerman 	if (backing_up_report) {
1498*357f1050SThomas Veerman 		backing_up_file = fopen (backing_name, "w");
1499*357f1050SThomas Veerman 		if (backing_up_file == NULL)
1500*357f1050SThomas Veerman 			lerrsf (_
1501*357f1050SThomas Veerman 				("could not create backing-up info file %s"),
1502*357f1050SThomas Veerman 				backing_name);
1503*357f1050SThomas Veerman 	}
1504*357f1050SThomas Veerman 
1505*357f1050SThomas Veerman 	else
1506*357f1050SThomas Veerman 		backing_up_file = NULL;
1507*357f1050SThomas Veerman 
1508*357f1050SThomas Veerman 	if (yymore_really_used == true)
1509*357f1050SThomas Veerman 		yymore_used = true;
1510*357f1050SThomas Veerman 	else if (yymore_really_used == false)
1511*357f1050SThomas Veerman 		yymore_used = false;
1512*357f1050SThomas Veerman 
1513*357f1050SThomas Veerman 	if (reject_really_used == true)
1514*357f1050SThomas Veerman 		reject = true;
1515*357f1050SThomas Veerman 	else if (reject_really_used == false)
1516*357f1050SThomas Veerman 		reject = false;
1517*357f1050SThomas Veerman 
1518*357f1050SThomas Veerman 	if (performance_report > 0) {
1519*357f1050SThomas Veerman 		if (lex_compat) {
1520*357f1050SThomas Veerman 			fprintf (stderr,
1521*357f1050SThomas Veerman 				 _
1522*357f1050SThomas Veerman 				 ("-l AT&T lex compatibility option entails a large performance penalty\n"));
1523*357f1050SThomas Veerman 			fprintf (stderr,
1524*357f1050SThomas Veerman 				 _
1525*357f1050SThomas Veerman 				 (" and may be the actual source of other reported performance penalties\n"));
1526*357f1050SThomas Veerman 		}
1527*357f1050SThomas Veerman 
1528*357f1050SThomas Veerman 		else if (do_yylineno) {
1529*357f1050SThomas Veerman 			fprintf (stderr,
1530*357f1050SThomas Veerman 				 _
1531*357f1050SThomas Veerman 				 ("%%option yylineno entails a performance penalty ONLY on rules that can match newline characters\n"));
1532*357f1050SThomas Veerman 		}
1533*357f1050SThomas Veerman 
1534*357f1050SThomas Veerman 		if (performance_report > 1) {
1535*357f1050SThomas Veerman 			if (interactive)
1536*357f1050SThomas Veerman 				fprintf (stderr,
1537*357f1050SThomas Veerman 					 _
1538*357f1050SThomas Veerman 					 ("-I (interactive) entails a minor performance penalty\n"));
1539*357f1050SThomas Veerman 
1540*357f1050SThomas Veerman 			if (yymore_used)
1541*357f1050SThomas Veerman 				fprintf (stderr,
1542*357f1050SThomas Veerman 					 _
1543*357f1050SThomas Veerman 					 ("yymore() entails a minor performance penalty\n"));
1544*357f1050SThomas Veerman 		}
1545*357f1050SThomas Veerman 
1546*357f1050SThomas Veerman 		if (reject)
1547*357f1050SThomas Veerman 			fprintf (stderr,
1548*357f1050SThomas Veerman 				 _
1549*357f1050SThomas Veerman 				 ("REJECT entails a large performance penalty\n"));
1550*357f1050SThomas Veerman 
1551*357f1050SThomas Veerman 		if (variable_trailing_context_rules)
1552*357f1050SThomas Veerman 			fprintf (stderr,
1553*357f1050SThomas Veerman 				 _
1554*357f1050SThomas Veerman 				 ("Variable trailing context rules entail a large performance penalty\n"));
1555*357f1050SThomas Veerman 	}
1556*357f1050SThomas Veerman 
1557*357f1050SThomas Veerman 	if (reject)
1558*357f1050SThomas Veerman 		real_reject = true;
1559*357f1050SThomas Veerman 
1560*357f1050SThomas Veerman 	if (variable_trailing_context_rules)
1561*357f1050SThomas Veerman 		reject = true;
1562*357f1050SThomas Veerman 
1563*357f1050SThomas Veerman 	if ((fulltbl || fullspd) && reject) {
1564*357f1050SThomas Veerman 		if (real_reject)
1565*357f1050SThomas Veerman 			flexerror (_
1566*357f1050SThomas Veerman 				   ("REJECT cannot be used with -f or -F"));
1567*357f1050SThomas Veerman 		else if (do_yylineno)
1568*357f1050SThomas Veerman 			flexerror (_
1569*357f1050SThomas Veerman 				   ("%option yylineno cannot be used with REJECT"));
1570*357f1050SThomas Veerman 		else
1571*357f1050SThomas Veerman 			flexerror (_
1572*357f1050SThomas Veerman 				   ("variable trailing context rules cannot be used with -f or -F"));
1573*357f1050SThomas Veerman 	}
1574*357f1050SThomas Veerman 
1575*357f1050SThomas Veerman 	if (reject){
1576*357f1050SThomas Veerman         out_m4_define( "M4_YY_USES_REJECT", NULL);
1577*357f1050SThomas Veerman 		//outn ("\n#define YY_USES_REJECT");
1578*357f1050SThomas Veerman     }
1579*357f1050SThomas Veerman 
1580*357f1050SThomas Veerman 	if (!do_yywrap) {
1581*357f1050SThomas Veerman 		if (!C_plus_plus) {
1582*357f1050SThomas Veerman 			outn ("\n#define yywrap(n) (/*CONSTCOND*/1)");
1583*357f1050SThomas Veerman 		}
1584*357f1050SThomas Veerman 		outn ("#define YY_SKIP_YYWRAP");
1585*357f1050SThomas Veerman 	}
1586*357f1050SThomas Veerman 
1587*357f1050SThomas Veerman 	if (ddebug)
1588*357f1050SThomas Veerman 		outn ("\n#define FLEX_DEBUG");
1589*357f1050SThomas Veerman 
1590*357f1050SThomas Veerman 	OUT_BEGIN_CODE ();
1591*357f1050SThomas Veerman 	if (csize == 256)
1592*357f1050SThomas Veerman 		outn ("typedef unsigned char YY_CHAR;");
1593*357f1050SThomas Veerman 	else
1594*357f1050SThomas Veerman 		outn ("typedef char YY_CHAR;");
1595*357f1050SThomas Veerman 	OUT_END_CODE ();
1596*357f1050SThomas Veerman 
1597*357f1050SThomas Veerman 	if (C_plus_plus) {
1598*357f1050SThomas Veerman 		outn ("#define yytext_ptr yytext");
1599*357f1050SThomas Veerman 
1600*357f1050SThomas Veerman 		if (interactive)
1601*357f1050SThomas Veerman 			outn ("#define YY_INTERACTIVE");
1602*357f1050SThomas Veerman 	}
1603*357f1050SThomas Veerman 
1604*357f1050SThomas Veerman 	else {
1605*357f1050SThomas Veerman 		OUT_BEGIN_CODE ();
1606*357f1050SThomas Veerman 		/* In reentrant scanner, stdinit is handled in flex.skl. */
1607*357f1050SThomas Veerman 		if (do_stdinit) {
1608*357f1050SThomas Veerman 			if (reentrant){
1609*357f1050SThomas Veerman                 outn ("#ifdef VMS");
1610*357f1050SThomas Veerman                 outn ("#ifdef __VMS_POSIX");
1611*357f1050SThomas Veerman                 outn ("#define YY_STDINIT");
1612*357f1050SThomas Veerman                 outn ("#endif");
1613*357f1050SThomas Veerman                 outn ("#else");
1614*357f1050SThomas Veerman                 outn ("#define YY_STDINIT");
1615*357f1050SThomas Veerman                 outn ("#endif");
1616*357f1050SThomas Veerman             }
1617*357f1050SThomas Veerman 
1618*357f1050SThomas Veerman 			outn ("#ifdef VMS");
1619*357f1050SThomas Veerman 			outn ("#ifndef __VMS_POSIX");
1620*357f1050SThomas Veerman 			outn (yy_nostdinit);
1621*357f1050SThomas Veerman 			outn ("#else");
1622*357f1050SThomas Veerman 			outn (yy_stdinit);
1623*357f1050SThomas Veerman 			outn ("#endif");
1624*357f1050SThomas Veerman 			outn ("#else");
1625*357f1050SThomas Veerman 			outn (yy_stdinit);
1626*357f1050SThomas Veerman 			outn ("#endif");
1627*357f1050SThomas Veerman 		}
1628*357f1050SThomas Veerman 
1629*357f1050SThomas Veerman 		else {
1630*357f1050SThomas Veerman 			if(!reentrant)
1631*357f1050SThomas Veerman                 outn (yy_nostdinit);
1632*357f1050SThomas Veerman 		}
1633*357f1050SThomas Veerman 		OUT_END_CODE ();
1634*357f1050SThomas Veerman 	}
1635*357f1050SThomas Veerman 
1636*357f1050SThomas Veerman 	OUT_BEGIN_CODE ();
1637*357f1050SThomas Veerman 	if (fullspd)
1638*357f1050SThomas Veerman 		outn ("typedef yyconst struct yy_trans_info *yy_state_type;");
1639*357f1050SThomas Veerman 	else if (!C_plus_plus)
1640*357f1050SThomas Veerman 		outn ("typedef int yy_state_type;");
1641*357f1050SThomas Veerman 	OUT_END_CODE ();
1642*357f1050SThomas Veerman 
1643*357f1050SThomas Veerman 	if (lex_compat)
1644*357f1050SThomas Veerman 		outn ("#define YY_FLEX_LEX_COMPAT");
1645*357f1050SThomas Veerman 
1646*357f1050SThomas Veerman 	if (!C_plus_plus && !reentrant) {
1647*357f1050SThomas Veerman 		outn ("extern int yylineno;");
1648*357f1050SThomas Veerman 		OUT_BEGIN_CODE ();
1649*357f1050SThomas Veerman 		outn ("int yylineno = 1;");
1650*357f1050SThomas Veerman 		OUT_END_CODE ();
1651*357f1050SThomas Veerman 	}
1652*357f1050SThomas Veerman 
1653*357f1050SThomas Veerman 	if (C_plus_plus) {
1654*357f1050SThomas Veerman 		outn ("\n#include <FlexLexer.h>");
1655*357f1050SThomas Veerman 
1656*357f1050SThomas Veerman  		if (!do_yywrap) {
1657*357f1050SThomas Veerman 			outn("\nint yyFlexLexer::yywrap() { return 1; }");
1658*357f1050SThomas Veerman 		}
1659*357f1050SThomas Veerman 
1660*357f1050SThomas Veerman 		if (yyclass) {
1661*357f1050SThomas Veerman 			outn ("int yyFlexLexer::yylex()");
1662*357f1050SThomas Veerman 			outn ("\t{");
1663*357f1050SThomas Veerman 			outn ("\tLexerError( \"yyFlexLexer::yylex invoked but %option yyclass used\" );");
1664*357f1050SThomas Veerman 			outn ("\treturn 0;");
1665*357f1050SThomas Veerman 			outn ("\t}");
1666*357f1050SThomas Veerman 
1667*357f1050SThomas Veerman 			out_str ("\n#define YY_DECL int %s::yylex()\n",
1668*357f1050SThomas Veerman 				 yyclass);
1669*357f1050SThomas Veerman 		}
1670*357f1050SThomas Veerman 	}
1671*357f1050SThomas Veerman 
1672*357f1050SThomas Veerman 	else {
1673*357f1050SThomas Veerman 
1674*357f1050SThomas Veerman 		/* Watch out: yytext_ptr is a variable when yytext is an array,
1675*357f1050SThomas Veerman 		 * but it's a macro when yytext is a pointer.
1676*357f1050SThomas Veerman 		 */
1677*357f1050SThomas Veerman 		if (yytext_is_array) {
1678*357f1050SThomas Veerman 			if (!reentrant)
1679*357f1050SThomas Veerman 				outn ("extern char yytext[];\n");
1680*357f1050SThomas Veerman 		}
1681*357f1050SThomas Veerman 		else {
1682*357f1050SThomas Veerman 			if (reentrant) {
1683*357f1050SThomas Veerman 				outn ("#define yytext_ptr yytext_r");
1684*357f1050SThomas Veerman 			}
1685*357f1050SThomas Veerman 			else {
1686*357f1050SThomas Veerman 				outn ("extern char *yytext;");
1687*357f1050SThomas Veerman 				outn ("#define yytext_ptr yytext");
1688*357f1050SThomas Veerman 			}
1689*357f1050SThomas Veerman 		}
1690*357f1050SThomas Veerman 
1691*357f1050SThomas Veerman 		if (yyclass)
1692*357f1050SThomas Veerman 			flexerror (_
1693*357f1050SThomas Veerman 				   ("%option yyclass only meaningful for C++ scanners"));
1694*357f1050SThomas Veerman 	}
1695*357f1050SThomas Veerman 
1696*357f1050SThomas Veerman 	if (useecs)
1697*357f1050SThomas Veerman 		numecs = cre8ecs (nextecm, ecgroup, csize);
1698*357f1050SThomas Veerman 	else
1699*357f1050SThomas Veerman 		numecs = csize;
1700*357f1050SThomas Veerman 
1701*357f1050SThomas Veerman 	/* Now map the equivalence class for NUL to its expected place. */
1702*357f1050SThomas Veerman 	ecgroup[0] = ecgroup[csize];
1703*357f1050SThomas Veerman 	NUL_ec = ABS (ecgroup[0]);
1704*357f1050SThomas Veerman 
1705*357f1050SThomas Veerman 	if (useecs)
1706*357f1050SThomas Veerman 		ccl2ecl ();
1707*357f1050SThomas Veerman }
1708*357f1050SThomas Veerman 
1709*357f1050SThomas Veerman 
1710*357f1050SThomas Veerman /* set_up_initial_allocations - allocate memory for internal tables */
1711*357f1050SThomas Veerman 
1712*357f1050SThomas Veerman void set_up_initial_allocations ()
1713*357f1050SThomas Veerman {
1714*357f1050SThomas Veerman 	maximum_mns = (long_align ? MAXIMUM_MNS_LONG : MAXIMUM_MNS);
1715*357f1050SThomas Veerman 	current_mns = INITIAL_MNS;
1716*357f1050SThomas Veerman 	firstst = allocate_integer_array (current_mns);
1717*357f1050SThomas Veerman 	lastst = allocate_integer_array (current_mns);
1718*357f1050SThomas Veerman 	finalst = allocate_integer_array (current_mns);
1719*357f1050SThomas Veerman 	transchar = allocate_integer_array (current_mns);
1720*357f1050SThomas Veerman 	trans1 = allocate_integer_array (current_mns);
1721*357f1050SThomas Veerman 	trans2 = allocate_integer_array (current_mns);
1722*357f1050SThomas Veerman 	accptnum = allocate_integer_array (current_mns);
1723*357f1050SThomas Veerman 	assoc_rule = allocate_integer_array (current_mns);
1724*357f1050SThomas Veerman 	state_type = allocate_integer_array (current_mns);
1725*357f1050SThomas Veerman 
1726*357f1050SThomas Veerman 	current_max_rules = INITIAL_MAX_RULES;
1727*357f1050SThomas Veerman 	rule_type = allocate_integer_array (current_max_rules);
1728*357f1050SThomas Veerman 	rule_linenum = allocate_integer_array (current_max_rules);
1729*357f1050SThomas Veerman 	rule_useful = allocate_integer_array (current_max_rules);
1730*357f1050SThomas Veerman 	rule_has_nl = allocate_bool_array (current_max_rules);
1731*357f1050SThomas Veerman 
1732*357f1050SThomas Veerman 	current_max_scs = INITIAL_MAX_SCS;
1733*357f1050SThomas Veerman 	scset = allocate_integer_array (current_max_scs);
1734*357f1050SThomas Veerman 	scbol = allocate_integer_array (current_max_scs);
1735*357f1050SThomas Veerman 	scxclu = allocate_integer_array (current_max_scs);
1736*357f1050SThomas Veerman 	sceof = allocate_integer_array (current_max_scs);
1737*357f1050SThomas Veerman 	scname = allocate_char_ptr_array (current_max_scs);
1738*357f1050SThomas Veerman 
1739*357f1050SThomas Veerman 	current_maxccls = INITIAL_MAX_CCLS;
1740*357f1050SThomas Veerman 	cclmap = allocate_integer_array (current_maxccls);
1741*357f1050SThomas Veerman 	ccllen = allocate_integer_array (current_maxccls);
1742*357f1050SThomas Veerman 	cclng = allocate_integer_array (current_maxccls);
1743*357f1050SThomas Veerman 	ccl_has_nl = allocate_bool_array (current_maxccls);
1744*357f1050SThomas Veerman 
1745*357f1050SThomas Veerman 	current_max_ccl_tbl_size = INITIAL_MAX_CCL_TBL_SIZE;
1746*357f1050SThomas Veerman 	ccltbl = allocate_Character_array (current_max_ccl_tbl_size);
1747*357f1050SThomas Veerman 
1748*357f1050SThomas Veerman 	current_max_dfa_size = INITIAL_MAX_DFA_SIZE;
1749*357f1050SThomas Veerman 
1750*357f1050SThomas Veerman 	current_max_xpairs = INITIAL_MAX_XPAIRS;
1751*357f1050SThomas Veerman 	nxt = allocate_integer_array (current_max_xpairs);
1752*357f1050SThomas Veerman 	chk = allocate_integer_array (current_max_xpairs);
1753*357f1050SThomas Veerman 
1754*357f1050SThomas Veerman 	current_max_template_xpairs = INITIAL_MAX_TEMPLATE_XPAIRS;
1755*357f1050SThomas Veerman 	tnxt = allocate_integer_array (current_max_template_xpairs);
1756*357f1050SThomas Veerman 
1757*357f1050SThomas Veerman 	current_max_dfas = INITIAL_MAX_DFAS;
1758*357f1050SThomas Veerman 	base = allocate_integer_array (current_max_dfas);
1759*357f1050SThomas Veerman 	def = allocate_integer_array (current_max_dfas);
1760*357f1050SThomas Veerman 	dfasiz = allocate_integer_array (current_max_dfas);
1761*357f1050SThomas Veerman 	accsiz = allocate_integer_array (current_max_dfas);
1762*357f1050SThomas Veerman 	dhash = allocate_integer_array (current_max_dfas);
1763*357f1050SThomas Veerman 	dss = allocate_int_ptr_array (current_max_dfas);
1764*357f1050SThomas Veerman 	dfaacc = allocate_dfaacc_union (current_max_dfas);
1765*357f1050SThomas Veerman 
1766*357f1050SThomas Veerman 	nultrans = (int *) 0;
1767*357f1050SThomas Veerman }
1768*357f1050SThomas Veerman 
1769*357f1050SThomas Veerman 
1770*357f1050SThomas Veerman /* extracts basename from path, optionally stripping the extension "\.*"
1771*357f1050SThomas Veerman  * (same concept as /bin/sh `basename`, but different handling of extension). */
1772*357f1050SThomas Veerman static char *basename2 (path, strip_ext)
1773*357f1050SThomas Veerman      char   *path;
1774*357f1050SThomas Veerman      int strip_ext;		/* boolean */
1775*357f1050SThomas Veerman {
1776*357f1050SThomas Veerman 	char   *b, *e = 0;
1777*357f1050SThomas Veerman 
1778*357f1050SThomas Veerman 	b = path;
1779*357f1050SThomas Veerman 	for (b = path; *path; path++)
1780*357f1050SThomas Veerman 		if (*path == '/')
1781*357f1050SThomas Veerman 			b = path + 1;
1782*357f1050SThomas Veerman 		else if (*path == '.')
1783*357f1050SThomas Veerman 			e = path;
1784*357f1050SThomas Veerman 
1785*357f1050SThomas Veerman 	if (strip_ext && e && e > b)
1786*357f1050SThomas Veerman 		*e = '\0';
1787*357f1050SThomas Veerman 	return b;
1788*357f1050SThomas Veerman }
1789*357f1050SThomas Veerman 
1790*357f1050SThomas Veerman void usage ()
1791*357f1050SThomas Veerman {
1792*357f1050SThomas Veerman 	FILE   *f = stdout;
1793*357f1050SThomas Veerman 
1794*357f1050SThomas Veerman 	if (!did_outfilename) {
1795*357f1050SThomas Veerman 		snprintf (outfile_path, sizeof(outfile_path), outfile_template,
1796*357f1050SThomas Veerman 			 prefix, C_plus_plus ? "cc" : "c");
1797*357f1050SThomas Veerman 		outfilename = outfile_path;
1798*357f1050SThomas Veerman 	}
1799*357f1050SThomas Veerman 
1800*357f1050SThomas Veerman 	fprintf (f, _("Usage: %s [OPTIONS] [FILE]...\n"), program_name);
1801*357f1050SThomas Veerman 	fprintf (f,
1802*357f1050SThomas Veerman 		 _
1803*357f1050SThomas Veerman 		 ("Generates programs that perform pattern-matching on text.\n"
1804*357f1050SThomas Veerman 		  "\n" "Table Compression:\n"
1805*357f1050SThomas Veerman 		  "  -Ca, --align      trade off larger tables for better memory alignment\n"
1806*357f1050SThomas Veerman 		  "  -Ce, --ecs        construct equivalence classes\n"
1807*357f1050SThomas Veerman 		  "  -Cf               do not compress tables; use -f representation\n"
1808*357f1050SThomas Veerman 		  "  -CF               do not compress tables; use -F representation\n"
1809*357f1050SThomas Veerman 		  "  -Cm, --meta-ecs   construct meta-equivalence classes\n"
1810*357f1050SThomas Veerman 		  "  -Cr, --read       use read() instead of stdio for scanner input\n"
1811*357f1050SThomas Veerman 		  "  -f, --full        generate fast, large scanner. Same as -Cfr\n"
1812*357f1050SThomas Veerman 		  "  -F, --fast        use alternate table representation. Same as -CFr\n"
1813*357f1050SThomas Veerman 		  "  -Cem              default compression (same as --ecs --meta-ecs)\n"
1814*357f1050SThomas Veerman 		  "\n" "Debugging:\n"
1815*357f1050SThomas Veerman 		  "  -d, --debug             enable debug mode in scanner\n"
1816*357f1050SThomas Veerman 		  "  -b, --backup            write backing-up information to %s\n"
1817*357f1050SThomas Veerman 		  "  -p, --perf-report       write performance report to stderr\n"
1818*357f1050SThomas Veerman 		  "  -s, --nodefault         suppress default rule to ECHO unmatched text\n"
1819*357f1050SThomas Veerman 		  "  -T, --trace             %s should run in trace mode\n"
1820*357f1050SThomas Veerman 		  "  -w, --nowarn            do not generate warnings\n"
1821*357f1050SThomas Veerman 		  "  -v, --verbose           write summary of scanner statistics to stdout\n"
1822*357f1050SThomas Veerman 		  "\n" "Files:\n"
1823*357f1050SThomas Veerman 		  "  -o, --outfile=FILE      specify output filename\n"
1824*357f1050SThomas Veerman 		  "  -S, --skel=FILE         specify skeleton file\n"
1825*357f1050SThomas Veerman 		  "  -t, --stdout            write scanner on stdout instead of %s\n"
1826*357f1050SThomas Veerman 		  "      --yyclass=NAME      name of C++ class\n"
1827*357f1050SThomas Veerman 		  "      --header-file=FILE   create a C header file in addition to the scanner\n"
1828*357f1050SThomas Veerman 		  "      --tables-file[=FILE] write tables to FILE\n" "\n"
1829*357f1050SThomas Veerman 		  "Scanner behavior:\n"
1830*357f1050SThomas Veerman 		  "  -7, --7bit              generate 7-bit scanner\n"
1831*357f1050SThomas Veerman 		  "  -8, --8bit              generate 8-bit scanner\n"
1832*357f1050SThomas Veerman 		  "  -B, --batch             generate batch scanner (opposite of -I)\n"
1833*357f1050SThomas Veerman 		  "  -i, --case-insensitive  ignore case in patterns\n"
1834*357f1050SThomas Veerman 		  "  -l, --lex-compat        maximal compatibility with original lex\n"
1835*357f1050SThomas Veerman 		  "  -X, --posix-compat      maximal compatibility with POSIX lex\n"
1836*357f1050SThomas Veerman 		  "  -I, --interactive       generate interactive scanner (opposite of -B)\n"
1837*357f1050SThomas Veerman 		  "      --yylineno          track line count in yylineno\n"
1838*357f1050SThomas Veerman 		  "\n" "Generated code:\n"
1839*357f1050SThomas Veerman 		  "  -+,  --c++               generate C++ scanner class\n"
1840*357f1050SThomas Veerman 		  "  -Dmacro[=defn]           #define macro defn  (default defn is '1')\n"
1841*357f1050SThomas Veerman 		  "  -L,  --noline            suppress #line directives in scanner\n"
1842*357f1050SThomas Veerman 		  "  -P,  --prefix=STRING     use STRING as prefix instead of \"yy\"\n"
1843*357f1050SThomas Veerman 		  "  -R,  --reentrant         generate a reentrant C scanner\n"
1844*357f1050SThomas Veerman 		  "       --bison-bridge      scanner for bison pure parser.\n"
1845*357f1050SThomas Veerman 		  "       --bison-locations   include yylloc support.\n"
1846*357f1050SThomas Veerman 		  "       --stdinit           initialize yyin/yyout to stdin/stdout\n"
1847*357f1050SThomas Veerman           "       --noansi-definitions old-style function definitions\n"
1848*357f1050SThomas Veerman           "       --noansi-prototypes  empty parameter list in prototypes\n"
1849*357f1050SThomas Veerman 		  "       --nounistd          do not include <unistd.h>\n"
1850*357f1050SThomas Veerman 		  "       --noFUNCTION        do not generate a particular FUNCTION\n"
1851*357f1050SThomas Veerman 		  "\n" "Miscellaneous:\n"
1852*357f1050SThomas Veerman 		  "  -c                      do-nothing POSIX option\n"
1853*357f1050SThomas Veerman 		  "  -n                      do-nothing POSIX option\n"
1854*357f1050SThomas Veerman 		  "  -?\n"
1855*357f1050SThomas Veerman 		  "  -h, --help              produce this help message\n"
1856*357f1050SThomas Veerman 		  "  -V, --version           report %s version\n"),
1857*357f1050SThomas Veerman 		 backing_name, program_name, outfile_path, program_name);
1858*357f1050SThomas Veerman 
1859*357f1050SThomas Veerman }
1860