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;
int error_verbose = 0;
-/* Returns the number of lines of S. */
-size_t
-get_lines_number (const char *s)
-{
- size_t lines = 0;
-
- size_t i;
- for (i = 0; s[i]; ++i)
- if (s[i] == '\n')
- ++lines;
-
- return lines;
-}
-
/*----------------------------------------------------------------.
-| 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);
- obstack_fgrow1 (oout, "%6d", first);
- for (i = begin; i < end; ++i)
+ table = XREALLOC (table, short, table_size);
+ check = XREALLOC (check, short, table_size);
+
+ 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. |
-`--------------------*/
+/*------------------------------------------------------------------.
+| 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. |
+`------------------------------------------------------------------*/
-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;
- 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 |
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);
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);
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);
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));
}
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;
return -1;
}
-/* FIXME: For the time being, best approximation... */
-#define MAXTABLE SHRT_MAX
static int
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;
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;
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;
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++)