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