]> git.saurik.com Git - bison.git/blobdiff - src/output.c
* src/output.c (table_size, table_grow): New.
[bison.git] / src / output.c
index 28a7992e4adc77ea8069ef737791ebfc8f08b86a..f8cb5350eff96bb1fbf1c178f39c76528a2de410 100644 (file)
@@ -122,6 +122,11 @@ static short *state_count = NULL;
 static short *order = NULL;
 static short *base = NULL;
 static short *pos = NULL;
+
+/* TABLE_SIZE is the allocated size of both TABLE and CHECK.
+   We start with the original hard-coded value: SHRT_MAX
+   (yes, not USHRT_MAX). */
+static size_t table_size = SHRT_MAX;
 static short *table = NULL;
 static short *check = NULL;
 static int lowzero;
@@ -134,77 +139,79 @@ int error_verbose = 0;
 
 
 /*----------------------------------------------------------------.
-| Format the FIRST and then TABLE_DATA[BEGIN..END[ into OOUT, and |
-| return the number of bits needed for its longuest value.        |
+| If TABLE (and CHECK) appear to be small to be addressed at      |
+| DESIRED, grow them.  Note that TABLE[DESIRED] is to be used, so |
+| the desired size is at least DESIRED + 1.                       |
 `----------------------------------------------------------------*/
 
-static inline long int
-output_short_table (struct obstack *oout,
-                   short *table_data,
-                   short first,
-                   int begin,
-                   int end)
+static void
+table_grow (size_t desired)
 {
-  long int max = first;
-  int i;
-  int j = 1;
+  size_t old_size = table_size;
+
+  while (table_size <= desired)
+    table_size *= 2;
+
+  if (trace_flag)
+    fprintf (stderr, "growing table and check from: %d to %d\n",
+            old_size, table_size);
+
+  table = XREALLOC (table, short, table_size);
+  check = XREALLOC (check, short, table_size);
 
-  obstack_fgrow1 (oout, "%6d", first);
-  for (i = begin; i < end; ++i)
+  for (/* Nothing. */; old_size < table_size; ++old_size)
     {
-      obstack_1grow (oout, ',');
-      if (j >= 10)
-       {
-         obstack_sgrow (oout, "\n  ");
-         j = 1;
-       }
-      else
-       ++j;
-      obstack_fgrow1 (oout, "%6d", table_data[i]);
-      if (table_data[i] > max)
-       max = table_data[i];
+      table[old_size] = 0;
+      check[old_size] = -1;
     }
-  obstack_1grow (oout, 0);
-
-  return max;
 }
 
 
