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