o Don't free the second list in Lst_Concat for LST_CONCLINK; free
authorMax Okumoto <okumoto@dragonflybsd.org>
Fri, 17 Dec 2004 08:01:40 +0000 (08:01 +0000)
committerMax Okumoto <okumoto@dragonflybsd.org>
Fri, 17 Dec 2004 08:01:40 +0000 (08:01 +0000)
  it in the caller instead.

o Remove return value from Lst_Concat. None of the callers ever
  checked it. Remove stuff that was needed for circular lists.

o Don't check the return code from Lst_Remove. There is no way that
  the list's first element is not on the list.

o No caller checks the return code from Lst_Remove, so don't return
  one.  Simplify the algorithm now that circular lists are gone.

o Now that circular lists are gone remove stuff for them. Simplify
  somewhat so that we can remove a local variable.

Taken-from: FreeBSD
Author: harti

usr.bin/make/lst.h
usr.bin/make/lst.lib/lstConcat.c
usr.bin/make/lst.lib/lstDeQueue.c
usr.bin/make/lst.lib/lstDestroy.c
usr.bin/make/lst.lib/lstRemove.c
usr.bin/make/suff.c

index 65c999d..e914eac 100644 (file)
@@ -38,7 +38,7 @@
  *
  *     from: @(#)lst.h 8.1 (Berkeley) 6/6/93
  * $FreeBSD: src/usr.bin/make/lst.h,v 1.9 1999/08/28 01:03:32 peter Exp $
- * $DragonFly: src/usr.bin/make/lst.h,v 1.15 2004/12/17 07:56:08 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/lst.h,v 1.16 2004/12/17 08:01:40 okumoto Exp $
  */
 
 /*-
@@ -121,12 +121,12 @@ ReturnStatus      Lst_Append(Lst *, LstNode *, void *);
 /* Place an element at the end of a lst. */
 #define        Lst_AtEnd(LST, D)       (Lst_Append((LST), Lst_Last(LST), (D)))
 /* Remove an element */
-ReturnStatus   Lst_Remove(Lst *, LstNode *);
+void           Lst_Remove(Lst *, LstNode *);
 /* Replace a node with a new value */
 #define        Lst_Replace(NODE, D)    (((NODE) == NULL) ? FAILURE : \
                                    (((NODE)->datum = (D)), SUCCESS))
 /* Concatenate two lists */
-ReturnStatus   Lst_Concat(Lst *, Lst *, int);
+void           Lst_Concat(Lst *, Lst *, int);
 
 /*
  * Node-specific functions
index 9678396..648c46d 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/usr.bin/make/lst.lib/lstConcat.c,v 1.7 1999/08/28 01:03:47 peter Exp $
- * $DragonFly: src/usr.bin/make/lst.lib/Attic/lstConcat.c,v 1.8 2004/12/17 00:02:57 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/lst.lib/Attic/lstConcat.c,v 1.9 2004/12/17 08:01:40 okumoto Exp $
  *
  * @(#)lstConcat.c     8.1 (Berkeley) 6/6/93
  */
@@ -54,8 +54,6 @@
  *     elements, if specified, but the elements themselves are not copied.
  *     If the elements should be duplicated to avoid confusion with another
  *     list, the Lst_Duplicate function should be called first.
- *     If LST_CONCLINK is specified, the second list is destroyed since
- *     its pointers have been corrupted and the list is no longer useable.
  *
  * Results:
  *     SUCCESS if all went well. FAILURE otherwise.
@@ -70,7 +68,7 @@
  *     New elements are created and appended the the first list.
  *-----------------------------------------------------------------------
  */
