[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 5/5] Hook up hash table: use for searching for rules to replace
From: |
Mark Seaborn |
Subject: |
[PATCH 5/5] Hook up hash table: use for searching for rules to replace |
Date: |
Sun, 25 Feb 2007 18:28:51 +0000 (GMT) |
---
rule.c | 52 ++++++++++++++++++++++++++++------------------------
1 files changed, 28 insertions(+), 24 deletions(-)
diff --git a/rule.c b/rule.c
index af1cefa..3ffc6bd 100644
--- a/rule.c
+++ b/rule.c
@@ -340,35 +340,39 @@ rule_dependency_lists_equal (struct rule *rule1, struct
rule *rule2)
int
new_pattern_rule (struct rule *rule, int override)
{
- register struct rule *r;
+ int i;
rule->in_use = 0;
rule->terminal = 0;
- /* Search for an identical rule. */
- for (r = pattern_rules.next; !r->list_head; r = r->next)
+ /* Search for an existing rule to replace. */
+ for (i = 0; rule->targets[i] != NULL; i++)
{
- if (rule_targets_superset (rule, r) &&
- rule_dependency_lists_equal (rule, r))
- {
- /* All the dependencies matched. */
- if (override)
- {
- remove_rule (r);
- free_rule (r);
-
- add_rule (rule);
-
- /* We got one. Stop looking. */
- return 1;
- }
- else
- {
- /* The old rule stays intact. Destroy the new one. */
- free_rule (rule);
- return 0;
- }
- }
+ struct rule_target_list key, *list;
+ key.target = rule->targets[i];
+ list = hash_find_item (&rules_by_target, &key);
+ for (; list != NULL; list = list->next)
+ {
+ struct rule *old_rule = list->rule;
+ if (rule_targets_superset (rule, old_rule) &&
+ rule_dependency_lists_equal (rule, old_rule))
+ {
+ /* All the dependencies matched. */
+ if (override)
+ {
+ remove_rule (old_rule);
+ free_rule (old_rule);
+ add_rule (rule);
+ return 1;
+ }
+ else
+ {
+ /* The old rule stays intact. Destroy the new one. */
+ free_rule (rule);
+ return 0;
+ }
+ }
+ }
}
/* There was no rule to replace. */
--