+/*--------------------------------------------------------------.
+| Return true IFF the rule has a `number' smaller than NRULES. |
+`--------------------------------------------------------------*/
+
+bool
+rule_useful_p (rule_t *r)
+{
+ return r->number < nrules;
+}
+
+
+/*-------------------------------------------------------------.
+| Return true IFF the rule has a `number' higher than NRULES. |
+`-------------------------------------------------------------*/
+
+bool
+rule_useless_p (rule_t *r)
+{
+ return r->number >= nrules;
+}
+
+
+/*--------------------------------------------------------------------.
+| Return true IFF the rule is not flagged as useful *and* is useful. |
+| In other words, it was discarded because of conflicts. |
+`--------------------------------------------------------------------*/
+
+bool
+rule_never_reduced_p (rule_t *r)
+{
+ return !r->useful && r->number < nrules;
+}
+
+
+/*----------------------------------------------------------------.
+| Print this RULE's number and lhs on OUT. If a PREVIOUS_LHS was |
+| already displayed (by a previous call for another rule), avoid |
+| useless repetitions. |
+`----------------------------------------------------------------*/
+
+void
+rule_lhs_print (rule_t *rule, symbol_t *previous_lhs, FILE *out)
+{
+ fprintf (out, " %3d ", rule->number);
+ if (previous_lhs != rule->lhs)
+ {
+ fprintf (out, "%s:", rule->lhs->tag);
+ }
+ else
+ {
+ int n;
+ for (n = strlen (previous_lhs->tag); n > 0; --n)
+ fputc (' ', out);
+ fputc ('|', out);
+ }
+}
+
+