-ReturnStatus
+void
 Lst_Concat(Lst *list1, Lst *list2, int flags)
 {
     LstNode *ln;       /* original LstNode */
@@ -78,41 +76,27 @@ Lst_Concat(Lst *list1, Lst *list2, int flags)
     LstNode *last;     /* the last element in the list. Keeps
                         * bookkeeping until the end */
 
-    if (!Lst_Valid(list1) || !Lst_Valid(list2)) {
-       return (FAILURE);
-    }
+    if (list2->firstPtr == NULL)
+       return;
 
     if (flags == LST_CONCLINK) {
-       if (list2->firstPtr != NULL) {
-           /*
-            * We set the nextPtr of the last element of list two to be NULL
-            * to make the loop easier and so we don't need an extra case --
-            * the final element will already point to NULL space and the first
-            * element will be untouched if it existed before and will also
-            * point to NULL space if it didn't.
-            */
-           list2->lastPtr->nextPtr = NULL;
-           /*
-            * So long as the second list isn't empty, we just link the
-            * first element of the second list to the last element of the
-            * first list. If the first list isn't empty, we then link the
-            * last element of the list to the first element of the second list
-            * The last element of the second list, if it exists, then becomes
-            * the last element of the first list.
-            */
-           list2->firstPtr->prevPtr = list1->lastPtr;
-           if (list1->lastPtr != NULL) {
-               list1->lastPtr->nextPtr = list2->firstPtr;
-           } else {
-               list1->firstPtr = list2->firstPtr;
-           }
-           list1->lastPtr = list2->lastPtr;
-       }
-       free(list2);
-    } else if (list2->firstPtr != NULL) {
        /*
-        * We set the nextPtr of the last element of list 2 to be NULL to make
-        * the loop less difficult. The loop simply goes through the entire
+        * Link the first element of the second list to the last element of the
+        * first list. If the first list isn't empty, we then link the
+        * last element of the list to the first element of the second list
+        * The last element of the second list, if it exists, then becomes
+        * the last element of the first list.
+        */
+       list2->firstPtr->prevPtr = list1->lastPtr;
+       if (list1->lastPtr != NULL)
+           list1->lastPtr->nextPtr = list2->firstPtr;
+       else
+           list1->firstPtr = list2->firstPtr;
+       list1->lastPtr = list2->lastPtr;
+
+    } else {
+       /*
+        * The loop simply goes through the entire
         * second list creating new LstNodes and filling in the nextPtr, and
         * prevPtr to fit into list1 and its datum field from the
         * datum field of the corresponding element in list2. The 'last' node
@@ -122,7 +106,6 @@ Lst_Concat(Lst *list1, Lst *list2, int flags)
         * the first list must have been empty so the newly-created node is
         * made the first node of the list.
         */
-       list2->lastPtr->nextPtr = NULL;
        for (last = list1->lastPtr, ln = list2->firstPtr;
             ln != NULL;
             ln = ln->nextPtr)
@@ -146,6 +129,4 @@ Lst_Concat(Lst *list1, Lst *list2, int flags)
        list1->lastPtr = last;
        last->nextPtr = NULL;
     }
-
-    return (SUCCESS);
 }
index a2032b6..8c36878 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/usr.bin/make/lst.lib/lstDeQueue.c,v 1.6 1999/08/28 01:03:48 peter Exp $
- * $DragonFly: src/usr.bin/make/lst.lib/Attic/lstDeQueue.c,v 1.7 2004/12/17 00:02:57 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/lst.lib/Attic/lstDeQueue.c,v 1.8 2004/12/17 08:01:40 okumoto Exp $
  *
  * @(#)lstDeQueue.c    8.1 (Berkeley) 6/6/93
  */
@@ -73,9 +73,6 @@ Lst_DeQueue(Lst *l)
     }
 
     rd = tln->datum;
-    if (Lst_Remove(l, tln) == FAILURE) {
-       return (NULL);
-    } else {
-       return (rd);
-    }
+    Lst_Remove(l, tln);
+    return (rd);
 }
