-}
-
-
-static int
-matching_state (int vector)
-{
- int i = order[vector];
- int t;
- int w;
- int prev;
-
- if (i >= (int) nstates)
- return -1;
-
- t = tally[i];
- w = width[i];
-
- for (prev = vector - 1; prev >= 0; prev--)
- {
- int j = order[prev];
- int k;
- int match = 1;
-
- if (width[j] != w || tally[j] != t)
- return -1;
-
- for (k = 0; match && k < t; k++)
- if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k])
- match = 0;
-
- if (match)
- return j;
- }
-
- return -1;
-}
-
-
-static int
-pack_vector (int vector)
-{
- int i = order[vector];
- int j;
- int t = tally[i];
- int loc = 0;
- short *from = froms[i];
- short *to = tos[i];
-
- assert (t);
-
- for (j = lowzero - from[0]; j < MAXTABLE; j++)
- {
- int k;
- int ok = 1;
-
- for (k = 0; ok && k < t; k++)
- {
- loc = j + from[k];
- if (loc > MAXTABLE)
- fatal (_("maximum table size (%d) exceeded"), MAXTABLE);
-
- if (table[loc] != 0)
- ok = 0;
- }
-
- for (k = 0; ok && k < vector; k++)
- if (pos[k] == j)
- ok = 0;
-
- if (ok)
- {
- for (k = 0; k < t; k++)
- {
- loc = j + from[k];
- table[loc] = to[k];
- check[loc] = from[k];
- }
-
- while (table[lowzero] != 0)
- lowzero++;
-
- if (loc > high)
- high = loc;
-
- return j;
- }
- }
-#define pack_vector_succeeded 0
- assert (pack_vector_succeeded);
- return 0;
-}
-
-
-static void
-pack_table (void)
-{
- int i;
- int place;
- int state;
-
- base = XCALLOC (short, nvectors);
- pos = XCALLOC (short, nentries);
- table = XCALLOC (short, MAXTABLE);
- check = XCALLOC (short, MAXTABLE);
-
- lowzero = 0;
- high = 0;
-
- for (i = 0; i < nvectors; i++)
- base[i] = MINSHORT;
-
- for (i = 0; i < MAXTABLE; i++)
- check[i] = -1;
-
- for (i = 0; i < nentries; i++)
- {
- state = matching_state (i);
-
- if (state < 0)
- place = pack_vector (i);
- else
- place = base[state];
-
- pos[i] = place;
- base[order[i]] = place;
- }
-
- for (i = 0; i < nvectors; i++)
- {
- XFREE (froms[i]);
- XFREE (tos[i]);
- }
-
- XFREE (froms);
- XFREE (tos);
- XFREE (pos);
-}
-
-/* the following functions output yytable, yycheck
- and the vectors whose elements index the portion starts */
-
-static void
-output_base (void)
-{
- /* Output pact. */
- output_table_data (&format_obstack, base,
- base[0], 1, nstates);
- muscle_insert ("pact", obstack_finish (&format_obstack));
-
- /* Output pgoto. */
- output_table_data (&format_obstack, base,
- base[nstates], nstates + 1, nvectors);
- muscle_insert ("pgoto", obstack_finish (&format_obstack));
-
- XFREE (base);
-}
-
-
-static void
-output_table (void)
-{
- output_table_data (&format_obstack, table,
- table[0], 1, high + 1);
- muscle_insert ("table", obstack_finish (&format_obstack));
- XFREE (table);