bug-make
[Top][All Lists]
Advanced

[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.  */
-- 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]