-static short **R;
-static short *INDEX;
-static short *VERTICES;
-static int top;
-
-
-static void
-traverse (int i)
-{
- unsigned *fp1;
- unsigned *fp2;
- unsigned *fp3;
- int j;
- short *rp;
-
- int height;
- unsigned *base;
-
- VERTICES[++top] = i;
- INDEX[i] = height = top;
-
- base = F + i * tokensetsize;
- fp3 = base + tokensetsize;
-
- rp = R[i];
- if (rp)
- {
- while ((j = *rp++) >= 0)
- {
- if (INDEX[j] == 0)
- traverse (j);
-
- if (INDEX[i] > INDEX[j])
- INDEX[i] = INDEX[j];
-
- fp1 = base;
- fp2 = F + j * tokensetsize;
-
- while (fp1 < fp3)
- *fp1++ |= *fp2++;
- }
- }
-
- if (INDEX[i] == height)
- {
- for (;;)
- {
- j = VERTICES[top--];
- INDEX[j] = infinity;
-
- if (i == j)
- break;
-
- fp1 = base;
- fp2 = F + j * tokensetsize;
-
- while (fp1 < fp3)
- *fp2++ = *fp1++;
- }
- }
-}
-
-
-static void
-digraph (short **relation)
-{
- int i;
-
- infinity = ngotos + 2;
- INDEX = XCALLOC (short, ngotos + 1);
- VERTICES = XCALLOC (short, ngotos + 1);
- top = 0;
-
- R = relation;
-
- for (i = 0; i < ngotos; i++)
- INDEX[i] = 0;
-
- for (i = 0; i < ngotos; i++)
- {
- if (INDEX[i] == 0 && R[i])
- traverse (i);
- }
-
- XFREE (INDEX);
- XFREE (VERTICES);
-}
-
-static void
-set_state_table (void)
-{
- /* NSTATES + 1 because lookahead for the pseudo state number NSTATES
- might be used (see conflicts.c). It is too opaque for me to
- provide a probably less hacky implementation. --akim */
- state_table = XCALLOC (state_t, nstates + 1);
-
- {
- core *sp;
- for (sp = first_state; sp; sp = sp->next)
- {
- state_table[sp->number].state = sp;
- state_table[sp->number].accessing_symbol = sp->accessing_symbol;
- }
- }
-
- {
- shifts *sp;
- for (sp = first_shift; sp; sp = sp->next)
- state_table[sp->number].shift_table = sp;
- }
-
- {
- reductions *rp;
- for (rp = first_reduction; rp; rp = rp->next)
- state_table[rp->number].reduction_table = rp;
- }
-}
-
-
-static void
-set_maxrhs (void)
-{
- short *itemp;
- int length;
- int max;