bug-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 1/5] Refactor: Move rule comparisons into separate functions


From: Mark Seaborn
Subject: [PATCH 1/5] Refactor: Move rule comparisons into separate functions
Date: Sun, 25 Feb 2007 18:22:54 +0000 (GMT)

---
 rule.c |   95 +++++++++++++++++++++++++++++++++++++---------------------------
 1 files changed, 55 insertions(+), 40 deletions(-)

diff --git a/rule.c b/rule.c
index ee96ec1..d08383b 100644
--- a/rule.c
+++ b/rule.c
@@ -273,6 +273,34 @@ convert_to_pattern (void)
 }
 
 
+static int
+rule_targets_superset (struct rule *rule1, struct rule *rule2)
+{
+  int i;
+  for (i = 0; rule1->targets[i] != NULL; i++)
+    {
+      int j;
+      for (j = 0; rule2->targets[j] != NULL; j++)
+       if (!streq (rule1->targets[i], rule2->targets[j]))
+         break;
+      if (rule2->targets[j] == NULL)
+       return 1;
+    }
+  return 0;
+}
+
+static int
+rule_dependency_lists_equal (struct rule *rule1, struct rule *rule2)
+{
+  struct dep *dep1, *dep2;
+  for (dep1 = rule1->deps, dep2 = rule2->deps;
+       dep1 != NULL && dep2 != NULL;
+       dep1 = dep1->next, dep2 = dep2->next)
+    if (!streq (dep_name (dep1), dep_name (dep2)))
+      return 0;
+  return dep1 == NULL && dep2 == NULL;
+}
+
 /* Install the pattern rule RULE (whose fields have been filled in)
    at the end of the list (so that any rules previously defined
    will take precedence).  If this rule duplicates a previous one
@@ -285,7 +313,6 @@ int
 new_pattern_rule (struct rule *rule, int override)
 {
   register struct rule *r, *lastrule;
-  register unsigned int i, j;
 
   rule->in_use = 0;
   rule->terminal = 0;
@@ -295,45 +322,33 @@ new_pattern_rule (struct rule *rule, int override)
   /* Search for an identical rule.  */
   lastrule = 0;
   for (r = pattern_rules; r != 0; lastrule = r, r = r->next)
-    for (i = 0; rule->targets[i] != 0; ++i)
-      {
-       for (j = 0; r->targets[j] != 0; ++j)
-         if (!streq (rule->targets[i], r->targets[j]))
-           break;
-       if (r->targets[j] == 0)
-         /* All the targets matched.  */
-         {
-           register struct dep *d, *d2;
-           for (d = rule->deps, d2 = r->deps;
-                d != 0 && d2 != 0; d = d->next, d2 = d2->next)
-             if (!streq (dep_name (d), dep_name (d2)))
-               break;
-           if (d == 0 && d2 == 0)
-             {
-               /* All the dependencies matched.  */
-               if (override)
-                 {
-                   /* Remove the old rule.  */
-                   freerule (r, lastrule);
-                   /* Install the new one.  */
-                   if (pattern_rules == 0)
-                     pattern_rules = rule;
-                   else
-                     last_pattern_rule->next = rule;
-                   last_pattern_rule = rule;
-
-                   /* We got one.  Stop looking.  */
-                   goto matched;
-                 }
-               else
-                 {
-                   /* The old rule stays intact.  Destroy the new one.  */
-                   freerule (rule, (struct rule *) 0);
-                   return 0;
-                 }
-             }
-         }
-      }
+    {
+      if (rule_targets_superset (rule, r) &&
+         rule_dependency_lists_equal (rule, r))
+       {
+         /* All the dependencies matched.  */
+         if (override)
+           {
+             /* Remove the old rule.  */
+             freerule (r, lastrule);
+             /* Install the new one.  */
+             if (pattern_rules == 0)
+               pattern_rules = rule;
+             else
+               last_pattern_rule->next = rule;
+             last_pattern_rule = rule;
+
+             /* We got one.  Stop looking.  */
+             goto matched;
+           }
+         else
+           {
+             /* The old rule stays intact.  Destroy the new one.  */
+             freerule (rule, (struct rule *) 0);
+             return 0;
+           }
+       }
+    }
 
  matched:;
 
-- 




reply via email to

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