- int i;
- shorts *p;
- short *q;
- shorts **dset;
- shorts *delts;
-
- dset = XCALLOC (shorts *, nvars) - ntokens;
- delts = XCALLOC (shorts, nrules + 1);
-
- p = delts;
- for (i = nrules; i > 0; i--)
- if (rule_table[i].useful)
- {
- int lhs = rule_table[i].lhs;
- p->next = dset[lhs];
- p->value = i;
- dset[lhs] = p;
- p++;
- }
-
- derives = XCALLOC (short *, nvars) - ntokens;
- q = XCALLOC (short, nvars + nrules);
+ symbol_number i;
+ rule_number r;
+ rule **q;
+
+ /* DSET[NTERM - NTOKENS] -- A linked list of the numbers of the rules
+ whose LHS is NTERM. */
+ rule_list **dset = xcalloc (nvars, sizeof *dset);
+
+ /* DELTS[RULE] -- There are NRULES rule number to attach to nterms.
+ Instead of performing NRULES allocations for each, have an array
+ indexed by rule numbers. */
+ rule_list *delts = xnmalloc (nrules, sizeof *delts);
+
+ for (r = nrules - 1; r >= 0; --r)
+ {
+ symbol_number lhs = rules[r].lhs->number;
+ rule_list *p = &delts[r];
+ /* A new LHS is found. */
+ p->next = dset[lhs - ntokens];
+ p->value = &rules[r];
+ dset[lhs - ntokens] = p;
+ }
+
+ /* DSET contains what we need under the form of a linked list. Make
+ it a single array. */
+
+ derives = xnmalloc (nvars, sizeof *derives);
+ q = xnmalloc (nvars + nrules, sizeof *q);