-/*--------------------.
-| Similar, for ints.  |
-`--------------------*/
-
-static inline long int
-output_int_table (struct obstack *oout,
-                 int *table_data,
-                 int first,
-                 int begin,
-                 int end)
-{
-  long int max = first;
-  int i;
-  int j = 1;
+/*------------------------------------------------------------------.
+| Create a function NAME which Format the FIRST and then            |
+| TABLE_DATA[BEGIN..END[ (of TYPE) into OOUT, and return the number |
+| of bits needed for its longuest value.                            |
+`------------------------------------------------------------------*/
 
-  obstack_fgrow1 (oout, "%6d", first);
-  for (i = begin; i < end; ++i)
-    {
-      obstack_1grow (oout, ',');
-      if (j >= 10)
-       {
-         obstack_sgrow (oout, "\n  ");
-         j = 1;
-       }
-      else
-       ++j;
-      obstack_fgrow1 (oout, "%6d", table_data[i]);
-      if (table_data[i] > max)
-       max = table_data[i];
-    }
-  obstack_1grow (oout, 0);
 
-  return max;
+#define GENERATE_OUTPUT_TABLE(Name, Type)                              \
+                                                                       \
+static inline long int                                                 \
+Name (struct obstack *oout,                                            \
+      Type *table_data,                                                        \
+      Type first,                                                      \
+      int begin,                                                       \
+      int end)                                                         \
+{                                                                      \
+  long int max = first;                                                        \
+  int i;                                                               \
+  int j = 1;                                                           \
+                                                                       \
+  obstack_fgrow1 (oout, "%6d", first);                                 \
+  for (i = begin; i < end; ++i)                                                \
+    {                                                                  \
+      obstack_1grow (oout, ',');                                       \
+      if (j >= 10)                                                     \
+       {                                                               \
+         obstack_sgrow (oout, "\n  ");                                 \
+         j = 1;                                                        \
+       }                                                               \
+      else                                                             \
+       ++j;                                                            \
+      obstack_fgrow1 (oout, "%6d", table_data[i]);                     \
+      if (table_data[i] > max)                                         \
+       max = table_data[i];                                            \
+    }                                                                  \
+  obstack_1grow (oout, 0);                                             \
+                                                                       \
+  return max;                                                          \
 }
 
+GENERATE_OUTPUT_TABLE(output_int_table, int)
+GENERATE_OUTPUT_TABLE(output_short_table, short)
+GENERATE_OUTPUT_TABLE(output_token_number_table, token_number_t)
+GENERATE_OUTPUT_TABLE(output_item_number_table, item_number_t)
+
 
 /*-----------------------------------------------------------------.
 | Prepare the muscles related to the tokens: translate, tname, and |
@@ -214,8 +221,9 @@ output_int_table (struct obstack *oout,
 static void
 prepare_tokens (void)
 {
-  long int max = output_short_table (&format_obstack, token_translations,
-                                   0, 1, max_user_token_number + 1);
+  long int max = output_token_number_table (&format_obstack,
+                                           token_translations,
+                                           0, 1, max_user_token_number + 1);
   muscle_insert ("translate", obstack_finish (&format_obstack));
   MUSCLE_INSERT_LONG_INT ("token_number_max", max);
   XFREE (token_translations);
@@ -281,7 +289,7 @@ prepare_rules (void)
   int i = 0;
   item_number_t *rhs = XMALLOC (item_number_t, nritems);
   short *prhs = XMALLOC (short, nrules + 1);
-  short *r1 = XMALLOC (short, nrules + 1);
+  token_number_t *r1 = XMALLOC (token_number_t, nrules + 1);
   short *r2 = XMALLOC (short, nrules + 1);
   short *rline = XMALLOC (short, nrules + 1);
 
@@ -313,7 +321,7 @@ prepare_rules (void)
   output_short_table (&format_obstack, rline, 0, 1, nrules + 1);
   muscle_insert ("rline", obstack_finish (&format_obstack));
 
-  output_short_table (&format_obstack, r1, 0, 1, nrules + 1);
+  output_token_number_table (&format_obstack, r1, 0, 1, nrules + 1);
   muscle_insert ("r1", obstack_finish (&format_obstack));
 
   output_short_table (&format_obstack, r2, 0, 1, nrules + 1);
@@ -332,11 +340,12 @@ static void
 prepare_states (void)
 {
   size_t i;
-  short *values = (short *) alloca (sizeof (short) * nstates);
+  token_number_t *values =
+    (token_number_t *) alloca (sizeof (token_number_t) * nstates);
   for (i = 0; i < nstates; ++i)
     values[i] = states[i]->accessing_symbol;
-  output_short_table (&format_obstack, values,
-                    0, 1, nstates);
+  output_token_number_table (&format_obstack, values,
+                            0, 1, nstates);
   muscle_insert ("stos", obstack_finish (&format_obstack));
 }
 
@@ -389,7 +398,7 @@ action_row (state_t *state)
      to reduce.  */
   for (i = 0; i < shiftp->nshifts; i++)
     {
-      int symbol;
+      token_number_t symbol;
       int shift_state = shiftp->shifts[i];
       if (!shift_state)
        continue;
@@ -793,8 +802,6 @@ matching_state (int vector)
   return -1;
 }
 
-/* FIXME: For the time being, best approximation... */
-#define MAXTABLE SHRT_MAX
 
 static int
 pack_vector (int vector)
@@ -808,7 +815,7 @@ pack_vector (int vector)
 
   assert (t);
 
-  for (j = lowzero - from[0]; j < MAXTABLE; j++)
+  for (j = lowzero - from[0]; j < (int) table_size; j++)
     {
       int k;
       int ok = 1;
@@ -816,8 +823,8 @@ pack_vector (int vector)
       for (k = 0; ok && k < t; k++)
        {
          loc = j + from[k];
-         if (loc > MAXTABLE)
-           fatal (_("maximum table size (%d) exceeded"), MAXTABLE);
+         if (loc > (int) table_size)
+           table_grow (loc);
 
          if (table[loc] != 0)
            ok = 0;
@@ -860,8 +867,8 @@ pack_table (void)
 
   base = XCALLOC (short, nvectors);
   pos = XCALLOC (short, nentries);
-  table = XCALLOC (short, MAXTABLE);
-  check = XCALLOC (short, MAXTABLE);
+  table = XCALLOC (short, table_size);
+  check = XCALLOC (short, table_size);
 
   lowzero = 0;
   high = 0;
@@ -869,7 +876,7 @@ pack_table (void)
   for (i = 0; i < nvectors; i++)
     base[i] = SHRT_MIN;
 
-  for (i = 0; i < MAXTABLE; i++)
+  for (i = 0; i < (int) table_size; i++)
     check[i] = -1;
 
   for (i = 0; i < nentries; i++)