X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/2c4c30aa95ca133b7ba23d4f4977844976975862..a17e599f81825bc01cb237925f34ccc67b51a9a0:/src/closure.c diff --git a/src/closure.c b/src/closure.c index ad3a5be7..2cee4f80 100644 --- a/src/closure.c +++ b/src/closure.c @@ -235,14 +235,14 @@ new_closure (int n) void closure (short *core, int n) { - int ruleno; /* Index over CORE. */ int c; /* Index over RULESET. */ int r; - int itemno; + /* A bit index over RULESET. */ + int ruleno; if (trace_flag) { @@ -268,31 +268,21 @@ closure (short *core, int n) ruleset[r] |= FDERIVES (ritem[core[c]])[r]; } - ruleno = 0; itemsetsize = 0; c = 0; - for (r = 0; r < rulesetsize; ++r) - { - int b; - - for (b = 0; b < BITS_PER_WORD; b++) - { - if (ruleset[r] & (1 << b)) - { - itemno = rule_table[ruleno].rhs; - while (c < n && core[c] < itemno) - { - itemset[itemsetsize] = core[c]; - itemsetsize++; - c++; - } - itemset[itemsetsize] = itemno; - itemsetsize++; - } - - ruleno++; - } - } + for (ruleno = 0; ruleno < rulesetsize * BITS_PER_WORD; ++ruleno) + if (BITISSET (ruleset, ruleno)) + { + int itemno = rule_table[ruleno].rhs; + while (c < n && core[c] < itemno) + { + itemset[itemsetsize] = core[c]; + itemsetsize++; + c++; + } + itemset[itemsetsize] = itemno; + itemsetsize++; + } while (c < n) {