index fa07bc3..44114bc 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/usr.bin/make/lst.lib/lstDestroy.c,v 1.7 1999/08/28 01:03:49 peter Exp $
- * $DragonFly: src/usr.bin/make/lst.lib/Attic/lstDestroy.c,v 1.10 2004/12/17 00:02:57 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/lst.lib/Attic/lstDestroy.c,v 1.11 2004/12/17 08:01:40 okumoto Exp $
  *
  * @(#)lstDestroy.c    8.1 (Berkeley) 6/6/93
  */
@@ -66,7 +66,6 @@ void
 Lst_Destroy(Lst *list, FreeProc *freeProc)
 {
     LstNode *ln;
-    LstNode *tln;
 
     if (!Lst_Valid(list)) {
        /*
@@ -76,22 +75,19 @@ Lst_Destroy(Lst *list, FreeProc *freeProc)
        return;
     }
 
-    if (list->lastPtr == NULL) {
+    if (list->firstPtr == NULL) {
        free(list);
        return;
     }
-    /* To ease scanning */
-    list->lastPtr->nextPtr = NULL;
-
-    if (freeProc) {
-       for (ln = list->firstPtr; ln != NULL; ln = tln) {
-            tln = ln->nextPtr;
+    if (freeProc != NOFREE) {
+       while ((ln = list->firstPtr) != NULL) {
+           list->firstPtr = ln->nextPtr;
             (*freeProc)(ln->datum);
             free(ln);
        }
     } else {
-       for (ln = list->firstPtr; ln != NULL; ln = tln) {
-            tln = ln->nextPtr;
+       while ((ln = list->firstPtr) != NULL) {
+           list->firstPtr = ln->nextPtr;
             free(ln);
        }
     }
index b7e0140..ff08f72 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/usr.bin/make/lst.lib/lstRemove.c,v 1.6 1999/08/28 01:03:56 peter Exp $
- * $DragonFly: src/usr.bin/make/lst.lib/Attic/lstRemove.c,v 1.9 2004/12/17 07:56:08 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/lst.lib/Attic/lstRemove.c,v 1.10 2004/12/17 08:01:40 okumoto Exp $
  *
  * @(#)lstRemove.c     8.1 (Berkeley) 6/6/93
  */
  *
  *-----------------------------------------------------------------------
  */
-ReturnStatus
+void
 Lst_Remove(Lst *list, LstNode *ln)
 {
 
-    if (!Lst_Valid(list) || !Lst_NodeValid(ln, list)) {
-           return (FAILURE);
-    }
-
     /*
      * unlink it from the list
      */
-    if (ln->nextPtr != NULL) {
+    if (ln->nextPtr != NULL)
+       /* unlink from the backward chain */
        ln->nextPtr->prevPtr = ln->prevPtr;
-    }
-    if (ln->prevPtr != NULL) {
-       ln->prevPtr->nextPtr = ln->nextPtr;
-    }
-
-    /*
-     * if either the firstPtr or lastPtr of the list point to this node,
-     * adjust them accordingly
-     */
-    if (list->firstPtr == ln) {
-       list->firstPtr = ln->nextPtr;
-    }
-    if (list->lastPtr == ln) {
+    else
+       /* this was the last element */
        list->lastPtr = ln->prevPtr;
-    }
 
-    /*
-     * the only way firstPtr can still point to ln is if ln is the last
-     * node on the list. The list is, therefore, empty and is marked as such
-     */
-    if (list->firstPtr == ln) {
-       list->firstPtr = NULL;
-    }
+    if (ln->prevPtr != NULL)
+       /* unlink from the forward chain */
+       ln->prevPtr->nextPtr = ln->nextPtr;
+    else
+       /* this was the first element */
+       list->firstPtr = ln->nextPtr;
 
     /*
      * note that the datum is unmolested. The caller must free it as
@@ -108,6 +92,4 @@ Lst_Remove(Lst *list, LstNode *ln)
     } else {
        ln->flags |= LN_DELETED;
     }
-
-    return (SUCCESS);
 }
index 1a3043b..fbc990a 100644 (file)
@@ -37,7 +37,7 @@
  *
  * @(#)suff.c  8.4 (Berkeley) 3/21/94
  * $FreeBSD: src/usr.bin/make/suff.c,v 1.12.2.2 2004/06/10 13:07:53 ru Exp $
- * $DragonFly: src/usr.bin/make/suff.c,v 1.20 2004/12/17 07:56:08 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/suff.c,v 1.21 2004/12/17 08:01:40 okumoto Exp $
  */
 
 /*-
@@ -453,6 +453,7 @@ Suff_ClearSuffixes(void)
 {
 
     Lst_Concat(suffClean, sufflist, LST_CONCLINK);
+    free(sufflist);
     sufflist = Lst_Init();
     sNum = 1;
     suffNull = emptySuff;
@@ -2078,6 +2079,8 @@ sfnd_return:
 
     Lst_Concat(slst, srcs, LST_CONCLINK);
     Lst_Concat(slst, targs, LST_CONCLINK);
+    free(srcs);
+    free(targs);
 }
 
 /*-