xref: /dflybsd-src/contrib/flex/src/misc.c (revision 388e4ddaf1c230f115961bdb4bad6a8d3e017c93)
1*d9805213SSascha Wildner /* misc - miscellaneous flex routines */
2*d9805213SSascha Wildner 
3*d9805213SSascha Wildner /*  Copyright (c) 1990 The Regents of the University of California. */
4*d9805213SSascha Wildner /*  All rights reserved. */
5*d9805213SSascha Wildner 
6*d9805213SSascha Wildner /*  This code is derived from software contributed to Berkeley by */
7*d9805213SSascha Wildner /*  Vern Paxson. */
8*d9805213SSascha Wildner 
9*d9805213SSascha Wildner /*  The United States Government has rights in this work pursuant */
10*d9805213SSascha Wildner /*  to contract no. DE-AC03-76SF00098 between the United States */
11*d9805213SSascha Wildner /*  Department of Energy and the University of California. */
12*d9805213SSascha Wildner 
13*d9805213SSascha Wildner /*  This file is part of flex. */
14*d9805213SSascha Wildner 
15*d9805213SSascha Wildner /*  Redistribution and use in source and binary forms, with or without */
16*d9805213SSascha Wildner /*  modification, are permitted provided that the following conditions */
17*d9805213SSascha Wildner /*  are met: */
18*d9805213SSascha Wildner 
19*d9805213SSascha Wildner /*  1. Redistributions of source code must retain the above copyright */
20*d9805213SSascha Wildner /*     notice, this list of conditions and the following disclaimer. */
21*d9805213SSascha Wildner /*  2. Redistributions in binary form must reproduce the above copyright */
22*d9805213SSascha Wildner /*     notice, this list of conditions and the following disclaimer in the */
23*d9805213SSascha Wildner /*     documentation and/or other materials provided with the distribution. */
24*d9805213SSascha Wildner 
25*d9805213SSascha Wildner /*  Neither the name of the University nor the names of its contributors */
26*d9805213SSascha Wildner /*  may be used to endorse or promote products derived from this software */
27*d9805213SSascha Wildner /*  without specific prior written permission. */
28*d9805213SSascha Wildner 
29*d9805213SSascha Wildner /*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */
30*d9805213SSascha Wildner /*  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
31*d9805213SSascha Wildner /*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */
32*d9805213SSascha Wildner /*  PURPOSE. */
33*d9805213SSascha Wildner #include "flexdef.h"
34*d9805213SSascha Wildner #include "tables.h"
35*d9805213SSascha Wildner 
36*d9805213SSascha Wildner #define CMD_IF_TABLES_SER    "%if-tables-serialization"
37*d9805213SSascha Wildner #define CMD_TABLES_YYDMAP    "%tables-yydmap"
38*d9805213SSascha Wildner #define CMD_DEFINE_YYTABLES  "%define-yytables"
39*d9805213SSascha Wildner #define CMD_IF_CPP_ONLY      "%if-c++-only"
40*d9805213SSascha Wildner #define CMD_IF_C_ONLY        "%if-c-only"
41*d9805213SSascha Wildner #define CMD_IF_C_OR_CPP      "%if-c-or-c++"
42*d9805213SSascha Wildner #define CMD_NOT_FOR_HEADER   "%not-for-header"
43*d9805213SSascha Wildner #define CMD_OK_FOR_HEADER    "%ok-for-header"
44*d9805213SSascha Wildner #define CMD_PUSH             "%push"
45*d9805213SSascha Wildner #define CMD_POP              "%pop"
46*d9805213SSascha Wildner #define CMD_IF_REENTRANT     "%if-reentrant"
47*d9805213SSascha Wildner #define CMD_IF_NOT_REENTRANT "%if-not-reentrant"
48*d9805213SSascha Wildner #define CMD_IF_BISON_BRIDGE  "%if-bison-bridge"
49*d9805213SSascha Wildner #define CMD_IF_NOT_BISON_BRIDGE  "%if-not-bison-bridge"
50*d9805213SSascha Wildner #define CMD_ENDIF            "%endif"
51*d9805213SSascha Wildner 
52*d9805213SSascha Wildner /* we allow the skeleton to push and pop. */
53*d9805213SSascha Wildner struct sko_state {
54*d9805213SSascha Wildner     bool dc; /**< do_copy */
55*d9805213SSascha Wildner };
56*d9805213SSascha Wildner static struct sko_state *sko_stack=0;
57*d9805213SSascha Wildner static int sko_len=0,sko_sz=0;
sko_push(bool dc)58*d9805213SSascha Wildner static void sko_push(bool dc)
59*d9805213SSascha Wildner {
60*d9805213SSascha Wildner     if(!sko_stack){
61*d9805213SSascha Wildner         sko_sz = 1;
62*d9805213SSascha Wildner         sko_stack = malloc(sizeof(struct sko_state) * (size_t) sko_sz);
63*d9805213SSascha Wildner         if (!sko_stack)
64*d9805213SSascha Wildner             flexfatal(_("allocation of sko_stack failed"));
65*d9805213SSascha Wildner         sko_len = 0;
66*d9805213SSascha Wildner     }
67*d9805213SSascha Wildner     if(sko_len >= sko_sz){
68*d9805213SSascha Wildner         sko_sz *= 2;
69*d9805213SSascha Wildner         sko_stack = realloc(sko_stack,
70*d9805213SSascha Wildner 			sizeof(struct sko_state) * (size_t) sko_sz);
71*d9805213SSascha Wildner     }
72*d9805213SSascha Wildner 
73*d9805213SSascha Wildner     /* initialize to zero and push */
74*d9805213SSascha Wildner     sko_stack[sko_len].dc = dc;
75*d9805213SSascha Wildner     sko_len++;
76*d9805213SSascha Wildner }
sko_peek(bool * dc)77*d9805213SSascha Wildner static void sko_peek(bool *dc)
78*d9805213SSascha Wildner {
79*d9805213SSascha Wildner     if(sko_len <= 0)
80*d9805213SSascha Wildner         flex_die("peek attempt when sko stack is empty");
81*d9805213SSascha Wildner     if(dc)
82*d9805213SSascha Wildner         *dc = sko_stack[sko_len-1].dc;
83*d9805213SSascha Wildner }
sko_pop(bool * dc)84*d9805213SSascha Wildner static void sko_pop(bool* dc)
85*d9805213SSascha Wildner {
86*d9805213SSascha Wildner     sko_peek(dc);
87*d9805213SSascha Wildner     sko_len--;
88*d9805213SSascha Wildner     if(sko_len < 0)
89*d9805213SSascha Wildner         flex_die("popped too many times in skeleton.");
90*d9805213SSascha Wildner }
91*d9805213SSascha Wildner 
92*d9805213SSascha Wildner /* Append "#define defname value\n" to the running buffer. */
action_define(const char * defname,int value)93*d9805213SSascha Wildner void action_define (const char *defname, int value)
94*d9805213SSascha Wildner {
95*d9805213SSascha Wildner 	char    buf[MAXLINE];
96*d9805213SSascha Wildner 	char   *cpy;
97*d9805213SSascha Wildner 
98*d9805213SSascha Wildner 	if ((int) strlen (defname) > MAXLINE / 2) {
99*d9805213SSascha Wildner 		format_pinpoint_message (_
100*d9805213SSascha Wildner 					 ("name \"%s\" ridiculously long"),
101*d9805213SSascha Wildner 					 defname);
102*d9805213SSascha Wildner 		return;
103*d9805213SSascha Wildner 	}
104*d9805213SSascha Wildner 
105*d9805213SSascha Wildner 	snprintf (buf, sizeof(buf), "#define %s %d\n", defname, value);
106*d9805213SSascha Wildner 	add_action (buf);
107*d9805213SSascha Wildner 
108*d9805213SSascha Wildner 	/* track #defines so we can undef them when we're done. */
109*d9805213SSascha Wildner 	cpy = xstrdup(defname);
110*d9805213SSascha Wildner 	buf_append (&defs_buf, &cpy, 1);
111*d9805213SSascha Wildner }
112*d9805213SSascha Wildner 
113*d9805213SSascha Wildner /* Append "new_text" to the running buffer. */
add_action(const char * new_text)114*d9805213SSascha Wildner void add_action (const char *new_text)
115*d9805213SSascha Wildner {
116*d9805213SSascha Wildner 	int     len = (int) strlen (new_text);
117*d9805213SSascha Wildner 
118*d9805213SSascha Wildner 	while (len + action_index >= action_size - 10 /* slop */ ) {
119*d9805213SSascha Wildner 		int     new_size = action_size * 2;
120*d9805213SSascha Wildner 
121*d9805213SSascha Wildner 		if (new_size <= 0)
122*d9805213SSascha Wildner 			/* Increase just a little, to try to avoid overflow
123*d9805213SSascha Wildner 			 * on 16-bit machines.
124*d9805213SSascha Wildner 			 */
125*d9805213SSascha Wildner 			action_size += action_size / 8;
126*d9805213SSascha Wildner 		else
127*d9805213SSascha Wildner 			action_size = new_size;
128*d9805213SSascha Wildner 
129*d9805213SSascha Wildner 		action_array =
130*d9805213SSascha Wildner 			reallocate_character_array (action_array,
131*d9805213SSascha Wildner 						    action_size);
132*d9805213SSascha Wildner 	}
133*d9805213SSascha Wildner 
134*d9805213SSascha Wildner 	strcpy (&action_array[action_index], new_text);
135*d9805213SSascha Wildner 
136*d9805213SSascha Wildner 	action_index += len;
137*d9805213SSascha Wildner }
138*d9805213SSascha Wildner 
139*d9805213SSascha Wildner 
140*d9805213SSascha Wildner /* allocate_array - allocate memory for an integer array of the given size */
141*d9805213SSascha Wildner 
allocate_array(int size,size_t element_size)142*d9805213SSascha Wildner void   *allocate_array (int size, size_t element_size)
143*d9805213SSascha Wildner {
144*d9805213SSascha Wildner 	void *mem;
145*d9805213SSascha Wildner #if HAVE_REALLOCARRAY
146*d9805213SSascha Wildner 	/* reallocarray has built-in overflow detection */
147*d9805213SSascha Wildner 	mem = reallocarray(NULL, (size_t) size, element_size);
148*d9805213SSascha Wildner #else
149*d9805213SSascha Wildner 	size_t num_bytes = (size_t) size * element_size;
150*d9805213SSascha Wildner 	mem = (size && SIZE_MAX / (size_t) size < element_size) ? NULL :
151*d9805213SSascha Wildner 		malloc(num_bytes);
152*d9805213SSascha Wildner #endif
153*d9805213SSascha Wildner 	if (!mem)
154*d9805213SSascha Wildner 		flexfatal (_
155*d9805213SSascha Wildner 			   ("memory allocation failed in allocate_array()"));
156*d9805213SSascha Wildner 
157*d9805213SSascha Wildner 	return mem;
158*d9805213SSascha Wildner }
159*d9805213SSascha Wildner 
160*d9805213SSascha Wildner 
161*d9805213SSascha Wildner /* all_lower - true if a string is all lower-case */
162*d9805213SSascha Wildner 
all_lower(char * str)163*d9805213SSascha Wildner int all_lower (char *str)
164*d9805213SSascha Wildner {
165*d9805213SSascha Wildner 	while (*str) {
166*d9805213SSascha Wildner 		if (!isascii ((unsigned char) * str) || !islower ((unsigned char) * str))
167*d9805213SSascha Wildner 			return 0;
168*d9805213SSascha Wildner 		++str;
169*d9805213SSascha Wildner 	}
170*d9805213SSascha Wildner 
171*d9805213SSascha Wildner 	return 1;
172*d9805213SSascha Wildner }
173*d9805213SSascha Wildner 
174*d9805213SSascha Wildner 
175*d9805213SSascha Wildner /* all_upper - true if a string is all upper-case */
176*d9805213SSascha Wildner 
all_upper(char * str)177*d9805213SSascha Wildner int all_upper (char *str)
178*d9805213SSascha Wildner {
179*d9805213SSascha Wildner 	while (*str) {
180*d9805213SSascha Wildner 		if (!isascii ((unsigned char) * str) || !isupper ((unsigned char) * str))
181*d9805213SSascha Wildner 			return 0;
182*d9805213SSascha Wildner 		++str;
183*d9805213SSascha Wildner 	}
184*d9805213SSascha Wildner 
185*d9805213SSascha Wildner 	return 1;
186*d9805213SSascha Wildner }
187*d9805213SSascha Wildner 
188*d9805213SSascha Wildner 
189*d9805213SSascha Wildner /* intcmp - compares two integers for use by qsort. */
190*d9805213SSascha Wildner 
intcmp(const void * a,const void * b)191*d9805213SSascha Wildner int intcmp (const void *a, const void *b)
192*d9805213SSascha Wildner {
193*d9805213SSascha Wildner   return *(const int *) a - *(const int *) b;
194*d9805213SSascha Wildner }
195*d9805213SSascha Wildner 
196*d9805213SSascha Wildner 
197*d9805213SSascha Wildner /* check_char - checks a character to make sure it's within the range
198*d9805213SSascha Wildner  *		we're expecting.  If not, generates fatal error message
199*d9805213SSascha Wildner  *		and exits.
200*d9805213SSascha Wildner  */
201*d9805213SSascha Wildner 
check_char(int c)202*d9805213SSascha Wildner void check_char (int c)
203*d9805213SSascha Wildner {
204*d9805213SSascha Wildner 	if (c >= CSIZE)
205*d9805213SSascha Wildner 		lerr (_("bad character '%s' detected in check_char()"),
206*d9805213SSascha Wildner 			readable_form (c));
207*d9805213SSascha Wildner 
208*d9805213SSascha Wildner 	if (c >= csize)
209*d9805213SSascha Wildner 		lerr (_
210*d9805213SSascha Wildner 			("scanner requires -8 flag to use the character %s"),
211*d9805213SSascha Wildner 			readable_form (c));
212*d9805213SSascha Wildner }
213*d9805213SSascha Wildner 
214*d9805213SSascha Wildner 
215*d9805213SSascha Wildner 
216*d9805213SSascha Wildner /* clower - replace upper-case letter to lower-case */
217*d9805213SSascha Wildner 
clower(int c)218*d9805213SSascha Wildner unsigned char clower (int c)
219*d9805213SSascha Wildner {
220*d9805213SSascha Wildner 	return (unsigned char) ((isascii (c) && isupper (c)) ? tolower (c) : c);
221*d9805213SSascha Wildner }
222*d9805213SSascha Wildner 
223*d9805213SSascha Wildner 
xstrdup(const char * s)224*d9805213SSascha Wildner char *xstrdup(const char *s)
225*d9805213SSascha Wildner {
226*d9805213SSascha Wildner 	char *s2;
227*d9805213SSascha Wildner 
228*d9805213SSascha Wildner 	if ((s2 = strdup(s)) == NULL)
229*d9805213SSascha Wildner 		flexfatal (_("memory allocation failure in xstrdup()"));
230*d9805213SSascha Wildner 
231*d9805213SSascha Wildner 	return s2;
232*d9805213SSascha Wildner }
233*d9805213SSascha Wildner 
234*d9805213SSascha Wildner 
235*d9805213SSascha Wildner /* cclcmp - compares two characters for use by qsort with '\0' sorting last. */
236*d9805213SSascha Wildner 
cclcmp(const void * a,const void * b)237*d9805213SSascha Wildner int cclcmp (const void *a, const void *b)
238*d9805213SSascha Wildner {
239*d9805213SSascha Wildner   if (!*(const unsigned char *) a)
240*d9805213SSascha Wildner 	return 1;
241*d9805213SSascha Wildner   else
242*d9805213SSascha Wildner 	if (!*(const unsigned char *) b)
243*d9805213SSascha Wildner 	  return - 1;
244*d9805213SSascha Wildner 	else
245*d9805213SSascha Wildner 	  return *(const unsigned char *) a - *(const unsigned char *) b;
246*d9805213SSascha Wildner }
247*d9805213SSascha Wildner 
248*d9805213SSascha Wildner 
249*d9805213SSascha Wildner /* dataend - finish up a block of data declarations */
250*d9805213SSascha Wildner 
dataend(void)251*d9805213SSascha Wildner void dataend (void)
252*d9805213SSascha Wildner {
253*d9805213SSascha Wildner 	/* short circuit any output */
254*d9805213SSascha Wildner 	if (gentables) {
255*d9805213SSascha Wildner 
256*d9805213SSascha Wildner 		if (datapos > 0)
257*d9805213SSascha Wildner 			dataflush ();
258*d9805213SSascha Wildner 
259*d9805213SSascha Wildner 		/* add terminator for initialization; { for vi */
260*d9805213SSascha Wildner 		outn ("    } ;\n");
261*d9805213SSascha Wildner 	}
262*d9805213SSascha Wildner 	dataline = 0;
263*d9805213SSascha Wildner 	datapos = 0;
264*d9805213SSascha Wildner }
265*d9805213SSascha Wildner 
266*d9805213SSascha Wildner 
267*d9805213SSascha Wildner /* dataflush - flush generated data statements */
268*d9805213SSascha Wildner 
dataflush(void)269*d9805213SSascha Wildner void dataflush (void)
270*d9805213SSascha Wildner {
271*d9805213SSascha Wildner 	/* short circuit any output */
272*d9805213SSascha Wildner 	if (!gentables)
273*d9805213SSascha Wildner 		return;
274*d9805213SSascha Wildner 
275*d9805213SSascha Wildner 	outc ('\n');
276*d9805213SSascha Wildner 
277*d9805213SSascha Wildner 	if (++dataline >= NUMDATALINES) {
278*d9805213SSascha Wildner 		/* Put out a blank line so that the table is grouped into
279*d9805213SSascha Wildner 		 * large blocks that enable the user to find elements easily.
280*d9805213SSascha Wildner 		 */
281*d9805213SSascha Wildner 		outc ('\n');
282*d9805213SSascha Wildner 		dataline = 0;
283*d9805213SSascha Wildner 	}
284*d9805213SSascha Wildner 
285*d9805213SSascha Wildner 	/* Reset the number of characters written on the current line. */
286*d9805213SSascha Wildner 	datapos = 0;
287*d9805213SSascha Wildner }
288*d9805213SSascha Wildner 
289*d9805213SSascha Wildner 
290*d9805213SSascha Wildner /* flexerror - report an error message and terminate */
291*d9805213SSascha Wildner 
flexerror(const char * msg)292*d9805213SSascha Wildner void flexerror (const char *msg)
293*d9805213SSascha Wildner {
294*d9805213SSascha Wildner 	fprintf (stderr, "%s: %s\n", program_name, msg);
295*d9805213SSascha Wildner 	flexend (1);
296*d9805213SSascha Wildner }
297*d9805213SSascha Wildner 
298*d9805213SSascha Wildner 
299*d9805213SSascha Wildner /* flexfatal - report a fatal error message and terminate */
300*d9805213SSascha Wildner 
flexfatal(const char * msg)301*d9805213SSascha Wildner void flexfatal (const char *msg)
302*d9805213SSascha Wildner {
303*d9805213SSascha Wildner 	fprintf (stderr, _("%s: fatal internal error, %s\n"),
304*d9805213SSascha Wildner 		 program_name, msg);
305*d9805213SSascha Wildner 	FLEX_EXIT (1);
306*d9805213SSascha Wildner }
307*d9805213SSascha Wildner 
308*d9805213SSascha Wildner 
309*d9805213SSascha Wildner /* lerr - report an error message */
310*d9805213SSascha Wildner 
lerr(const char * msg,...)311*d9805213SSascha Wildner void lerr (const char *msg, ...)
312*d9805213SSascha Wildner {
313*d9805213SSascha Wildner 	char    errmsg[MAXLINE];
314*d9805213SSascha Wildner 	va_list args;
315*d9805213SSascha Wildner 
316*d9805213SSascha Wildner 	va_start(args, msg);
317*d9805213SSascha Wildner 	vsnprintf (errmsg, sizeof(errmsg), msg, args);
318*d9805213SSascha Wildner 	va_end(args);
319*d9805213SSascha Wildner 	flexerror (errmsg);
320*d9805213SSascha Wildner }
321*d9805213SSascha Wildner 
322*d9805213SSascha Wildner 
323*d9805213SSascha Wildner /* lerr_fatal - as lerr, but call flexfatal */
324*d9805213SSascha Wildner 
lerr_fatal(const char * msg,...)325*d9805213SSascha Wildner void lerr_fatal (const char *msg, ...)
326*d9805213SSascha Wildner {
327*d9805213SSascha Wildner 	char    errmsg[MAXLINE];
328*d9805213SSascha Wildner 	va_list args;
329*d9805213SSascha Wildner 	va_start(args, msg);
330*d9805213SSascha Wildner 
331*d9805213SSascha Wildner 	vsnprintf (errmsg, sizeof(errmsg), msg, args);
332*d9805213SSascha Wildner 	va_end(args);
333*d9805213SSascha Wildner 	flexfatal (errmsg);
334*d9805213SSascha Wildner }
335*d9805213SSascha Wildner 
336*d9805213SSascha Wildner 
337*d9805213SSascha Wildner /* line_directive_out - spit out a "#line" statement */
338*d9805213SSascha Wildner 
line_directive_out(FILE * output_file,int do_infile)339*d9805213SSascha Wildner void line_directive_out (FILE *output_file, int do_infile)
340*d9805213SSascha Wildner {
341*d9805213SSascha Wildner 	char    directive[MAXLINE], filename[MAXLINE];
342*d9805213SSascha Wildner 	char   *s1, *s2, *s3;
343*d9805213SSascha Wildner 	static const char line_fmt[] = "#line %d \"%s\"\n";
344*d9805213SSascha Wildner 
345*d9805213SSascha Wildner 	if (!gen_line_dirs)
346*d9805213SSascha Wildner 		return;
347*d9805213SSascha Wildner 
348*d9805213SSascha Wildner 	s1 = do_infile ? infilename : "M4_YY_OUTFILE_NAME";
349*d9805213SSascha Wildner 
350*d9805213SSascha Wildner 	if (do_infile && !s1)
351*d9805213SSascha Wildner         s1 = "<stdin>";
352*d9805213SSascha Wildner 
353*d9805213SSascha Wildner 	s2 = filename;
354*d9805213SSascha Wildner 	s3 = &filename[sizeof (filename) - 2];
355*d9805213SSascha Wildner 
356*d9805213SSascha Wildner 	while (s2 < s3 && *s1) {
357*d9805213SSascha Wildner 		if (*s1 == '\\' || *s1 == '"')
358*d9805213SSascha Wildner 			/* Escape the '\' or '"' */
359*d9805213SSascha Wildner 			*s2++ = '\\';
360*d9805213SSascha Wildner 
361*d9805213SSascha Wildner 		*s2++ = *s1++;
362*d9805213SSascha Wildner 	}
363*d9805213SSascha Wildner 
364*d9805213SSascha Wildner 	*s2 = '\0';
365*d9805213SSascha Wildner 
366*d9805213SSascha Wildner 	if (do_infile)
367*d9805213SSascha Wildner 		snprintf (directive, sizeof(directive), line_fmt, linenum, filename);
368*d9805213SSascha Wildner 	else {
369*d9805213SSascha Wildner 		snprintf (directive, sizeof(directive), line_fmt, 0, filename);
370*d9805213SSascha Wildner 	}
371*d9805213SSascha Wildner 
372*d9805213SSascha Wildner 	/* If output_file is nil then we should put the directive in
373*d9805213SSascha Wildner 	 * the accumulated actions.
374*d9805213SSascha Wildner 	 */
375*d9805213SSascha Wildner 	if (output_file) {
376*d9805213SSascha Wildner 		fputs (directive, output_file);
377*d9805213SSascha Wildner 	}
378*d9805213SSascha Wildner 	else
379*d9805213SSascha Wildner 		add_action (directive);
380*d9805213SSascha Wildner }
381*d9805213SSascha Wildner 
382*d9805213SSascha Wildner 
383*d9805213SSascha Wildner /* mark_defs1 - mark the current position in the action array as
384*d9805213SSascha Wildner  *               representing where the user's section 1 definitions end
385*d9805213SSascha Wildner  *		 and the prolog begins
386*d9805213SSascha Wildner  */
mark_defs1(void)387*d9805213SSascha Wildner void mark_defs1 (void)
388*d9805213SSascha Wildner {
389*d9805213SSascha Wildner 	defs1_offset = 0;
390*d9805213SSascha Wildner 	action_array[action_index++] = '\0';
391*d9805213SSascha Wildner 	action_offset = prolog_offset = action_index;
392*d9805213SSascha Wildner 	action_array[action_index] = '\0';
393*d9805213SSascha Wildner }
394*d9805213SSascha Wildner 
395*d9805213SSascha Wildner 
396*d9805213SSascha Wildner /* mark_prolog - mark the current position in the action array as
397*d9805213SSascha Wildner  *               representing the end of the action prolog
398*d9805213SSascha Wildner  */
mark_prolog(void)399*d9805213SSascha Wildner void mark_prolog (void)
400*d9805213SSascha Wildner {
401*d9805213SSascha Wildner 	action_array[action_index++] = '\0';
402*d9805213SSascha Wildner 	action_offset = action_index;
403*d9805213SSascha Wildner 	action_array[action_index] = '\0';
404*d9805213SSascha Wildner }
405*d9805213SSascha Wildner 
406*d9805213SSascha Wildner 
407*d9805213SSascha Wildner /* mk2data - generate a data statement for a two-dimensional array
408*d9805213SSascha Wildner  *
409*d9805213SSascha Wildner  * Generates a data statement initializing the current 2-D array to "value".
410*d9805213SSascha Wildner  */
mk2data(int value)411*d9805213SSascha Wildner void mk2data (int value)
412*d9805213SSascha Wildner {
413*d9805213SSascha Wildner 	/* short circuit any output */
414*d9805213SSascha Wildner 	if (!gentables)
415*d9805213SSascha Wildner 		return;
416*d9805213SSascha Wildner 
417*d9805213SSascha Wildner 	if (datapos >= NUMDATAITEMS) {
418*d9805213SSascha Wildner 		outc (',');
419*d9805213SSascha Wildner 		dataflush ();
420*d9805213SSascha Wildner 	}
421*d9805213SSascha Wildner 
422*d9805213SSascha Wildner 	if (datapos == 0)
423*d9805213SSascha Wildner 		/* Indent. */
424*d9805213SSascha Wildner 		out ("    ");
425*d9805213SSascha Wildner 
426*d9805213SSascha Wildner 	else
427*d9805213SSascha Wildner 		outc (',');
428*d9805213SSascha Wildner 
429*d9805213SSascha Wildner 	++datapos;
430*d9805213SSascha Wildner 
431*d9805213SSascha Wildner 	out_dec ("%5d", value);
432*d9805213SSascha Wildner }
433*d9805213SSascha Wildner 
434*d9805213SSascha Wildner 
435*d9805213SSascha Wildner /* mkdata - generate a data statement
436*d9805213SSascha Wildner  *
437*d9805213SSascha Wildner  * Generates a data statement initializing the current array element to
438*d9805213SSascha Wildner  * "value".
439*d9805213SSascha Wildner  */
mkdata(int value)440*d9805213SSascha Wildner void mkdata (int value)
441*d9805213SSascha Wildner {
442*d9805213SSascha Wildner 	/* short circuit any output */
443*d9805213SSascha Wildner 	if (!gentables)
444*d9805213SSascha Wildner 		return;
445*d9805213SSascha Wildner 
446*d9805213SSascha Wildner 	if (datapos >= NUMDATAITEMS) {
447*d9805213SSascha Wildner 		outc (',');
448*d9805213SSascha Wildner 		dataflush ();
449*d9805213SSascha Wildner 	}
450*d9805213SSascha Wildner 
451*d9805213SSascha Wildner 	if (datapos == 0)
452*d9805213SSascha Wildner 		/* Indent. */
453*d9805213SSascha Wildner 		out ("    ");
454*d9805213SSascha Wildner 	else
455*d9805213SSascha Wildner 		outc (',');
456*d9805213SSascha Wildner 
457*d9805213SSascha Wildner 	++datapos;
458*d9805213SSascha Wildner 
459*d9805213SSascha Wildner 	out_dec ("%5d", value);
460*d9805213SSascha Wildner }
461*d9805213SSascha Wildner 
462*d9805213SSascha Wildner 
463*d9805213SSascha Wildner /* myctoi - return the integer represented by a string of digits */
464*d9805213SSascha Wildner 
myctoi(const char * array)465*d9805213SSascha Wildner int myctoi (const char *array)
466*d9805213SSascha Wildner {
467*d9805213SSascha Wildner 	int     val = 0;
468*d9805213SSascha Wildner 
469*d9805213SSascha Wildner 	(void) sscanf (array, "%d", &val);
470*d9805213SSascha Wildner 
471*d9805213SSascha Wildner 	return val;
472*d9805213SSascha Wildner }
473*d9805213SSascha Wildner 
474*d9805213SSascha Wildner 
475*d9805213SSascha Wildner /* myesc - return character corresponding to escape sequence */
476*d9805213SSascha Wildner 
myesc(unsigned char array[])477*d9805213SSascha Wildner unsigned char myesc (unsigned char array[])
478*d9805213SSascha Wildner {
479*d9805213SSascha Wildner 	unsigned char    c, esc_char;
480*d9805213SSascha Wildner 
481*d9805213SSascha Wildner 	switch (array[1]) {
482*d9805213SSascha Wildner 	case 'b':
483*d9805213SSascha Wildner 		return '\b';
484*d9805213SSascha Wildner 	case 'f':
485*d9805213SSascha Wildner 		return '\f';
486*d9805213SSascha Wildner 	case 'n':
487*d9805213SSascha Wildner 		return '\n';
488*d9805213SSascha Wildner 	case 'r':
489*d9805213SSascha Wildner 		return '\r';
490*d9805213SSascha Wildner 	case 't':
491*d9805213SSascha Wildner 		return '\t';
492*d9805213SSascha Wildner 	case 'a':
493*d9805213SSascha Wildner 		return '\a';
494*d9805213SSascha Wildner 	case 'v':
495*d9805213SSascha Wildner 		return '\v';
496*d9805213SSascha Wildner 	case '0':
497*d9805213SSascha Wildner 	case '1':
498*d9805213SSascha Wildner 	case '2':
499*d9805213SSascha Wildner 	case '3':
500*d9805213SSascha Wildner 	case '4':
501*d9805213SSascha Wildner 	case '5':
502*d9805213SSascha Wildner 	case '6':
503*d9805213SSascha Wildner 	case '7':
504*d9805213SSascha Wildner 		{		/* \<octal> */
505*d9805213SSascha Wildner 			int     sptr = 1;
506*d9805213SSascha Wildner 
507*d9805213SSascha Wildner 			while (sptr <= 3 &&
508*d9805213SSascha Wildner                                array[sptr] >= '0' && array[sptr] <= '7') {
509*d9805213SSascha Wildner 				++sptr;
510*d9805213SSascha Wildner 			}
511*d9805213SSascha Wildner 
512*d9805213SSascha Wildner 			c = array[sptr];
513*d9805213SSascha Wildner 			array[sptr] = '\0';
514*d9805213SSascha Wildner 
515*d9805213SSascha Wildner 			esc_char = (unsigned char) strtoul (array + 1, NULL, 8);
516*d9805213SSascha Wildner 
517*d9805213SSascha Wildner 			array[sptr] = c;
518*d9805213SSascha Wildner 
519*d9805213SSascha Wildner 			return esc_char;
520*d9805213SSascha Wildner 		}
521*d9805213SSascha Wildner 
522*d9805213SSascha Wildner 	case 'x':
523*d9805213SSascha Wildner 		{		/* \x<hex> */
524*d9805213SSascha Wildner 			int     sptr = 2;
525*d9805213SSascha Wildner 
526*d9805213SSascha Wildner 			while (sptr <= 3 && isxdigit (array[sptr])) {
527*d9805213SSascha Wildner 				/* Don't increment inside loop control
528*d9805213SSascha Wildner 				 * because if isxdigit() is a macro it might
529*d9805213SSascha Wildner 				 * expand into multiple increments ...
530*d9805213SSascha Wildner 				 */
531*d9805213SSascha Wildner 				++sptr;
532*d9805213SSascha Wildner 			}
533*d9805213SSascha Wildner 
534*d9805213SSascha Wildner 			c = array[sptr];
535*d9805213SSascha Wildner 			array[sptr] = '\0';
536*d9805213SSascha Wildner 
537*d9805213SSascha Wildner 			esc_char = (unsigned char) strtoul (array + 2, NULL, 16);
538*d9805213SSascha Wildner 
539*d9805213SSascha Wildner 			array[sptr] = c;
540*d9805213SSascha Wildner 
541*d9805213SSascha Wildner 			return esc_char;
542*d9805213SSascha Wildner 		}
543*d9805213SSascha Wildner 
544*d9805213SSascha Wildner 	default:
545*d9805213SSascha Wildner 		return array[1];
546*d9805213SSascha Wildner 	}
547*d9805213SSascha Wildner }
548*d9805213SSascha Wildner 
549*d9805213SSascha Wildner 
550*d9805213SSascha Wildner /* out - various flavors of outputing a (possibly formatted) string for the
551*d9805213SSascha Wildner  *	 generated scanner, keeping track of the line count.
552*d9805213SSascha Wildner  */
553*d9805213SSascha Wildner 
out(const char * str)554*d9805213SSascha Wildner void out (const char *str)
555*d9805213SSascha Wildner {
556*d9805213SSascha Wildner 	fputs (str, stdout);
557*d9805213SSascha Wildner }
558*d9805213SSascha Wildner 
out_dec(const char * fmt,int n)559*d9805213SSascha Wildner void out_dec (const char *fmt, int n)
560*d9805213SSascha Wildner {
561*d9805213SSascha Wildner 	fprintf (stdout, fmt, n);
562*d9805213SSascha Wildner }
563*d9805213SSascha Wildner 
out_dec2(const char * fmt,int n1,int n2)564*d9805213SSascha Wildner void out_dec2 (const char *fmt, int n1, int n2)
565*d9805213SSascha Wildner {
566*d9805213SSascha Wildner 	fprintf (stdout, fmt, n1, n2);
567*d9805213SSascha Wildner }
568*d9805213SSascha Wildner 
out_hex(const char * fmt,unsigned int x)569*d9805213SSascha Wildner void out_hex (const char *fmt, unsigned int x)
570*d9805213SSascha Wildner {
571*d9805213SSascha Wildner 	fprintf (stdout, fmt, x);
572*d9805213SSascha Wildner }
573*d9805213SSascha Wildner 
out_str(const char * fmt,const char str[])574*d9805213SSascha Wildner void out_str (const char *fmt, const char str[])
575*d9805213SSascha Wildner {
576*d9805213SSascha Wildner 	fprintf (stdout,fmt, str);
577*d9805213SSascha Wildner }
578*d9805213SSascha Wildner 
out_str3(const char * fmt,const char s1[],const char s2[],const char s3[])579*d9805213SSascha Wildner void out_str3 (const char *fmt, const char s1[], const char s2[], const char s3[])
580*d9805213SSascha Wildner {
581*d9805213SSascha Wildner 	fprintf (stdout,fmt, s1, s2, s3);
582*d9805213SSascha Wildner }
583*d9805213SSascha Wildner 
out_str_dec(const char * fmt,const char str[],int n)584*d9805213SSascha Wildner void out_str_dec (const char *fmt, const char str[], int n)
585*d9805213SSascha Wildner {
586*d9805213SSascha Wildner 	fprintf (stdout,fmt, str, n);
587*d9805213SSascha Wildner }
588*d9805213SSascha Wildner 
outc(int c)589*d9805213SSascha Wildner void outc (int c)
590*d9805213SSascha Wildner {
591*d9805213SSascha Wildner 	fputc (c, stdout);
592*d9805213SSascha Wildner }
593*d9805213SSascha Wildner 
outn(const char * str)594*d9805213SSascha Wildner void outn (const char *str)
595*d9805213SSascha Wildner {
596*d9805213SSascha Wildner 	fputs (str,stdout);
597*d9805213SSascha Wildner     fputc('\n',stdout);
598*d9805213SSascha Wildner }
599*d9805213SSascha Wildner 
600*d9805213SSascha Wildner /** Print "m4_define( [[def]], [[val]])m4_dnl\n".
601*d9805213SSascha Wildner  * @param def The m4 symbol to define.
602*d9805213SSascha Wildner  * @param val The definition; may be NULL.
603*d9805213SSascha Wildner  */
out_m4_define(const char * def,const char * val)604*d9805213SSascha Wildner void out_m4_define (const char* def, const char* val)
605*d9805213SSascha Wildner {
606*d9805213SSascha Wildner     const char * fmt = "m4_define( [[%s]], [[%s]])m4_dnl\n";
607*d9805213SSascha Wildner     fprintf(stdout, fmt, def, val?val:"");
608*d9805213SSascha Wildner }
609*d9805213SSascha Wildner 
610*d9805213SSascha Wildner 
611*d9805213SSascha Wildner /* readable_form - return the the human-readable form of a character
612*d9805213SSascha Wildner  *
613*d9805213SSascha Wildner  * The returned string is in static storage.
614*d9805213SSascha Wildner  */
615*d9805213SSascha Wildner 
readable_form(int c)616*d9805213SSascha Wildner char   *readable_form (int c)
617*d9805213SSascha Wildner {
618*d9805213SSascha Wildner 	static char rform[20];
619*d9805213SSascha Wildner 
620*d9805213SSascha Wildner 	if ((c >= 0 && c < 32) || c >= 127) {
621*d9805213SSascha Wildner 		switch (c) {
622*d9805213SSascha Wildner 		case '\b':
623*d9805213SSascha Wildner 			return "\\b";
624*d9805213SSascha Wildner 		case '\f':
625*d9805213SSascha Wildner 			return "\\f";
626*d9805213SSascha Wildner 		case '\n':
627*d9805213SSascha Wildner 			return "\\n";
628*d9805213SSascha Wildner 		case '\r':
629*d9805213SSascha Wildner 			return "\\r";
630*d9805213SSascha Wildner 		case '\t':
631*d9805213SSascha Wildner 			return "\\t";
632*d9805213SSascha Wildner 		case '\a':
633*d9805213SSascha Wildner 			return "\\a";
634*d9805213SSascha Wildner 		case '\v':
635*d9805213SSascha Wildner 			return "\\v";
636*d9805213SSascha Wildner 		default:
637*d9805213SSascha Wildner 			if(trace_hex)
638*d9805213SSascha Wildner 				snprintf (rform, sizeof(rform), "\\x%.2x", (unsigned int) c);
639*d9805213SSascha Wildner 			else
640*d9805213SSascha Wildner 				snprintf (rform, sizeof(rform), "\\%.3o", (unsigned int) c);
641*d9805213SSascha Wildner 			return rform;
642*d9805213SSascha Wildner 		}
643*d9805213SSascha Wildner 	}
644*d9805213SSascha Wildner 
645*d9805213SSascha Wildner 	else if (c == ' ')
646*d9805213SSascha Wildner 		return "' '";
647*d9805213SSascha Wildner 
648*d9805213SSascha Wildner 	else {
649*d9805213SSascha Wildner 		rform[0] = (char) c;
650*d9805213SSascha Wildner 		rform[1] = '\0';
651*d9805213SSascha Wildner 
652*d9805213SSascha Wildner 		return rform;
653*d9805213SSascha Wildner 	}
654*d9805213SSascha Wildner }
655*d9805213SSascha Wildner 
656*d9805213SSascha Wildner 
657*d9805213SSascha Wildner /* reallocate_array - increase the size of a dynamic array */
658*d9805213SSascha Wildner 
reallocate_array(void * array,int size,size_t element_size)659*d9805213SSascha Wildner void   *reallocate_array (void *array, int size, size_t element_size)
660*d9805213SSascha Wildner {
661*d9805213SSascha Wildner 	void *new_array;
662*d9805213SSascha Wildner #if HAVE_REALLOCARRAY
663*d9805213SSascha Wildner 	/* reallocarray has built-in overflow detection */
664*d9805213SSascha Wildner 	new_array = reallocarray(array, (size_t) size, element_size);
665*d9805213SSascha Wildner #else
666*d9805213SSascha Wildner 	size_t num_bytes = (size_t) size * element_size;
667*d9805213SSascha Wildner 	new_array = (size && SIZE_MAX / (size_t) size < element_size) ? NULL :
668*d9805213SSascha Wildner 		realloc(array, num_bytes);
669*d9805213SSascha Wildner #endif
670*d9805213SSascha Wildner 	if (!new_array)
671*d9805213SSascha Wildner 		flexfatal (_("attempt to increase array size failed"));
672*d9805213SSascha Wildner 
673*d9805213SSascha Wildner 	return new_array;
674*d9805213SSascha Wildner }
675*d9805213SSascha Wildner 
676*d9805213SSascha Wildner 
677*d9805213SSascha Wildner /* skelout - write out one section of the skeleton file
678*d9805213SSascha Wildner  *
679*d9805213SSascha Wildner  * Description
680*d9805213SSascha Wildner  *    Copies skelfile or skel array to stdout until a line beginning with
681*d9805213SSascha Wildner  *    "%%" or EOF is found.
682*d9805213SSascha Wildner  */
skelout(void)683*d9805213SSascha Wildner void skelout (void)
684*d9805213SSascha Wildner {
685*d9805213SSascha Wildner 	char    buf_storage[MAXLINE];
686*d9805213SSascha Wildner 	char   *buf = buf_storage;
687*d9805213SSascha Wildner 	bool   do_copy = true;
688*d9805213SSascha Wildner 
689*d9805213SSascha Wildner     /* "reset" the state by clearing the buffer and pushing a '1' */
690*d9805213SSascha Wildner     if(sko_len > 0)
691*d9805213SSascha Wildner         sko_peek(&do_copy);
692*d9805213SSascha Wildner     sko_len = 0;
693*d9805213SSascha Wildner     sko_push(do_copy=true);
694*d9805213SSascha Wildner 
695*d9805213SSascha Wildner 
696*d9805213SSascha Wildner 	/* Loop pulling lines either from the skelfile, if we're using
697*d9805213SSascha Wildner 	 * one, or from the skel[] array.
698*d9805213SSascha Wildner 	 */
699*d9805213SSascha Wildner 	while (skelfile ?
700*d9805213SSascha Wildner 	       (fgets (buf, MAXLINE, skelfile) != NULL) :
701*d9805213SSascha Wildner 	       ((buf = (char *) skel[skel_ind++]) != 0)) {
702*d9805213SSascha Wildner 
703*d9805213SSascha Wildner 		if (skelfile)
704*d9805213SSascha Wildner 			chomp (buf);
705*d9805213SSascha Wildner 
706*d9805213SSascha Wildner 		/* copy from skel array */
707*d9805213SSascha Wildner 		if (buf[0] == '%') {	/* control line */
708*d9805213SSascha Wildner 			/* print the control line as a comment. */
709*d9805213SSascha Wildner 			if (ddebug && buf[1] != '#') {
710*d9805213SSascha Wildner 				if (buf[strlen (buf) - 1] == '\\')
711*d9805213SSascha Wildner 					out_str ("/* %s */\\\n", buf);
712*d9805213SSascha Wildner 				else
713*d9805213SSascha Wildner 					out_str ("/* %s */\n", buf);
714*d9805213SSascha Wildner 			}
715*d9805213SSascha Wildner 
716*d9805213SSascha Wildner 			/* We've been accused of using cryptic markers in the skel.
717*d9805213SSascha Wildner 			 * So we'll use emacs-style-hyphenated-commands.
718*d9805213SSascha Wildner              * We might consider a hash if this if-else-if-else
719*d9805213SSascha Wildner              * chain gets too large.
720*d9805213SSascha Wildner 			 */
721*d9805213SSascha Wildner #define cmd_match(s) (strncmp(buf,(s),strlen(s))==0)
722*d9805213SSascha Wildner 
723*d9805213SSascha Wildner 			if (buf[1] == '%') {
724*d9805213SSascha Wildner 				/* %% is a break point for skelout() */
725*d9805213SSascha Wildner 				return;
726*d9805213SSascha Wildner 			}
727*d9805213SSascha Wildner             else if (cmd_match (CMD_PUSH)){
728*d9805213SSascha Wildner                 sko_push(do_copy);
729*d9805213SSascha Wildner                 if(ddebug){
730*d9805213SSascha Wildner                     out_str("/*(state = (%s) */",do_copy?"true":"false");
731*d9805213SSascha Wildner                 }
732*d9805213SSascha Wildner                 out_str("%s\n", buf[strlen (buf) - 1] =='\\' ? "\\" : "");
733*d9805213SSascha Wildner             }
734*d9805213SSascha Wildner             else if (cmd_match (CMD_POP)){
735*d9805213SSascha Wildner                 sko_pop(&do_copy);
736*d9805213SSascha Wildner                 if(ddebug){
737*d9805213SSascha Wildner                     out_str("/*(state = (%s) */",do_copy?"true":"false");
738*d9805213SSascha Wildner                 }
739*d9805213SSascha Wildner                 out_str("%s\n", buf[strlen (buf) - 1] =='\\' ? "\\" : "");
740*d9805213SSascha Wildner             }
741*d9805213SSascha Wildner             else if (cmd_match (CMD_IF_REENTRANT)){
742*d9805213SSascha Wildner                 sko_push(do_copy);
743*d9805213SSascha Wildner                 do_copy = reentrant && do_copy;
744*d9805213SSascha Wildner             }
745*d9805213SSascha Wildner             else if (cmd_match (CMD_IF_NOT_REENTRANT)){
746*d9805213SSascha Wildner                 sko_push(do_copy);
747*d9805213SSascha Wildner                 do_copy = !reentrant && do_copy;
748*d9805213SSascha Wildner             }
749*d9805213SSascha Wildner             else if (cmd_match(CMD_IF_BISON_BRIDGE)){
750*d9805213SSascha Wildner                 sko_push(do_copy);
751*d9805213SSascha Wildner                 do_copy = bison_bridge_lval && do_copy;
752*d9805213SSascha Wildner             }
753*d9805213SSascha Wildner             else if (cmd_match(CMD_IF_NOT_BISON_BRIDGE)){
754*d9805213SSascha Wildner                 sko_push(do_copy);
755*d9805213SSascha Wildner                 do_copy = !bison_bridge_lval && do_copy;
756*d9805213SSascha Wildner             }
757*d9805213SSascha Wildner             else if (cmd_match (CMD_ENDIF)){
758*d9805213SSascha Wildner                 sko_pop(&do_copy);
759*d9805213SSascha Wildner             }
760*d9805213SSascha Wildner 			else if (cmd_match (CMD_IF_TABLES_SER)) {
761*d9805213SSascha Wildner                 do_copy = do_copy && tablesext;
762*d9805213SSascha Wildner 			}
763*d9805213SSascha Wildner 			else if (cmd_match (CMD_TABLES_YYDMAP)) {
764*d9805213SSascha Wildner 				if (tablesext && yydmap_buf.elts)
765*d9805213SSascha Wildner 					outn ((char *) (yydmap_buf.elts));
766*d9805213SSascha Wildner 			}
767*d9805213SSascha Wildner             else if (cmd_match (CMD_DEFINE_YYTABLES)) {
768*d9805213SSascha Wildner                 out_str("#define YYTABLES_NAME \"%s\"\n",
769*d9805213SSascha Wildner                         tablesname?tablesname:"yytables");
770*d9805213SSascha Wildner             }
771*d9805213SSascha Wildner 			else if (cmd_match (CMD_IF_CPP_ONLY)) {
772*d9805213SSascha Wildner 				/* only for C++ */
773*d9805213SSascha Wildner                 sko_push(do_copy);
774*d9805213SSascha Wildner 				do_copy = C_plus_plus;
775*d9805213SSascha Wildner 			}
776*d9805213SSascha Wildner 			else if (cmd_match (CMD_IF_C_ONLY)) {
777*d9805213SSascha Wildner 				/* %- only for C */
778*d9805213SSascha Wildner                 sko_push(do_copy);
779*d9805213SSascha Wildner 				do_copy = !C_plus_plus;
780*d9805213SSascha Wildner 			}
781*d9805213SSascha Wildner 			else if (cmd_match (CMD_IF_C_OR_CPP)) {
782*d9805213SSascha Wildner 				/* %* for C and C++ */
783*d9805213SSascha Wildner                 sko_push(do_copy);
784*d9805213SSascha Wildner 				do_copy = true;
785*d9805213SSascha Wildner 			}
786*d9805213SSascha Wildner 			else if (cmd_match (CMD_NOT_FOR_HEADER)) {
787*d9805213SSascha Wildner 				/* %c begin linkage-only (non-header) code. */
788*d9805213SSascha Wildner 				OUT_BEGIN_CODE ();
789*d9805213SSascha Wildner 			}
790*d9805213SSascha Wildner 			else if (cmd_match (CMD_OK_FOR_HEADER)) {
791*d9805213SSascha Wildner 				/* %e end linkage-only code. */
792*d9805213SSascha Wildner 				OUT_END_CODE ();
793*d9805213SSascha Wildner 			}
794*d9805213SSascha Wildner 			else {
795*d9805213SSascha Wildner 				flexfatal (_("bad line in skeleton file"));
796*d9805213SSascha Wildner 			}
797*d9805213SSascha Wildner 		}
798*d9805213SSascha Wildner 
799*d9805213SSascha Wildner 		else if (do_copy)
800*d9805213SSascha Wildner             outn (buf);
801*d9805213SSascha Wildner 	}			/* end while */
802*d9805213SSascha Wildner }
803*d9805213SSascha Wildner 
804*d9805213SSascha Wildner 
805*d9805213SSascha Wildner /* transition_struct_out - output a yy_trans_info structure
806*d9805213SSascha Wildner  *
807*d9805213SSascha Wildner  * outputs the yy_trans_info structure with the two elements, element_v and
808*d9805213SSascha Wildner  * element_n.  Formats the output with spaces and carriage returns.
809*d9805213SSascha Wildner  */
810*d9805213SSascha Wildner 
transition_struct_out(int element_v,int element_n)811*d9805213SSascha Wildner void transition_struct_out (int element_v, int element_n)
812*d9805213SSascha Wildner {
813*d9805213SSascha Wildner 
814*d9805213SSascha Wildner 	/* short circuit any output */
815*d9805213SSascha Wildner 	if (!gentables)
816*d9805213SSascha Wildner 		return;
817*d9805213SSascha Wildner 
818*d9805213SSascha Wildner 	out_dec2 (" {%4d,%4d },", element_v, element_n);
819*d9805213SSascha Wildner 
820*d9805213SSascha Wildner 	datapos += TRANS_STRUCT_PRINT_LENGTH;
821*d9805213SSascha Wildner 
822*d9805213SSascha Wildner 	if (datapos >= 79 - TRANS_STRUCT_PRINT_LENGTH) {
823*d9805213SSascha Wildner 		outc ('\n');
824*d9805213SSascha Wildner 
825*d9805213SSascha Wildner 		if (++dataline % 10 == 0)
826*d9805213SSascha Wildner 			outc ('\n');
827*d9805213SSascha Wildner 
828*d9805213SSascha Wildner 		datapos = 0;
829*d9805213SSascha Wildner 	}
830*d9805213SSascha Wildner }
831*d9805213SSascha Wildner 
832*d9805213SSascha Wildner 
833*d9805213SSascha Wildner /* The following is only needed when building flex's parser using certain
834*d9805213SSascha Wildner  * broken versions of bison.
835*d9805213SSascha Wildner  *
836*d9805213SSascha Wildner  * XXX: this is should go soon
837*d9805213SSascha Wildner  */
yy_flex_xmalloc(int size)838*d9805213SSascha Wildner void   *yy_flex_xmalloc (int size)
839*d9805213SSascha Wildner {
840*d9805213SSascha Wildner 	void   *result;
841*d9805213SSascha Wildner 
842*d9805213SSascha Wildner 	result = malloc((size_t) size);
843*d9805213SSascha Wildner 	if (!result)
844*d9805213SSascha Wildner 		flexfatal (_
845*d9805213SSascha Wildner 			   ("memory allocation failed in yy_flex_xmalloc()"));
846*d9805213SSascha Wildner 
847*d9805213SSascha Wildner 	return result;
848*d9805213SSascha Wildner }
849*d9805213SSascha Wildner 
850*d9805213SSascha Wildner 
851*d9805213SSascha Wildner /* Remove all '\n' and '\r' characters, if any, from the end of str.
852*d9805213SSascha Wildner  * str can be any null-terminated string, or NULL.
853*d9805213SSascha Wildner  * returns str. */
chomp(char * str)854*d9805213SSascha Wildner char   *chomp (char *str)
855*d9805213SSascha Wildner {
856*d9805213SSascha Wildner 	char   *p = str;
857*d9805213SSascha Wildner 
858*d9805213SSascha Wildner 	if (!str || !*str)	/* s is null or empty string */
859*d9805213SSascha Wildner 		return str;
860*d9805213SSascha Wildner 
861*d9805213SSascha Wildner 	/* find end of string minus one */
862*d9805213SSascha Wildner 	while (*p)
863*d9805213SSascha Wildner 		++p;
864*d9805213SSascha Wildner 	--p;
865*d9805213SSascha Wildner 
866*d9805213SSascha Wildner 	/* eat newlines */
867*d9805213SSascha Wildner 	while (p >= str && (*p == '\r' || *p == '\n'))
868*d9805213SSascha Wildner 		*p-- = 0;
869*d9805213SSascha Wildner 	return str;
870*d9805213SSascha Wildner }
871