xref: /minix3/external/bsd/flex/dist/misc.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc /*	$NetBSD: misc.c,v 1.5 2014/10/30 18:44:05 christos Exp $	*/
2357f1050SThomas Veerman 
3357f1050SThomas Veerman /* misc - miscellaneous flex routines */
4357f1050SThomas Veerman 
5357f1050SThomas Veerman /*  Copyright (c) 1990 The Regents of the University of California. */
6357f1050SThomas Veerman /*  All rights reserved. */
7357f1050SThomas Veerman 
8357f1050SThomas Veerman /*  This code is derived from software contributed to Berkeley by */
9357f1050SThomas Veerman /*  Vern Paxson. */
10357f1050SThomas Veerman 
11357f1050SThomas Veerman /*  The United States Government has rights in this work pursuant */
12357f1050SThomas Veerman /*  to contract no. DE-AC03-76SF00098 between the United States */
13357f1050SThomas Veerman /*  Department of Energy and the University of California. */
14357f1050SThomas Veerman 
15357f1050SThomas Veerman /*  This file is part of flex. */
16357f1050SThomas Veerman 
17357f1050SThomas Veerman /*  Redistribution and use in source and binary forms, with or without */
18357f1050SThomas Veerman /*  modification, are permitted provided that the following conditions */
19357f1050SThomas Veerman /*  are met: */
20357f1050SThomas Veerman 
21357f1050SThomas Veerman /*  1. Redistributions of source code must retain the above copyright */
22357f1050SThomas Veerman /*     notice, this list of conditions and the following disclaimer. */
23357f1050SThomas Veerman /*  2. Redistributions in binary form must reproduce the above copyright */
24357f1050SThomas Veerman /*     notice, this list of conditions and the following disclaimer in the */
25357f1050SThomas Veerman /*     documentation and/or other materials provided with the distribution. */
26357f1050SThomas Veerman 
27357f1050SThomas Veerman /*  Neither the name of the University nor the names of its contributors */
28357f1050SThomas Veerman /*  may be used to endorse or promote products derived from this software */
29357f1050SThomas Veerman /*  without specific prior written permission. */
30357f1050SThomas Veerman 
31357f1050SThomas Veerman /*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */
32357f1050SThomas Veerman /*  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
33357f1050SThomas Veerman /*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */
34357f1050SThomas Veerman /*  PURPOSE. */
35357f1050SThomas Veerman #include "flexdef.h"
36*0a6a1f1dSLionel Sambuc __RCSID("$NetBSD: misc.c,v 1.5 2014/10/30 18:44:05 christos Exp $");
37*0a6a1f1dSLionel Sambuc 
38357f1050SThomas Veerman #include "tables.h"
3984d9c625SLionel Sambuc #include <stdarg.h>
40357f1050SThomas Veerman 
41357f1050SThomas Veerman #define CMD_IF_TABLES_SER    "%if-tables-serialization"
42357f1050SThomas Veerman #define CMD_TABLES_YYDMAP    "%tables-yydmap"
43357f1050SThomas Veerman #define CMD_DEFINE_YYTABLES  "%define-yytables"
44357f1050SThomas Veerman #define CMD_IF_CPP_ONLY      "%if-c++-only"
45357f1050SThomas Veerman #define CMD_IF_C_ONLY        "%if-c-only"
46357f1050SThomas Veerman #define CMD_IF_C_OR_CPP      "%if-c-or-c++"
47357f1050SThomas Veerman #define CMD_NOT_FOR_HEADER   "%not-for-header"
48357f1050SThomas Veerman #define CMD_OK_FOR_HEADER    "%ok-for-header"
49357f1050SThomas Veerman #define CMD_PUSH             "%push"
50357f1050SThomas Veerman #define CMD_POP              "%pop"
51357f1050SThomas Veerman #define CMD_IF_REENTRANT     "%if-reentrant"
52357f1050SThomas Veerman #define CMD_IF_NOT_REENTRANT "%if-not-reentrant"
53357f1050SThomas Veerman #define CMD_IF_BISON_BRIDGE  "%if-bison-bridge"
54357f1050SThomas Veerman #define CMD_IF_NOT_BISON_BRIDGE  "%if-not-bison-bridge"
55357f1050SThomas Veerman #define CMD_ENDIF            "%endif"
56357f1050SThomas Veerman 
57357f1050SThomas Veerman /* we allow the skeleton to push and pop. */
58357f1050SThomas Veerman struct sko_state {
59357f1050SThomas Veerman     bool dc; /**< do_copy */
60357f1050SThomas Veerman };
61357f1050SThomas Veerman static struct sko_state *sko_stack=0;
62357f1050SThomas Veerman static int sko_len=0,sko_sz=0;
sko_push(bool dc)63357f1050SThomas Veerman static void sko_push(bool dc)
64357f1050SThomas Veerman {
65357f1050SThomas Veerman     if(!sko_stack){
66357f1050SThomas Veerman         sko_sz = 1;
67357f1050SThomas Veerman         sko_stack = (struct sko_state*)flex_alloc(sizeof(struct sko_state)*sko_sz);
6884d9c625SLionel Sambuc         if (!sko_stack)
6984d9c625SLionel Sambuc             flexfatal(_("allocation of sko_stack failed"));
70357f1050SThomas Veerman         sko_len = 0;
71357f1050SThomas Veerman     }
72357f1050SThomas Veerman     if(sko_len >= sko_sz){
73357f1050SThomas Veerman         sko_sz *= 2;
74357f1050SThomas Veerman         sko_stack = (struct sko_state*)flex_realloc(sko_stack,sizeof(struct sko_state)*sko_sz);
75357f1050SThomas Veerman     }
76357f1050SThomas Veerman 
77357f1050SThomas Veerman     /* initialize to zero and push */
78357f1050SThomas Veerman     sko_stack[sko_len].dc = dc;
79357f1050SThomas Veerman     sko_len++;
80357f1050SThomas Veerman }
sko_peek(bool * dc)81357f1050SThomas Veerman static void sko_peek(bool *dc)
82357f1050SThomas Veerman {
83357f1050SThomas Veerman     if(sko_len <= 0)
84357f1050SThomas Veerman         flex_die("peek attempt when sko stack is empty");
85357f1050SThomas Veerman     if(dc)
86357f1050SThomas Veerman         *dc = sko_stack[sko_len-1].dc;
87357f1050SThomas Veerman }
sko_pop(bool * dc)88357f1050SThomas Veerman static void sko_pop(bool* dc)
89357f1050SThomas Veerman {
90357f1050SThomas Veerman     sko_peek(dc);
91357f1050SThomas Veerman     sko_len--;
92357f1050SThomas Veerman     if(sko_len < 0)
93357f1050SThomas Veerman         flex_die("popped too many times in skeleton.");
94357f1050SThomas Veerman }
95357f1050SThomas Veerman 
96357f1050SThomas Veerman /* Append "#define defname value\n" to the running buffer. */
action_define(defname,value)97357f1050SThomas Veerman void action_define (defname, value)
98357f1050SThomas Veerman      const char *defname;
99357f1050SThomas Veerman      int value;
100357f1050SThomas Veerman {
101357f1050SThomas Veerman 	char    buf[MAXLINE];
102357f1050SThomas Veerman 	char   *cpy;
103357f1050SThomas Veerman 
104357f1050SThomas Veerman 	if ((int) strlen (defname) > MAXLINE / 2) {
105357f1050SThomas Veerman 		format_pinpoint_message (_
106357f1050SThomas Veerman 					 ("name \"%s\" ridiculously long"),
107357f1050SThomas Veerman 					 defname);
108357f1050SThomas Veerman 		return;
109357f1050SThomas Veerman 	}
110357f1050SThomas Veerman 
111357f1050SThomas Veerman 	snprintf (buf, sizeof(buf), "#define %s %d\n", defname, value);
112357f1050SThomas Veerman 	add_action (buf);
113357f1050SThomas Veerman 
114357f1050SThomas Veerman 	/* track #defines so we can undef them when we're done. */
115357f1050SThomas Veerman 	cpy = copy_string (defname);
116357f1050SThomas Veerman 	buf_append (&defs_buf, &cpy, 1);
117357f1050SThomas Veerman }
118357f1050SThomas Veerman 
119357f1050SThomas Veerman 
120357f1050SThomas Veerman #ifdef notdef
121357f1050SThomas Veerman /** Append "m4_define([[defname]],[[value]])m4_dnl\n" to the running buffer.
122357f1050SThomas Veerman  *  @param defname The macro name.
123357f1050SThomas Veerman  *  @param value The macro value, can be NULL, which is the same as the empty string.
124357f1050SThomas Veerman  */
action_m4_define(const char * defname,const char * value)125357f1050SThomas Veerman static void action_m4_define (const char *defname, const char * value)
126357f1050SThomas Veerman {
127357f1050SThomas Veerman 	char    buf[MAXLINE];
128357f1050SThomas Veerman 
129357f1050SThomas Veerman     flexfatal ("DO NOT USE THIS FUNCTION!");
130357f1050SThomas Veerman 
131357f1050SThomas Veerman 	if ((int) strlen (defname) > MAXLINE / 2) {
132357f1050SThomas Veerman 		format_pinpoint_message (_
133357f1050SThomas Veerman 					 ("name \"%s\" ridiculously long"),
134357f1050SThomas Veerman 					 defname);
135357f1050SThomas Veerman 		return;
136357f1050SThomas Veerman 	}
137357f1050SThomas Veerman 
138357f1050SThomas Veerman 	snprintf (buf, sizeof(buf), "m4_define([[%s]],[[%s]])m4_dnl\n", defname, value?value:"");
139357f1050SThomas Veerman 	add_action (buf);
140357f1050SThomas Veerman }
141357f1050SThomas Veerman #endif
142357f1050SThomas Veerman 
143357f1050SThomas Veerman /* Append "new_text" to the running buffer. */
add_action(new_text)144357f1050SThomas Veerman void add_action (new_text)
145357f1050SThomas Veerman      const char   *new_text;
146357f1050SThomas Veerman {
147357f1050SThomas Veerman 	int     len = strlen (new_text);
148357f1050SThomas Veerman 
149357f1050SThomas Veerman 	while (len + action_index >= action_size - 10 /* slop */ ) {
150357f1050SThomas Veerman 		int     new_size = action_size * 2;
151357f1050SThomas Veerman 
152357f1050SThomas Veerman 		if (new_size <= 0)
153357f1050SThomas Veerman 			/* Increase just a little, to try to avoid overflow
154357f1050SThomas Veerman 			 * on 16-bit machines.
155357f1050SThomas Veerman 			 */
156357f1050SThomas Veerman 			action_size += action_size / 8;
157357f1050SThomas Veerman 		else
158357f1050SThomas Veerman 			action_size = new_size;
159357f1050SThomas Veerman 
160357f1050SThomas Veerman 		action_array =
161357f1050SThomas Veerman 			reallocate_character_array (action_array,
162357f1050SThomas Veerman 						    action_size);
163357f1050SThomas Veerman 	}
164357f1050SThomas Veerman 
165357f1050SThomas Veerman 	strcpy (&action_array[action_index], new_text);
166357f1050SThomas Veerman 
167357f1050SThomas Veerman 	action_index += len;
168357f1050SThomas Veerman }
169357f1050SThomas Veerman 
170357f1050SThomas Veerman 
171357f1050SThomas Veerman /* allocate_array - allocate memory for an integer array of the given size */
172357f1050SThomas Veerman 
allocate_array(size,element_size)173357f1050SThomas Veerman void   *allocate_array (size, element_size)
174357f1050SThomas Veerman      int size;
175357f1050SThomas Veerman      size_t element_size;
176357f1050SThomas Veerman {
177357f1050SThomas Veerman 	register void *mem;
178357f1050SThomas Veerman 	size_t  num_bytes = element_size * size;
179357f1050SThomas Veerman 
180357f1050SThomas Veerman 	mem = flex_alloc (num_bytes);
181357f1050SThomas Veerman 	if (!mem)
182357f1050SThomas Veerman 		flexfatal (_
183357f1050SThomas Veerman 			   ("memory allocation failed in allocate_array()"));
184357f1050SThomas Veerman 
185357f1050SThomas Veerman 	return mem;
186357f1050SThomas Veerman }
187357f1050SThomas Veerman 
188357f1050SThomas Veerman 
189357f1050SThomas Veerman /* all_lower - true if a string is all lower-case */
190357f1050SThomas Veerman 
all_lower(str)191357f1050SThomas Veerman int all_lower (str)
192357f1050SThomas Veerman      register char *str;
193357f1050SThomas Veerman {
194357f1050SThomas Veerman 	while (*str) {
195357f1050SThomas Veerman 		if (!isascii ((Char) * str) || !islower ((Char) * str))
196357f1050SThomas Veerman 			return 0;
197357f1050SThomas Veerman 		++str;
198357f1050SThomas Veerman 	}
199357f1050SThomas Veerman 
200357f1050SThomas Veerman 	return 1;
201357f1050SThomas Veerman }
202357f1050SThomas Veerman 
203357f1050SThomas Veerman 
204357f1050SThomas Veerman /* all_upper - true if a string is all upper-case */
205357f1050SThomas Veerman 
all_upper(str)206357f1050SThomas Veerman int all_upper (str)
207357f1050SThomas Veerman      register char *str;
208357f1050SThomas Veerman {
209357f1050SThomas Veerman 	while (*str) {
210357f1050SThomas Veerman 		if (!isascii ((Char) * str) || !isupper ((Char) * str))
211357f1050SThomas Veerman 			return 0;
212357f1050SThomas Veerman 		++str;
213357f1050SThomas Veerman 	}
214357f1050SThomas Veerman 
215357f1050SThomas Veerman 	return 1;
216357f1050SThomas Veerman }
217357f1050SThomas Veerman 
218357f1050SThomas Veerman 
21984d9c625SLionel Sambuc /* intcmp - compares two integers for use by qsort. */
220357f1050SThomas Veerman 
intcmp(const void * a,const void * b)22184d9c625SLionel Sambuc int intcmp (const void *a, const void *b)
222357f1050SThomas Veerman {
22384d9c625SLionel Sambuc   return *(const int *) a - *(const int *) b;
224357f1050SThomas Veerman }
225357f1050SThomas Veerman 
226357f1050SThomas Veerman 
227357f1050SThomas Veerman /* check_char - checks a character to make sure it's within the range
228357f1050SThomas Veerman  *		we're expecting.  If not, generates fatal error message
229357f1050SThomas Veerman  *		and exits.
230357f1050SThomas Veerman  */
231357f1050SThomas Veerman 
check_char(c)232357f1050SThomas Veerman void check_char (c)
233357f1050SThomas Veerman      int c;
234357f1050SThomas Veerman {
235357f1050SThomas Veerman 	if (c >= CSIZE)
236357f1050SThomas Veerman 		lerrsf (_("bad character '%s' detected in check_char()"),
237357f1050SThomas Veerman 			readable_form (c));
238357f1050SThomas Veerman 
239357f1050SThomas Veerman 	if (c >= csize)
240357f1050SThomas Veerman 		lerrsf (_
241357f1050SThomas Veerman 			("scanner requires -8 flag to use the character %s"),
242357f1050SThomas Veerman 			readable_form (c));
243357f1050SThomas Veerman }
244357f1050SThomas Veerman 
245357f1050SThomas Veerman 
246357f1050SThomas Veerman 
247357f1050SThomas Veerman /* clower - replace upper-case letter to lower-case */
248357f1050SThomas Veerman 
clower(c)249357f1050SThomas Veerman Char clower (c)
250357f1050SThomas Veerman      register int c;
251357f1050SThomas Veerman {
252357f1050SThomas Veerman 	return (Char) ((isascii (c) && isupper (c)) ? tolower (c) : c);
253357f1050SThomas Veerman }
254357f1050SThomas Veerman 
255357f1050SThomas Veerman 
256357f1050SThomas Veerman /* copy_string - returns a dynamically allocated copy of a string */
257357f1050SThomas Veerman 
copy_string(str)258357f1050SThomas Veerman char   *copy_string (str)
259357f1050SThomas Veerman      register const char *str;
260357f1050SThomas Veerman {
261357f1050SThomas Veerman 	register const char *c1;
262357f1050SThomas Veerman 	register char *c2;
263357f1050SThomas Veerman 	char   *copy;
264357f1050SThomas Veerman 	unsigned int size;
265357f1050SThomas Veerman 
266357f1050SThomas Veerman 	/* find length */
267357f1050SThomas Veerman 	for (c1 = str; *c1; ++c1) ;
268357f1050SThomas Veerman 
269357f1050SThomas Veerman 	size = (c1 - str + 1) * sizeof (char);
270357f1050SThomas Veerman 
271357f1050SThomas Veerman 	copy = (char *) flex_alloc (size);
272357f1050SThomas Veerman 
273357f1050SThomas Veerman 	if (copy == NULL)
274357f1050SThomas Veerman 		flexfatal (_("dynamic memory failure in copy_string()"));
275357f1050SThomas Veerman 
276357f1050SThomas Veerman 	for (c2 = copy; (*c2++ = *str++) != 0;) ;
277357f1050SThomas Veerman 
278357f1050SThomas Veerman 	return copy;
279357f1050SThomas Veerman }
280357f1050SThomas Veerman 
281357f1050SThomas Veerman 
282357f1050SThomas Veerman /* copy_unsigned_string -
283357f1050SThomas Veerman  *    returns a dynamically allocated copy of a (potentially) unsigned string
284357f1050SThomas Veerman  */
285357f1050SThomas Veerman 
copy_unsigned_string(str)286357f1050SThomas Veerman Char   *copy_unsigned_string (str)
287357f1050SThomas Veerman      register Char *str;
288357f1050SThomas Veerman {
289357f1050SThomas Veerman 	register Char *c;
290357f1050SThomas Veerman 	Char   *copy;
291357f1050SThomas Veerman 
292357f1050SThomas Veerman 	/* find length */
293357f1050SThomas Veerman 	for (c = str; *c; ++c) ;
294357f1050SThomas Veerman 
295357f1050SThomas Veerman 	copy = allocate_Character_array (c - str + 1);
296357f1050SThomas Veerman 
297357f1050SThomas Veerman 	for (c = copy; (*c++ = *str++) != 0;) ;
298357f1050SThomas Veerman 
299357f1050SThomas Veerman 	return copy;
300357f1050SThomas Veerman }
301357f1050SThomas Veerman 
302357f1050SThomas Veerman 
30384d9c625SLionel Sambuc /* cclcmp - compares two characters for use by qsort with '\0' sorting last. */
304357f1050SThomas Veerman 
cclcmp(const void * a,const void * b)30584d9c625SLionel Sambuc int cclcmp (const void *a, const void *b)
306357f1050SThomas Veerman {
30784d9c625SLionel Sambuc   if (!*(const Char *) a)
30884d9c625SLionel Sambuc 	return 1;
30984d9c625SLionel Sambuc   else
31084d9c625SLionel Sambuc 	if (!*(const Char *) b)
31184d9c625SLionel Sambuc 	  return - 1;
31284d9c625SLionel Sambuc 	else
31384d9c625SLionel Sambuc 	  return *(const Char *) a - *(const Char *) b;
314357f1050SThomas Veerman }
315357f1050SThomas Veerman 
316357f1050SThomas Veerman 
317357f1050SThomas Veerman /* dataend - finish up a block of data declarations */
318357f1050SThomas Veerman 
dataend()319357f1050SThomas Veerman void dataend ()
320357f1050SThomas Veerman {
321357f1050SThomas Veerman 	/* short circuit any output */
322357f1050SThomas Veerman 	if (gentables) {
323357f1050SThomas Veerman 
324357f1050SThomas Veerman 		if (datapos > 0)
325357f1050SThomas Veerman 			dataflush ();
326357f1050SThomas Veerman 
327357f1050SThomas Veerman 		/* add terminator for initialization; { for vi */
328357f1050SThomas Veerman 		outn ("    } ;\n");
329357f1050SThomas Veerman 	}
330357f1050SThomas Veerman 	dataline = 0;
331357f1050SThomas Veerman 	datapos = 0;
332357f1050SThomas Veerman }
333357f1050SThomas Veerman 
334357f1050SThomas Veerman 
335357f1050SThomas Veerman /* dataflush - flush generated data statements */
336357f1050SThomas Veerman 
dataflush()337357f1050SThomas Veerman void dataflush ()
338357f1050SThomas Veerman {
339357f1050SThomas Veerman 	/* short circuit any output */
340357f1050SThomas Veerman 	if (!gentables)
341357f1050SThomas Veerman 		return;
342357f1050SThomas Veerman 
343357f1050SThomas Veerman 	outc ('\n');
344357f1050SThomas Veerman 
345357f1050SThomas Veerman 	if (++dataline >= NUMDATALINES) {
346357f1050SThomas Veerman 		/* Put out a blank line so that the table is grouped into
347357f1050SThomas Veerman 		 * large blocks that enable the user to find elements easily.
348357f1050SThomas Veerman 		 */
349357f1050SThomas Veerman 		outc ('\n');
350357f1050SThomas Veerman 		dataline = 0;
351357f1050SThomas Veerman 	}
352357f1050SThomas Veerman 
353357f1050SThomas Veerman 	/* Reset the number of characters written on the current line. */
354357f1050SThomas Veerman 	datapos = 0;
355357f1050SThomas Veerman }
356357f1050SThomas Veerman 
357357f1050SThomas Veerman 
358357f1050SThomas Veerman /* flexerror - report an error message and terminate */
359357f1050SThomas Veerman 
flexerror(msg)360357f1050SThomas Veerman void flexerror (msg)
361357f1050SThomas Veerman      const char *msg;
362357f1050SThomas Veerman {
363357f1050SThomas Veerman 	fprintf (stderr, "%s: %s\n", program_name, msg);
364357f1050SThomas Veerman 	flexend (1);
365357f1050SThomas Veerman }
366357f1050SThomas Veerman 
367357f1050SThomas Veerman 
368357f1050SThomas Veerman /* flexfatal - report a fatal error message and terminate */
369357f1050SThomas Veerman 
flexfatal(msg)370357f1050SThomas Veerman void flexfatal (msg)
371357f1050SThomas Veerman      const char *msg;
372357f1050SThomas Veerman {
373357f1050SThomas Veerman 	fprintf (stderr, _("%s: fatal internal error, %s\n"),
374357f1050SThomas Veerman 		 program_name, msg);
375357f1050SThomas Veerman 	FLEX_EXIT (1);
376357f1050SThomas Veerman }
377357f1050SThomas Veerman 
378357f1050SThomas Veerman 
379357f1050SThomas Veerman /* htoi - convert a hexadecimal digit string to an integer value */
380357f1050SThomas Veerman 
htoi(str)381357f1050SThomas Veerman int htoi (str)
382357f1050SThomas Veerman      Char str[];
383357f1050SThomas Veerman {
384357f1050SThomas Veerman 	unsigned int result;
385357f1050SThomas Veerman 
386357f1050SThomas Veerman 	(void) sscanf ((char *) str, "%x", &result);
387357f1050SThomas Veerman 
388357f1050SThomas Veerman 	return result;
389357f1050SThomas Veerman }
390357f1050SThomas Veerman 
391357f1050SThomas Veerman 
392357f1050SThomas Veerman /* lerrif - report an error message formatted with one integer argument */
393357f1050SThomas Veerman 
lerrif(msg,arg)394357f1050SThomas Veerman void lerrif (msg, arg)
395357f1050SThomas Veerman      const char *msg;
396357f1050SThomas Veerman      int arg;
397357f1050SThomas Veerman {
398357f1050SThomas Veerman 	char    errmsg[MAXLINE];
399357f1050SThomas Veerman 
400357f1050SThomas Veerman 	snprintf (errmsg, sizeof(errmsg), msg, arg);
401357f1050SThomas Veerman 	flexerror (errmsg);
402357f1050SThomas Veerman }
403357f1050SThomas Veerman 
404357f1050SThomas Veerman 
405357f1050SThomas Veerman /* lerrsf - report an error message formatted with one string argument */
406357f1050SThomas Veerman 
lerrsf(msg,arg)407357f1050SThomas Veerman void lerrsf (msg, arg)
408357f1050SThomas Veerman 	const char *msg, arg[];
409357f1050SThomas Veerman {
410357f1050SThomas Veerman 	char    errmsg[MAXLINE];
411357f1050SThomas Veerman 
41284d9c625SLionel Sambuc 	snprintf (errmsg, sizeof(errmsg)-1, msg, arg);
41384d9c625SLionel Sambuc 	errmsg[sizeof(errmsg)-1] = 0; /* ensure NULL termination */
414357f1050SThomas Veerman 	flexerror (errmsg);
415357f1050SThomas Veerman }
416357f1050SThomas Veerman 
417357f1050SThomas Veerman 
41884d9c625SLionel Sambuc /* lerrsf_fatal - as lerrsf, but call flexfatal */
41984d9c625SLionel Sambuc 
lerrsf_fatal(const char * msg,...)42084d9c625SLionel Sambuc void lerrsf_fatal (const char *msg, ...)
42184d9c625SLionel Sambuc {
42284d9c625SLionel Sambuc 	char    errmsg[MAXLINE];
42384d9c625SLionel Sambuc 	va_list ap;
42484d9c625SLionel Sambuc 
42584d9c625SLionel Sambuc 	va_start(ap, msg);
42684d9c625SLionel Sambuc 	vsnprintf (errmsg, sizeof(errmsg)-1, msg, ap);
42784d9c625SLionel Sambuc 	va_end(ap);
42884d9c625SLionel Sambuc 	errmsg[sizeof(errmsg)-1] = 0; /* ensure NULL termination */
42984d9c625SLionel Sambuc 	flexfatal (errmsg);
43084d9c625SLionel Sambuc }
43184d9c625SLionel Sambuc 
43284d9c625SLionel Sambuc 
433357f1050SThomas Veerman /* line_directive_out - spit out a "#line" statement */
434357f1050SThomas Veerman 
line_directive_out(output_file,do_infile)435357f1050SThomas Veerman void line_directive_out (output_file, do_infile)
436357f1050SThomas Veerman      FILE   *output_file;
437357f1050SThomas Veerman      int do_infile;
438357f1050SThomas Veerman {
439357f1050SThomas Veerman 	char    directive[MAXLINE], filename[MAXLINE];
440357f1050SThomas Veerman 	char   *s1, *s2, *s3;
441357f1050SThomas Veerman 	static const char line_fmt[] = "#line %d \"%s\"\n";
442357f1050SThomas Veerman 
443357f1050SThomas Veerman 	if (!gen_line_dirs)
444357f1050SThomas Veerman 		return;
445357f1050SThomas Veerman 
446357f1050SThomas Veerman 	s1 = do_infile ? infilename : "M4_YY_OUTFILE_NAME";
447357f1050SThomas Veerman 
448357f1050SThomas Veerman 	if (do_infile && !s1)
449357f1050SThomas Veerman         s1 = "<stdin>";
450357f1050SThomas Veerman 
451357f1050SThomas Veerman 	s2 = filename;
452357f1050SThomas Veerman 	s3 = &filename[sizeof (filename) - 2];
453357f1050SThomas Veerman 
454357f1050SThomas Veerman 	while (s2 < s3 && *s1) {
455357f1050SThomas Veerman 		if (*s1 == '\\')
456357f1050SThomas Veerman 			/* Escape the '\' */
457357f1050SThomas Veerman 			*s2++ = '\\';
458357f1050SThomas Veerman 
459357f1050SThomas Veerman 		*s2++ = *s1++;
460357f1050SThomas Veerman 	}
461357f1050SThomas Veerman 
462357f1050SThomas Veerman 	*s2 = '\0';
463357f1050SThomas Veerman 
464357f1050SThomas Veerman 	if (do_infile)
465357f1050SThomas Veerman 		snprintf (directive, sizeof(directive), line_fmt, linenum, filename);
466357f1050SThomas Veerman 	else {
46784d9c625SLionel Sambuc 		snprintf (directive, sizeof(directive), line_fmt, 0, filename);
468357f1050SThomas Veerman 	}
469357f1050SThomas Veerman 
470357f1050SThomas Veerman 	/* If output_file is nil then we should put the directive in
471357f1050SThomas Veerman 	 * the accumulated actions.
472357f1050SThomas Veerman 	 */
473357f1050SThomas Veerman 	if (output_file) {
474357f1050SThomas Veerman 		fputs (directive, output_file);
475357f1050SThomas Veerman 	}
476357f1050SThomas Veerman 	else
477357f1050SThomas Veerman 		add_action (directive);
478357f1050SThomas Veerman }
479357f1050SThomas Veerman 
480357f1050SThomas Veerman 
481357f1050SThomas Veerman /* mark_defs1 - mark the current position in the action array as
482357f1050SThomas Veerman  *               representing where the user's section 1 definitions end
483357f1050SThomas Veerman  *		 and the prolog begins
484357f1050SThomas Veerman  */
mark_defs1()485357f1050SThomas Veerman void mark_defs1 ()
486357f1050SThomas Veerman {
487357f1050SThomas Veerman 	defs1_offset = 0;
488357f1050SThomas Veerman 	action_array[action_index++] = '\0';
489357f1050SThomas Veerman 	action_offset = prolog_offset = action_index;
490357f1050SThomas Veerman 	action_array[action_index] = '\0';
491357f1050SThomas Veerman }
492357f1050SThomas Veerman 
493357f1050SThomas Veerman 
494357f1050SThomas Veerman /* mark_prolog - mark the current position in the action array as
495357f1050SThomas Veerman  *               representing the end of the action prolog
496357f1050SThomas Veerman  */
mark_prolog()497357f1050SThomas Veerman void mark_prolog ()
498357f1050SThomas Veerman {
499357f1050SThomas Veerman 	action_array[action_index++] = '\0';
500357f1050SThomas Veerman 	action_offset = action_index;
501357f1050SThomas Veerman 	action_array[action_index] = '\0';
502357f1050SThomas Veerman }
503357f1050SThomas Veerman 
504357f1050SThomas Veerman 
505357f1050SThomas Veerman /* mk2data - generate a data statement for a two-dimensional array
506357f1050SThomas Veerman  *
507357f1050SThomas Veerman  * Generates a data statement initializing the current 2-D array to "value".
508357f1050SThomas Veerman  */
mk2data(value)509357f1050SThomas Veerman void mk2data (value)
510357f1050SThomas Veerman      int value;
511357f1050SThomas Veerman {
512357f1050SThomas Veerman 	/* short circuit any output */
513357f1050SThomas Veerman 	if (!gentables)
514357f1050SThomas Veerman 		return;
515357f1050SThomas Veerman 
516357f1050SThomas Veerman 	if (datapos >= NUMDATAITEMS) {
517357f1050SThomas Veerman 		outc (',');
518357f1050SThomas Veerman 		dataflush ();
519357f1050SThomas Veerman 	}
520357f1050SThomas Veerman 
521357f1050SThomas Veerman 	if (datapos == 0)
522357f1050SThomas Veerman 		/* Indent. */
523357f1050SThomas Veerman 		out ("    ");
524357f1050SThomas Veerman 
525357f1050SThomas Veerman 	else
526357f1050SThomas Veerman 		outc (',');
527357f1050SThomas Veerman 
528357f1050SThomas Veerman 	++datapos;
529357f1050SThomas Veerman 
530357f1050SThomas Veerman 	out_dec ("%5d", value);
531357f1050SThomas Veerman }
532357f1050SThomas Veerman 
533357f1050SThomas Veerman 
534357f1050SThomas Veerman /* mkdata - generate a data statement
535357f1050SThomas Veerman  *
536357f1050SThomas Veerman  * Generates a data statement initializing the current array element to
537357f1050SThomas Veerman  * "value".
538357f1050SThomas Veerman  */
mkdata(value)539357f1050SThomas Veerman void mkdata (value)
540357f1050SThomas Veerman      int value;
541357f1050SThomas Veerman {
542357f1050SThomas Veerman 	/* short circuit any output */
543357f1050SThomas Veerman 	if (!gentables)
544357f1050SThomas Veerman 		return;
545357f1050SThomas Veerman 
546357f1050SThomas Veerman 	if (datapos >= NUMDATAITEMS) {
547357f1050SThomas Veerman 		outc (',');
548357f1050SThomas Veerman 		dataflush ();
549357f1050SThomas Veerman 	}
550357f1050SThomas Veerman 
551357f1050SThomas Veerman 	if (datapos == 0)
552357f1050SThomas Veerman 		/* Indent. */
553357f1050SThomas Veerman 		out ("    ");
554357f1050SThomas Veerman 	else
555357f1050SThomas Veerman 		outc (',');
556357f1050SThomas Veerman 
557357f1050SThomas Veerman 	++datapos;
558357f1050SThomas Veerman 
559357f1050SThomas Veerman 	out_dec ("%5d", value);
560357f1050SThomas Veerman }
561357f1050SThomas Veerman 
562357f1050SThomas Veerman 
563357f1050SThomas Veerman /* myctoi - return the integer represented by a string of digits */
564357f1050SThomas Veerman 
myctoi(array)565357f1050SThomas Veerman int myctoi (array)
566357f1050SThomas Veerman      const char *array;
567357f1050SThomas Veerman {
568357f1050SThomas Veerman 	int     val = 0;
569357f1050SThomas Veerman 
570357f1050SThomas Veerman 	(void) sscanf (array, "%d", &val);
571357f1050SThomas Veerman 
572357f1050SThomas Veerman 	return val;
573357f1050SThomas Veerman }
574357f1050SThomas Veerman 
575357f1050SThomas Veerman 
576357f1050SThomas Veerman /* myesc - return character corresponding to escape sequence */
577357f1050SThomas Veerman 
myesc(array)578357f1050SThomas Veerman Char myesc (array)
579357f1050SThomas Veerman      Char array[];
580357f1050SThomas Veerman {
581357f1050SThomas Veerman 	Char    c, esc_char;
582357f1050SThomas Veerman 
583357f1050SThomas Veerman 	switch (array[1]) {
584357f1050SThomas Veerman 	case 'b':
585357f1050SThomas Veerman 		return '\b';
586357f1050SThomas Veerman 	case 'f':
587357f1050SThomas Veerman 		return '\f';
588357f1050SThomas Veerman 	case 'n':
589357f1050SThomas Veerman 		return '\n';
590357f1050SThomas Veerman 	case 'r':
591357f1050SThomas Veerman 		return '\r';
592357f1050SThomas Veerman 	case 't':
593357f1050SThomas Veerman 		return '\t';
594357f1050SThomas Veerman 
595357f1050SThomas Veerman #if defined (__STDC__)
596357f1050SThomas Veerman 	case 'a':
597357f1050SThomas Veerman 		return '\a';
598357f1050SThomas Veerman 	case 'v':
599357f1050SThomas Veerman 		return '\v';
600357f1050SThomas Veerman #else
601357f1050SThomas Veerman 	case 'a':
602357f1050SThomas Veerman 		return '\007';
603357f1050SThomas Veerman 	case 'v':
604357f1050SThomas Veerman 		return '\013';
605357f1050SThomas Veerman #endif
606357f1050SThomas Veerman 
607357f1050SThomas Veerman 	case '0':
608357f1050SThomas Veerman 	case '1':
609357f1050SThomas Veerman 	case '2':
610357f1050SThomas Veerman 	case '3':
611357f1050SThomas Veerman 	case '4':
612357f1050SThomas Veerman 	case '5':
613357f1050SThomas Veerman 	case '6':
614357f1050SThomas Veerman 	case '7':
615357f1050SThomas Veerman 		{		/* \<octal> */
616357f1050SThomas Veerman 			int     sptr = 1;
617357f1050SThomas Veerman 
618357f1050SThomas Veerman 			while (isascii (array[sptr]) &&
619357f1050SThomas Veerman 			       isdigit (array[sptr]))
620357f1050SThomas Veerman 				/* Don't increment inside loop control
621357f1050SThomas Veerman 				 * because if isdigit() is a macro it might
622357f1050SThomas Veerman 				 * expand into multiple increments ...
623357f1050SThomas Veerman 				 */
624357f1050SThomas Veerman 				++sptr;
625357f1050SThomas Veerman 
626357f1050SThomas Veerman 			c = array[sptr];
627357f1050SThomas Veerman 			array[sptr] = '\0';
628357f1050SThomas Veerman 
629357f1050SThomas Veerman 			esc_char = otoi (array + 1);
630357f1050SThomas Veerman 
631357f1050SThomas Veerman 			array[sptr] = c;
632357f1050SThomas Veerman 
633357f1050SThomas Veerman 			return esc_char;
634357f1050SThomas Veerman 		}
635357f1050SThomas Veerman 
636357f1050SThomas Veerman 	case 'x':
637357f1050SThomas Veerman 		{		/* \x<hex> */
638357f1050SThomas Veerman 			int     sptr = 2;
639357f1050SThomas Veerman 
640357f1050SThomas Veerman 			while (isascii (array[sptr]) &&
64184d9c625SLionel Sambuc 			       isxdigit (array[sptr]))
642357f1050SThomas Veerman 				/* Don't increment inside loop control
643357f1050SThomas Veerman 				 * because if isdigit() is a macro it might
644357f1050SThomas Veerman 				 * expand into multiple increments ...
645357f1050SThomas Veerman 				 */
646357f1050SThomas Veerman 				++sptr;
647357f1050SThomas Veerman 
648357f1050SThomas Veerman 			c = array[sptr];
649357f1050SThomas Veerman 			array[sptr] = '\0';
650357f1050SThomas Veerman 
651357f1050SThomas Veerman 			esc_char = htoi (array + 2);
652357f1050SThomas Veerman 
653357f1050SThomas Veerman 			array[sptr] = c;
654357f1050SThomas Veerman 
655357f1050SThomas Veerman 			return esc_char;
656357f1050SThomas Veerman 		}
657357f1050SThomas Veerman 
658357f1050SThomas Veerman 	default:
659357f1050SThomas Veerman 		return array[1];
660357f1050SThomas Veerman 	}
661357f1050SThomas Veerman }
662357f1050SThomas Veerman 
663357f1050SThomas Veerman 
664357f1050SThomas Veerman /* otoi - convert an octal digit string to an integer value */
665357f1050SThomas Veerman 
otoi(str)666357f1050SThomas Veerman int otoi (str)
667357f1050SThomas Veerman      Char str[];
668357f1050SThomas Veerman {
669357f1050SThomas Veerman 	unsigned int result;
670357f1050SThomas Veerman 
671357f1050SThomas Veerman 	(void) sscanf ((char *) str, "%o", &result);
672357f1050SThomas Veerman 	return result;
673357f1050SThomas Veerman }
674357f1050SThomas Veerman 
675357f1050SThomas Veerman 
676357f1050SThomas Veerman /* out - various flavors of outputing a (possibly formatted) string for the
677357f1050SThomas Veerman  *	 generated scanner, keeping track of the line count.
678357f1050SThomas Veerman  */
679357f1050SThomas Veerman 
out(str)680357f1050SThomas Veerman void out (str)
681357f1050SThomas Veerman      const char *str;
682357f1050SThomas Veerman {
683357f1050SThomas Veerman 	fputs (str, stdout);
684357f1050SThomas Veerman }
685357f1050SThomas Veerman 
out_dec(fmt,n)686357f1050SThomas Veerman void out_dec (fmt, n)
687357f1050SThomas Veerman      const char *fmt;
688357f1050SThomas Veerman      int n;
689357f1050SThomas Veerman {
690357f1050SThomas Veerman 	fprintf (stdout, fmt, n);
691357f1050SThomas Veerman }
692357f1050SThomas Veerman 
out_dec2(fmt,n1,n2)693357f1050SThomas Veerman void out_dec2 (fmt, n1, n2)
694357f1050SThomas Veerman      const char *fmt;
695357f1050SThomas Veerman      int n1, n2;
696357f1050SThomas Veerman {
697357f1050SThomas Veerman 	fprintf (stdout, fmt, n1, n2);
698357f1050SThomas Veerman }
699357f1050SThomas Veerman 
out_hex(fmt,x)700357f1050SThomas Veerman void out_hex (fmt, x)
701357f1050SThomas Veerman      const char *fmt;
702357f1050SThomas Veerman      unsigned int x;
703357f1050SThomas Veerman {
704357f1050SThomas Veerman 	fprintf (stdout, fmt, x);
705357f1050SThomas Veerman }
706357f1050SThomas Veerman 
out_str(fmt,str)707357f1050SThomas Veerman void out_str (fmt, str)
708357f1050SThomas Veerman      const char *fmt, str[];
709357f1050SThomas Veerman {
710357f1050SThomas Veerman 	fprintf (stdout,fmt, str);
711357f1050SThomas Veerman }
712357f1050SThomas Veerman 
out_str3(fmt,s1,s2,s3)713357f1050SThomas Veerman void out_str3 (fmt, s1, s2, s3)
714357f1050SThomas Veerman      const char *fmt, s1[], s2[], s3[];
715357f1050SThomas Veerman {
716357f1050SThomas Veerman 	fprintf (stdout,fmt, s1, s2, s3);
717357f1050SThomas Veerman }
718357f1050SThomas Veerman 
out_str_dec(fmt,str,n)719357f1050SThomas Veerman void out_str_dec (fmt, str, n)
720357f1050SThomas Veerman      const char *fmt, str[];
721357f1050SThomas Veerman      int n;
722357f1050SThomas Veerman {
723357f1050SThomas Veerman 	fprintf (stdout,fmt, str, n);
724357f1050SThomas Veerman }
725357f1050SThomas Veerman 
outc(c)726357f1050SThomas Veerman void outc (c)
727357f1050SThomas Veerman      int c;
728357f1050SThomas Veerman {
729357f1050SThomas Veerman 	fputc (c, stdout);
730357f1050SThomas Veerman }
731357f1050SThomas Veerman 
outn(str)732357f1050SThomas Veerman void outn (str)
733357f1050SThomas Veerman      const char *str;
734357f1050SThomas Veerman {
735357f1050SThomas Veerman 	fputs (str,stdout);
736357f1050SThomas Veerman     fputc('\n',stdout);
737357f1050SThomas Veerman }
738357f1050SThomas Veerman 
739357f1050SThomas Veerman /** Print "m4_define( [[def]], [[val]])m4_dnl\n".
740357f1050SThomas Veerman  * @param def The m4 symbol to define.
741357f1050SThomas Veerman  * @param val The definition; may be NULL.
742357f1050SThomas Veerman  * @return buf
743357f1050SThomas Veerman  */
out_m4_define(const char * def,const char * val)744357f1050SThomas Veerman void out_m4_define (const char* def, const char* val)
745357f1050SThomas Veerman {
746357f1050SThomas Veerman     const char * fmt = "m4_define( [[%s]], [[%s]])m4_dnl\n";
747357f1050SThomas Veerman     fprintf(stdout, fmt, def, val?val:"");
748357f1050SThomas Veerman }
749357f1050SThomas Veerman 
750357f1050SThomas Veerman 
751357f1050SThomas Veerman /* readable_form - return the the human-readable form of a character
752357f1050SThomas Veerman  *
753357f1050SThomas Veerman  * The returned string is in static storage.
754357f1050SThomas Veerman  */
755357f1050SThomas Veerman 
readable_form(c)756357f1050SThomas Veerman char   *readable_form (c)
757357f1050SThomas Veerman      register int c;
758357f1050SThomas Veerman {
759357f1050SThomas Veerman 	static char rform[10];
760357f1050SThomas Veerman 
761357f1050SThomas Veerman 	if ((c >= 0 && c < 32) || c >= 127) {
762357f1050SThomas Veerman 		switch (c) {
763357f1050SThomas Veerman 		case '\b':
764357f1050SThomas Veerman 			return "\\b";
765357f1050SThomas Veerman 		case '\f':
766357f1050SThomas Veerman 			return "\\f";
767357f1050SThomas Veerman 		case '\n':
768357f1050SThomas Veerman 			return "\\n";
769357f1050SThomas Veerman 		case '\r':
770357f1050SThomas Veerman 			return "\\r";
771357f1050SThomas Veerman 		case '\t':
772357f1050SThomas Veerman 			return "\\t";
773357f1050SThomas Veerman 
774357f1050SThomas Veerman #if defined (__STDC__)
775357f1050SThomas Veerman 		case '\a':
776357f1050SThomas Veerman 			return "\\a";
777357f1050SThomas Veerman 		case '\v':
778357f1050SThomas Veerman 			return "\\v";
779357f1050SThomas Veerman #endif
780357f1050SThomas Veerman 
781357f1050SThomas Veerman 		default:
782357f1050SThomas Veerman 			snprintf (rform, sizeof(rform), "\\%.3o", (unsigned int) c);
783357f1050SThomas Veerman 			return rform;
784357f1050SThomas Veerman 		}
785357f1050SThomas Veerman 	}
786357f1050SThomas Veerman 
787357f1050SThomas Veerman 	else if (c == ' ')
788357f1050SThomas Veerman 		return "' '";
789357f1050SThomas Veerman 
790357f1050SThomas Veerman 	else {
791357f1050SThomas Veerman 		rform[0] = c;
792357f1050SThomas Veerman 		rform[1] = '\0';
793357f1050SThomas Veerman 
794357f1050SThomas Veerman 		return rform;
795357f1050SThomas Veerman 	}
796357f1050SThomas Veerman }
797357f1050SThomas Veerman 
798357f1050SThomas Veerman 
799357f1050SThomas Veerman /* reallocate_array - increase the size of a dynamic array */
800357f1050SThomas Veerman 
reallocate_array(array,size,element_size)801357f1050SThomas Veerman void   *reallocate_array (array, size, element_size)
802357f1050SThomas Veerman      void   *array;
803357f1050SThomas Veerman      int size;
804357f1050SThomas Veerman      size_t element_size;
805357f1050SThomas Veerman {
806357f1050SThomas Veerman 	register void *new_array;
807357f1050SThomas Veerman 	size_t  num_bytes = element_size * size;
808357f1050SThomas Veerman 
809357f1050SThomas Veerman 	new_array = flex_realloc (array, num_bytes);
810357f1050SThomas Veerman 	if (!new_array)
811357f1050SThomas Veerman 		flexfatal (_("attempt to increase array size failed"));
812357f1050SThomas Veerman 
813357f1050SThomas Veerman 	return new_array;
814357f1050SThomas Veerman }
815357f1050SThomas Veerman 
816357f1050SThomas Veerman 
817357f1050SThomas Veerman /* skelout - write out one section of the skeleton file
818357f1050SThomas Veerman  *
819357f1050SThomas Veerman  * Description
820357f1050SThomas Veerman  *    Copies skelfile or skel array to stdout until a line beginning with
821357f1050SThomas Veerman  *    "%%" or EOF is found.
822357f1050SThomas Veerman  */
skelout()823357f1050SThomas Veerman void skelout ()
824357f1050SThomas Veerman {
825357f1050SThomas Veerman 	char    buf_storage[MAXLINE];
826357f1050SThomas Veerman 	char   *buf = buf_storage;
827357f1050SThomas Veerman 	bool   do_copy = true;
828357f1050SThomas Veerman 
829357f1050SThomas Veerman     /* "reset" the state by clearing the buffer and pushing a '1' */
830357f1050SThomas Veerman     if(sko_len > 0)
831357f1050SThomas Veerman         sko_peek(&do_copy);
832357f1050SThomas Veerman     sko_len = 0;
833357f1050SThomas Veerman     sko_push(do_copy=true);
834357f1050SThomas Veerman 
835357f1050SThomas Veerman 
836357f1050SThomas Veerman 	/* Loop pulling lines either from the skelfile, if we're using
837357f1050SThomas Veerman 	 * one, or from the skel[] array.
838357f1050SThomas Veerman 	 */
839357f1050SThomas Veerman 	while (skelfile ?
840357f1050SThomas Veerman 	       (fgets (buf, MAXLINE, skelfile) != NULL) :
841357f1050SThomas Veerman 	       ((buf = (char *) skel[skel_ind++]) != 0)) {
842357f1050SThomas Veerman 
843357f1050SThomas Veerman 		if (skelfile)
844357f1050SThomas Veerman 			chomp (buf);
845357f1050SThomas Veerman 
846357f1050SThomas Veerman 		/* copy from skel array */
847357f1050SThomas Veerman 		if (buf[0] == '%') {	/* control line */
848357f1050SThomas Veerman 			/* print the control line as a comment. */
849357f1050SThomas Veerman 			if (ddebug && buf[1] != '#') {
850357f1050SThomas Veerman 				if (buf[strlen (buf) - 1] == '\\')
851357f1050SThomas Veerman 					out_str ("/* %s */\\\n", buf);
852357f1050SThomas Veerman 				else
853357f1050SThomas Veerman 					out_str ("/* %s */\n", buf);
854357f1050SThomas Veerman 			}
855357f1050SThomas Veerman 
856357f1050SThomas Veerman 			/* We've been accused of using cryptic markers in the skel.
857357f1050SThomas Veerman 			 * So we'll use emacs-style-hyphenated-commands.
858357f1050SThomas Veerman              * We might consider a hash if this if-else-if-else
859357f1050SThomas Veerman              * chain gets too large.
860357f1050SThomas Veerman 			 */
861357f1050SThomas Veerman #define cmd_match(s) (strncmp(buf,(s),strlen(s))==0)
862357f1050SThomas Veerman 
863357f1050SThomas Veerman 			if (buf[1] == '%') {
864357f1050SThomas Veerman 				/* %% is a break point for skelout() */
865357f1050SThomas Veerman 				return;
866357f1050SThomas Veerman 			}
867357f1050SThomas Veerman             else if (cmd_match (CMD_PUSH)){
868357f1050SThomas Veerman                 sko_push(do_copy);
869357f1050SThomas Veerman                 if(ddebug){
870357f1050SThomas Veerman                     out_str("/*(state = (%s) */",do_copy?"true":"false");
871357f1050SThomas Veerman                 }
872357f1050SThomas Veerman                 out_str("%s\n", buf[strlen (buf) - 1] =='\\' ? "\\" : "");
873357f1050SThomas Veerman             }
874357f1050SThomas Veerman             else if (cmd_match (CMD_POP)){
875357f1050SThomas Veerman                 sko_pop(&do_copy);
876357f1050SThomas Veerman                 if(ddebug){
877357f1050SThomas Veerman                     out_str("/*(state = (%s) */",do_copy?"true":"false");
878357f1050SThomas Veerman                 }
879357f1050SThomas Veerman                 out_str("%s\n", buf[strlen (buf) - 1] =='\\' ? "\\" : "");
880357f1050SThomas Veerman             }
881357f1050SThomas Veerman             else if (cmd_match (CMD_IF_REENTRANT)){
882357f1050SThomas Veerman                 sko_push(do_copy);
883357f1050SThomas Veerman                 do_copy = reentrant && do_copy;
884357f1050SThomas Veerman             }
885357f1050SThomas Veerman             else if (cmd_match (CMD_IF_NOT_REENTRANT)){
886357f1050SThomas Veerman                 sko_push(do_copy);
887357f1050SThomas Veerman                 do_copy = !reentrant && do_copy;
888357f1050SThomas Veerman             }
889357f1050SThomas Veerman             else if (cmd_match(CMD_IF_BISON_BRIDGE)){
890357f1050SThomas Veerman                 sko_push(do_copy);
891357f1050SThomas Veerman                 do_copy = bison_bridge_lval && do_copy;
892357f1050SThomas Veerman             }
893357f1050SThomas Veerman             else if (cmd_match(CMD_IF_NOT_BISON_BRIDGE)){
894357f1050SThomas Veerman                 sko_push(do_copy);
895357f1050SThomas Veerman                 do_copy = !bison_bridge_lval && do_copy;
896357f1050SThomas Veerman             }
897357f1050SThomas Veerman             else if (cmd_match (CMD_ENDIF)){
898357f1050SThomas Veerman                 sko_pop(&do_copy);
899357f1050SThomas Veerman             }
900357f1050SThomas Veerman 			else if (cmd_match (CMD_IF_TABLES_SER)) {
901357f1050SThomas Veerman                 do_copy = do_copy && tablesext;
902357f1050SThomas Veerman 			}
903357f1050SThomas Veerman 			else if (cmd_match (CMD_TABLES_YYDMAP)) {
904357f1050SThomas Veerman 				if (tablesext && yydmap_buf.elts)
905357f1050SThomas Veerman 					outn ((char *) (yydmap_buf.elts));
906357f1050SThomas Veerman 			}
907357f1050SThomas Veerman             else if (cmd_match (CMD_DEFINE_YYTABLES)) {
908357f1050SThomas Veerman                 out_str("#define YYTABLES_NAME \"%s\"\n",
909357f1050SThomas Veerman                         tablesname?tablesname:"yytables");
910357f1050SThomas Veerman             }
911357f1050SThomas Veerman 			else if (cmd_match (CMD_IF_CPP_ONLY)) {
912357f1050SThomas Veerman 				/* only for C++ */
913357f1050SThomas Veerman                 sko_push(do_copy);
914357f1050SThomas Veerman 				do_copy = C_plus_plus;
915357f1050SThomas Veerman 			}
916357f1050SThomas Veerman 			else if (cmd_match (CMD_IF_C_ONLY)) {
917357f1050SThomas Veerman 				/* %- only for C */
918357f1050SThomas Veerman                 sko_push(do_copy);
919357f1050SThomas Veerman 				do_copy = !C_plus_plus;
920357f1050SThomas Veerman 			}
921357f1050SThomas Veerman 			else if (cmd_match (CMD_IF_C_OR_CPP)) {
922357f1050SThomas Veerman 				/* %* for C and C++ */
923357f1050SThomas Veerman                 sko_push(do_copy);
924357f1050SThomas Veerman 				do_copy = true;
925357f1050SThomas Veerman 			}
926357f1050SThomas Veerman 			else if (cmd_match (CMD_NOT_FOR_HEADER)) {
927357f1050SThomas Veerman 				/* %c begin linkage-only (non-header) code. */
928357f1050SThomas Veerman 				OUT_BEGIN_CODE ();
929357f1050SThomas Veerman 			}
930357f1050SThomas Veerman 			else if (cmd_match (CMD_OK_FOR_HEADER)) {
931357f1050SThomas Veerman 				/* %e end linkage-only code. */
932357f1050SThomas Veerman 				OUT_END_CODE ();
933357f1050SThomas Veerman 			}
934357f1050SThomas Veerman 			else if (buf[1] == '#') {
935357f1050SThomas Veerman 				/* %# a comment in the skel. ignore. */
936357f1050SThomas Veerman 			}
937357f1050SThomas Veerman 			else {
938357f1050SThomas Veerman 				flexfatal (_("bad line in skeleton file"));
939357f1050SThomas Veerman 			}
940357f1050SThomas Veerman 		}
941357f1050SThomas Veerman 
942357f1050SThomas Veerman 		else if (do_copy)
943357f1050SThomas Veerman             outn (buf);
944357f1050SThomas Veerman 	}			/* end while */
945357f1050SThomas Veerman }
946357f1050SThomas Veerman 
947357f1050SThomas Veerman 
948357f1050SThomas Veerman /* transition_struct_out - output a yy_trans_info structure
949357f1050SThomas Veerman  *
950357f1050SThomas Veerman  * outputs the yy_trans_info structure with the two elements, element_v and
951357f1050SThomas Veerman  * element_n.  Formats the output with spaces and carriage returns.
952357f1050SThomas Veerman  */
953357f1050SThomas Veerman 
transition_struct_out(element_v,element_n)954357f1050SThomas Veerman void transition_struct_out (element_v, element_n)
955357f1050SThomas Veerman      int element_v, element_n;
956357f1050SThomas Veerman {
957357f1050SThomas Veerman 
958357f1050SThomas Veerman 	/* short circuit any output */
959357f1050SThomas Veerman 	if (!gentables)
960357f1050SThomas Veerman 		return;
961357f1050SThomas Veerman 
962357f1050SThomas Veerman 	out_dec2 (" {%4d,%4d },", element_v, element_n);
963357f1050SThomas Veerman 
964357f1050SThomas Veerman 	datapos += TRANS_STRUCT_PRINT_LENGTH;
965357f1050SThomas Veerman 
966357f1050SThomas Veerman 	if (datapos >= 79 - TRANS_STRUCT_PRINT_LENGTH) {
967357f1050SThomas Veerman 		outc ('\n');
968357f1050SThomas Veerman 
969357f1050SThomas Veerman 		if (++dataline % 10 == 0)
970357f1050SThomas Veerman 			outc ('\n');
971357f1050SThomas Veerman 
972357f1050SThomas Veerman 		datapos = 0;
973357f1050SThomas Veerman 	}
974357f1050SThomas Veerman }
975357f1050SThomas Veerman 
976357f1050SThomas Veerman 
977357f1050SThomas Veerman /* The following is only needed when building flex's parser using certain
978357f1050SThomas Veerman  * broken versions of bison.
979357f1050SThomas Veerman  */
yy_flex_xmalloc(size)980357f1050SThomas Veerman void   *yy_flex_xmalloc (size)
981357f1050SThomas Veerman      int size;
982357f1050SThomas Veerman {
983357f1050SThomas Veerman 	void   *result = flex_alloc ((size_t) size);
984357f1050SThomas Veerman 
985357f1050SThomas Veerman 	if (!result)
986357f1050SThomas Veerman 		flexfatal (_
987357f1050SThomas Veerman 			   ("memory allocation failed in yy_flex_xmalloc()"));
988357f1050SThomas Veerman 
989357f1050SThomas Veerman 	return result;
990357f1050SThomas Veerman }
991357f1050SThomas Veerman 
992357f1050SThomas Veerman 
993357f1050SThomas Veerman /* zero_out - set a region of memory to 0
994357f1050SThomas Veerman  *
995357f1050SThomas Veerman  * Sets region_ptr[0] through region_ptr[size_in_bytes - 1] to zero.
996357f1050SThomas Veerman  */
997357f1050SThomas Veerman 
zero_out(region_ptr,size_in_bytes)998357f1050SThomas Veerman void zero_out (region_ptr, size_in_bytes)
999357f1050SThomas Veerman      char   *region_ptr;
1000357f1050SThomas Veerman      size_t size_in_bytes;
1001357f1050SThomas Veerman {
1002357f1050SThomas Veerman 	register char *rp, *rp_end;
1003357f1050SThomas Veerman 
1004357f1050SThomas Veerman 	rp = region_ptr;
1005357f1050SThomas Veerman 	rp_end = region_ptr + size_in_bytes;
1006357f1050SThomas Veerman 
1007357f1050SThomas Veerman 	while (rp < rp_end)
1008357f1050SThomas Veerman 		*rp++ = 0;
1009357f1050SThomas Veerman }
1010357f1050SThomas Veerman 
1011357f1050SThomas Veerman /* Remove all '\n' and '\r' characters, if any, from the end of str.
1012357f1050SThomas Veerman  * str can be any null-terminated string, or NULL.
1013357f1050SThomas Veerman  * returns str. */
chomp(str)1014357f1050SThomas Veerman char   *chomp (str)
1015357f1050SThomas Veerman      char   *str;
1016357f1050SThomas Veerman {
1017357f1050SThomas Veerman 	char   *p = str;
1018357f1050SThomas Veerman 
1019357f1050SThomas Veerman 	if (!str || !*str)	/* s is null or empty string */
1020357f1050SThomas Veerman 		return str;
1021357f1050SThomas Veerman 
1022357f1050SThomas Veerman 	/* find end of string minus one */
1023357f1050SThomas Veerman 	while (*p)
1024357f1050SThomas Veerman 		++p;
1025357f1050SThomas Veerman 	--p;
1026357f1050SThomas Veerman 
1027357f1050SThomas Veerman 	/* eat newlines */
1028357f1050SThomas Veerman 	while (p >= str && (*p == '\r' || *p == '\n'))
1029357f1050SThomas Veerman 		*p-- = 0;
1030357f1050SThomas Veerman 	return str;
1031357f1050SThomas Veerman }
1032