- 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 (rules[i].useful)
- {
- int lhs = rules[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_t i;
+ int r;
+ rule_t **q;
+
+ /* DSET[NTERM] -- A linked list of the numbers of the rules whose
+ LHS is NTERM. */
+ rule_list_t **dset = XCALLOC (rule_list_t *, nvars) - ntokens;
+
+ /* 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_t *delts = XCALLOC (rule_list_t, nrules);
+
+ for (r = nrules - 1; r >= 0; --r)
+ {
+ symbol_number_t lhs = rules[r].lhs->number;
+ rule_list_t *p = &delts[r];
+ /* A new LHS is found. */
+ p->next = dset[lhs];
+ p->value = &rules[r];
+ dset[lhs] = p;
+ }
+
+ /* DSET contains what we need under the form of a linked list. Make
+ it a single array. */
+
+ derives = XCALLOC (rule_t **, nvars) - ntokens;
+ q = XCALLOC (rule_t *, nvars + int_of_rule_number (nrules));