Module Name:    othersrc
Committed By:   dholland
Date:           Sat Mar 23 17:09:40 UTC 2013

Modified Files:
        othersrc/usr.bin/dholland-make2: graph.h suff.c

Log Message:
More arrays, fewer lists.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 othersrc/usr.bin/dholland-make2/graph.h
cvs rdiff -u -r1.9 -r1.10 othersrc/usr.bin/dholland-make2/suff.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: othersrc/usr.bin/dholland-make2/graph.h
diff -u othersrc/usr.bin/dholland-make2/graph.h:1.6 othersrc/usr.bin/dholland-make2/graph.h:1.7
--- othersrc/usr.bin/dholland-make2/graph.h:1.6	Tue Mar  5 04:27:27 2013
+++ othersrc/usr.bin/dholland-make2/graph.h	Sat Mar 23 17:09:40 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: graph.h,v 1.6 2013/03/05 04:27:27 dholland Exp $	*/
+/*	$NetBSD: graph.h,v 1.7 2013/03/23 17:09:40 dholland Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -174,7 +174,7 @@ struct GNode {
     Hash_Table      context;	/* The local variables */
     struct stringarray commands;/* Creation commands */
 
-    struct _Suff    *suffix;	/* Suffix for the node (determined by
+    struct Suff    *suffix;	/* Suffix for the node (determined by
 				 * Suff_FindDeps and opaque to everyone
 				 * but the Suff module) */
     const char	    *fname;	/* filename where the GNode got defined */

Index: othersrc/usr.bin/dholland-make2/suff.c
diff -u othersrc/usr.bin/dholland-make2/suff.c:1.9 othersrc/usr.bin/dholland-make2/suff.c:1.10
--- othersrc/usr.bin/dholland-make2/suff.c:1.9	Fri Mar 22 22:59:24 2013
+++ othersrc/usr.bin/dholland-make2/suff.c	Sat Mar 23 17:09:40 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: suff.c,v 1.9 2013/03/22 22:59:24 dholland Exp $	*/
+/*	$NetBSD: suff.c,v 1.10 2013/03/23 17:09:40 dholland Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -131,12 +131,16 @@
 #include	  "hash.h"
 #include	  "dir.h"
 
-MAKE_RCSID("$NetBSD: suff.c,v 1.9 2013/03/22 22:59:24 dholland Exp $");
+MAKE_RCSID("$NetBSD: suff.c,v 1.10 2013/03/23 17:09:40 dholland Exp $");
 
 /*
  * Structure describing an individual suffix.
  */
-typedef struct _Suff {
+
+struct Suff;
+DECLARRAY_BYTYPE(sufflist, struct Suff, static);
+
+typedef struct Suff {
     char         *name;	    	/* The suffix itself */
     int		 nameLen;	/* Length of the suffix */
     short	 flags;      	/* Type of suffix */
@@ -146,9 +150,10 @@ typedef struct _Suff {
     struct patharray searchPath;/* The path along which files of this suffix
 				 * may be found */
     int          sNum;	      	/* The suffix number */
+	/* XXX: the handling of refCount is all broken */
     int		 refCount;	/* Reference count of list membership */
-    Lst          parents;	/* Suffixes we have a transformation to */
-    Lst          children;	/* Suffixes we have a transformation from */
+    struct sufflist parents;	/* Suffixes we have a transformation to */
+    struct sufflist children;	/* Suffixes we have a transformation from */
     Lst		 ref;		/* List of lists this suffix is referenced */
 } Suff;
 
@@ -156,7 +161,7 @@ typedef struct _Suff {
  * for SuffSuffIsSuffix
  */
 typedef struct {
-    char	*ename;		/* The end of the name */
+    const char	*ename;		/* The end of the name */
     int		 len;		/* Length of the name */
 } SuffixCmpData;
 
@@ -180,10 +185,6 @@ typedef struct _Src {
  * A structure for passing more than one argument to the Lst-library-invoked
  * function...
  */
-typedef struct {
-    Lst            l;
-    Src            *s;
-} LstSrc;
 
 typedef struct {
     GNode	  **gn;
@@ -191,9 +192,13 @@ typedef struct {
     Boolean	    r;
 } GNodeSuff;
 
-static Lst       sufflist;	/* Lst of suffixes */
+DEFARRAY_BYTYPE(sufflist, Suff, MAKE_ATTR_UNUSED static);
+
+#define CLEANUP
+
+static struct sufflist sufflist;	/* suffixes */
 #ifdef CLEANUP
-static Lst	 suffClean;	/* Lst of suffixes to be cleaned */
+static struct sufflist suffClean;	/* suffixes to be cleaned */
 #endif
 static Lst	 srclist;	/* Lst of sources */
 static Lst       transforms;	/* Lst of transformation rules */
@@ -206,18 +211,15 @@ static Suff 	    *emptySuff;	/* The empt
 
 
 static const char *SuffStrIsPrefix(const char *, const char *);
-static char *SuffSuffIsSuffix(const Suff *, const SuffixCmpData *);
-static int SuffSuffIsSuffixP(const void *, const void *);
-static int SuffSuffHasNameP(const void *, const void *);
-static int SuffSuffIsPrefix(const void *, const void *);
+static const char *SuffSuffIsSuffix(const Suff *, const SuffixCmpData *);
 static int SuffGNHasNameP(const void *, const void *);
-static void SuffUnRef(void *, void *);
+static void SuffUnRef(struct sufflist *, Suff *);
 static void SuffFree(void *);
-static void SuffInsert(Lst, Suff *);
-static void SuffRemove(Lst, Suff *);
+static void SuffInsert(struct sufflist *, Suff *);
+static void SuffRemove(struct sufflist *, Suff *);
 static Boolean SuffParseTransform(char *, Suff **, Suff **);
 static int SuffRebuildGraph(void *, void *);
-static int SuffAddSrc(void *, void *);
+static void SuffAddSrc(Suff *, Lst, Src *);
 static int SuffRemoveSrc(Lst);
 static void SuffAddLevel(Lst, Src *);
 static Src *SuffFindThem(Lst, Lst);
@@ -228,8 +230,8 @@ static Boolean SuffApplyTransform(GNode 
 static void SuffFindDeps(GNode *, Lst);
 static void SuffFindArchiveDeps(GNode *, Lst);
 static void SuffFindNormalDeps(GNode *, Lst);
-static int SuffPrintName(void *, void *);
-static int SuffPrintSuff(void *, void *);
+static void SuffPrintName(Suff *);
+static void SuffPrintSuff(Suff *);
 static int SuffPrintTrans(void *, void *);
 
 	/*************** Lst Predicates ****************/
@@ -278,11 +280,11 @@ SuffStrIsPrefix(const char *pref, const 
  *	None
  *-----------------------------------------------------------------------
  */
-static char *
+static const char *
 SuffSuffIsSuffix(const Suff *s, const SuffixCmpData *sd)
 {
-    char  *p1;	    	/* Pointer into suffix name */
-    char  *p2;	    	/* Pointer into string being examined */
+    const char  *p1;	    	/* Pointer into suffix name */
+    const char  *p2;	    	/* Pointer into string being examined */
 
     if (sd->len < s->nameLen)
 	return NULL;		/* this string is shorter than the suffix */
@@ -300,74 +302,6 @@ SuffSuffIsSuffix(const Suff *s, const Su
 
 /*-
  *-----------------------------------------------------------------------
- * SuffSuffIsSuffixP --
- *	Predicate form of SuffSuffIsSuffix. Passed as the callback function
- *	to Lst_Find.
- *
- * Results:
- *	0 if the suffix is the one desired, non-zero if not.
- *
- * Side Effects:
- *	None.
- *
- *-----------------------------------------------------------------------
- */
-static int
-SuffSuffIsSuffixP(const void *s, const void *sd)
-{
-    return(!SuffSuffIsSuffix(s, sd));
-}
-
-/*-
- *-----------------------------------------------------------------------
- * SuffSuffHasNameP --
- *	Callback procedure for finding a suffix based on its name. Used by
- *	Suff_GetPath.
- *
- * Input:
- *	s		Suffix to check
- *	sd		Desired name
- *
- * Results:
- *	0 if the suffix is of the given name. non-zero otherwise.
- *
- * Side Effects:
- *	None
- *-----------------------------------------------------------------------
- */
-static int
-SuffSuffHasNameP(const void *s, const void *sname)
-{
-    return (strcmp(sname, ((const Suff *)s)->name));
-}
-
-/*-
- *-----------------------------------------------------------------------
- * SuffSuffIsPrefix  --
- *	See if the suffix described by s is a prefix of the string. Care
- *	must be taken when using this to search for transformations and
- *	what-not, since there could well be two suffixes, one of which
- *	is a prefix of the other...
- *
- * Input:
- *	s		suffix to compare
- *	str		string to examine
- *
- * Results:
- *	0 if s is a prefix of str. non-zero otherwise
- *
- * Side Effects:
- *	None
- *-----------------------------------------------------------------------
- */
-static int
-SuffSuffIsPrefix(const void *s, const void *str)
-{
-    return SuffStrIsPrefix(((const Suff *)s)->name, str) == NULL;
-}
-
-/*-
- *-----------------------------------------------------------------------
  * SuffGNHasNameP  --
  *	See if the graph node has the desired name
  *
@@ -391,15 +325,28 @@ SuffGNHasNameP(const void *gn, const voi
  	    /*********** Maintenance Functions ************/
 
 static void
-SuffUnRef(void *lp, void *sp)
+suff_incref(Suff *s)
 {
-    Lst l = (Lst) lp;
+	s->refCount++;
+}
 
-    LstNode ln = Lst_Member(l, sp);
-    if (ln != NULL) {
-	Lst_Remove(l, ln);
-	((Suff *)sp)->refCount--;
-    }
+static void
+suff_decref(Suff *s)
+{
+	s->refCount--;
+	// XXX should destroy here but we need a cleanup pass first
+}
+
+static void
+SuffUnRef(struct sufflist *l, Suff *s)
+{
+	unsigned pos;
+
+	pos = sufflist_find(l, s);
+	if (pos != ARRAY_NOTFOUND) {
+		sufflist_remove(l, pos);
+		s->refCount--;
+	}
 }
 
 /*-
@@ -434,8 +381,10 @@ SuffFree(void *sp)
 #endif
 
     Lst_Destroy(s->ref, NULL);
-    Lst_Destroy(s->children, NULL);
-    Lst_Destroy(s->parents, NULL);
+    sufflist_setsize(&s->children, 0);
+    sufflist_cleanup(&s->children);
+    sufflist_setsize(&s->parents, 0);
+    sufflist_cleanup(&s->parents);
     for (i=0; i<patharray_num(&s->searchPath); i++) {
 	Dir_Destroy(patharray_get(&s->searchPath, i));
     }
@@ -460,11 +409,11 @@ SuffFree(void *sp)
  *-----------------------------------------------------------------------
  */
 static void
-SuffRemove(Lst l, Suff *s)
+SuffRemove(struct sufflist *l, Suff *s)
 {
     SuffUnRef(l, s);
     if (s->refCount == 0) {
-	SuffUnRef(sufflist, s);
+	SuffUnRef(&sufflist, s);
 	SuffFree(s);
     }
 }
@@ -487,37 +436,34 @@ SuffRemove(Lst l, Suff *s)
  *-----------------------------------------------------------------------
  */
 static void
-SuffInsert(Lst l, Suff *s)
+SuffInsert(struct sufflist *l, Suff *s)
 {
-    LstNode 	  ln;		/* current element in l we're examining */
-    Suff          *s2 = NULL;	/* the suffix descriptor in this element */
+    Suff          *s2 = NULL;	/* current element in l we're examining */
+    unsigned pos, num;
 
-    if (Lst_Open(l) == FAILURE) {
-	return;
-    }
-    while ((ln = Lst_Next(l)) != NULL) {
-	s2 = (Suff *)Lst_Datum(ln);
+    num = sufflist_num(l);
+    for (pos=0; pos<num; pos++) {
+	s2 = sufflist_get(l, pos);
 	if (s2->sNum >= s->sNum) {
 	    break;
 	}
     }
-
-    Lst_Close(l);
     if (DEBUG(SUFF)) {
 	fprintf(debug_file, "inserting %s(%d)...", s->name, s->sNum);
     }
-    if (ln == NULL) {
+    if (pos == num) {
 	if (DEBUG(SUFF)) {
 	    fprintf(debug_file, "at end of list\n");
 	}
-	(void)Lst_AtEnd(l, s);
+	sufflist_add(l, s, NULL);
 	s->refCount++;
 	(void)Lst_AtEnd(s->ref, l);
     } else if (s2->sNum != s->sNum) {
 	if (DEBUG(SUFF)) {
 	    fprintf(debug_file, "before %s(%d)\n", s2->name, s2->sNum);
 	}
-	(void)Lst_InsertBefore(l, ln, s);
+	sufflist_insert(l, pos);
+	sufflist_set(l, pos, s);
 	s->refCount++;
 	(void)Lst_AtEnd(s->ref, l);
     } else if (DEBUG(SUFF)) {
@@ -546,9 +492,14 @@ void
 Suff_ClearSuffixes(void)
 {
 #ifdef CLEANUP
-    Lst_Concat(suffClean, sufflist, LST_CONCLINK);
+    unsigned i, num;
+
+    num = sufflist_num(&sufflist);
+    for (i=0; i<num; i++) {
+	sufflist_add(&suffClean, sufflist_get(&sufflist, i), NULL);
+    }
 #endif
-    sufflist = Lst_Init(FALSE);
+    sufflist_setsize(&sufflist, 0);
     sNum = 0;
     suffNull = emptySuff;
 }
@@ -574,36 +525,62 @@ Suff_ClearSuffixes(void)
 static Boolean
 SuffParseTransform(char *str, Suff **srcPtr, Suff **targPtr)
 {
-    LstNode		srcLn;	    /* element in suffix list of trans source*/
-    Suff		*src;	    /* Source of transformation */
-    LstNode		targLn;	    /* element in suffix list of trans target*/
-    char		*str2;	    /* Extra pointer (maybe target suffix) */
-    LstNode 	    	singleLn;   /* element in suffix list of any suffix
-				     * that exactly matches str */
-    Suff    	    	*single = NULL;/* Source of possible transformation to
-				     * null suffix */
-
-    srcLn = NULL;
-    singleLn = NULL;
-
-    /*
-     * Loop looking first for a suffix that matches the start of the
-     * string and then for one that exactly matches the rest of it. If
-     * we can find two that meet these criteria, we've successfully
-     * parsed the string.
-     */
-    for (;;) {
-	if (srcLn == NULL) {
-	    srcLn = Lst_Find(sufflist, str, SuffSuffIsPrefix);
-	} else {
-	    srcLn = Lst_FindFrom(sufflist, Lst_Succ(srcLn), str,
-				  SuffSuffIsPrefix);
+	/*
+	 * STR is a string that might be of the form ".c.o". If it is
+	 * two defined suffixes jammed together, find them and return
+	 * TRUE.  If there is more than one possible decomposition,
+	 * return the first one, as determined by the order of the
+	 * global suffix list. If there is no decomposition, but the
+	 * whole string matches a defined suffix, decompose it into
+	 * that and the empty suffix. If nothing matches, return
+	 * FALSE.
+	 *
+	 * Because SUFFLIST is not kept in an order useful for this
+	 * lookup, we need to search stupidly. The number of suffixes
+	 * in typical usage is not *that* large, but this function is
+	 * called for every target the parser scans (I think more than
+	 * once actually) and this happens inside the expansion of for
+	 * loops, so it might be worth maintaining an index on
+	 * SUFFLIST to speed this up.
+	 */
+
+	unsigned numsuffixes;
+	unsigned srcpos, targpos;
+	Suff *src, *targ;
+	const char *targname;
+	size_t targlen;
+	Suff *srctoempty;
+
+	srctoempty = NULL;
+	numsuffixes = sufflist_num(&sufflist);
+	for (srcpos = 0; srcpos < numsuffixes; srcpos++) {
+		src = sufflist_get(&sufflist, srcpos);
+		targname = SuffStrIsPrefix(src->name, str);
+		if (targname == NULL) {
+			/* src->name is not a prefix of STR */
+			continue;
+		}
+		targlen = strlen(targname);
+		if (targlen == 0) {
+			/* found a match for all of STR */
+			srctoempty = src;
+			continue;
+		}
+		for (targpos = 0; targpos < numsuffixes; targpos++) {
+			targ = sufflist_get(&sufflist, targpos);
+			if (targ->nameLen != targlen) {
+				continue;
+			}
+			if (!strcmp(targ->name, targname)) {
+				/* found */
+				*srcPtr = src;
+				*targPtr = targ;
+				return TRUE;
+			}
+		}
 	}
-	if (srcLn == NULL) {
-	    /*
-	     * Ran out of source suffixes -- no such rule
-	     */
-	    if (singleLn != NULL) {
+
+	if (srctoempty != NULL) {
 		/*
 		 * Not so fast Mr. Smith! There was a suffix that encompassed
 		 * the entire string, so we assume it was a transformation
@@ -613,26 +590,13 @@ SuffParseTransform(char *str, Suff **src
 		 *
 		 * XXX: Use emptySuff over suffNull?
 		 */
-		*srcPtr = single;
+		*srcPtr = srctoempty;
 		*targPtr = suffNull;
-		return(TRUE);
-	    }
-	    return (FALSE);
+		return TRUE;
 	}
-	src = (Suff *)Lst_Datum(srcLn);
-	str2 = str + src->nameLen;
-	if (*str2 == '\0') {
-	    single = src;
-	    singleLn = srcLn;
-	} else {
-	    targLn = Lst_Find(sufflist, str2, SuffSuffHasNameP);
-	    if (targLn != NULL) {
-		*srcPtr = src;
-		*targPtr = (Suff *)Lst_Datum(targLn);
-		return (TRUE);
-	    }
-	}
-    }
+
+	/* nothing found */
+	return FALSE;
 }
 
 /*-
@@ -716,8 +680,8 @@ Suff_AddTransform(char *line)
 	fprintf(debug_file, "defining transformation from `%s' to `%s'\n",
 		s->name, t->name);
     }
-    SuffInsert(t->children, s);
-    SuffInsert(s->parents, t);
+    SuffInsert(&t->children, s);
+    SuffInsert(&s->parents, t);
 
     return (gn);
 }
@@ -761,17 +725,15 @@ Suff_EndTransform(void *gnp, void *dummy
 	 * actual transformation rules. (e.g. .DEFAULT)
 	 */
 	if (SuffParseTransform(gn->name, &s, &t)) {
-	    Lst	 p;
-
 	    if (DEBUG(SUFF)) {
 		fprintf(debug_file, "deleting transformation from `%s' to `%s'\n",
 		s->name, t->name);
 	    }
 
 	    /*
-	     * Store s->parents because s could be deleted in SuffRemove
+	     * Hold a reference to s so it doesn't evaporate under us
 	     */
-	    p = s->parents;
+	    suff_incref(s);
 
 	    /*
 	     * Remove the source from the target's children list. We check for a
@@ -781,12 +743,14 @@ Suff_EndTransform(void *gnp, void *dummy
 	     * We'll be called twice when the next target is seen, but .c and .o
 	     * are only linked once...
 	     */
-	    SuffRemove(t->children, s);
+	    SuffRemove(&t->children, s);
 
 	    /*
 	     * Remove the target from the source's parents list
 	     */
-	    SuffRemove(p, t);
+	    SuffRemove(&s->parents, t);
+
+	    suff_decref(s);
 	}
     } else if ((gn->type & OP_TRANSFORM) && DEBUG(SUFF)) {
 	fprintf(debug_file, "transformation %s complete\n", gn->name);
@@ -823,26 +787,30 @@ SuffRebuildGraph(void *transformp, void 
 {
     GNode   	*transform = (GNode *)transformp;
     Suff    	*s = (Suff *)sp;
-    char 	*cp;
-    LstNode	ln;
+    const char 	*cp;
     Suff  	*s2;
     SuffixCmpData sd;
+    unsigned i, numsuffixes;
+    size_t matchlen;
+
+    numsuffixes = sufflist_num(&sufflist);
 
     /*
      * First see if it is a transformation from this suffix.
      */
-    cp = UNCONST(SuffStrIsPrefix(s->name, transform->name));
+    cp = SuffStrIsPrefix(s->name, transform->name);
     if (cp != NULL) {
-	ln = Lst_Find(sufflist, cp, SuffSuffHasNameP);
-	if (ln != NULL) {
-	    /*
-	     * Found target. Link in and return, since it can't be anything
-	     * else.
-	     */
-	    s2 = (Suff *)Lst_Datum(ln);
-	    SuffInsert(s2->children, s);
-	    SuffInsert(s->parents, s2);
-	    return(0);
+	for (i=0; i<numsuffixes; i++) {
+	    s2 = sufflist_get(&sufflist, i);
+	    if (!strcmp(s2->name, cp)) {
+		/*
+		 * Found target. Link in and return, since it can't be
+		 * anything else.
+		 */
+		SuffInsert(&s2->children, s);
+		SuffInsert(&s->parents, s2);
+		return 0;
+	    }
 	}
     }
 
@@ -854,21 +822,25 @@ SuffRebuildGraph(void *transformp, void 
     cp = SuffSuffIsSuffix(s, &sd);
     if (cp != NULL) {
 	/*
-	 * Null-terminate the source suffix in order to find it.
-	 */
-	cp[1] = '\0';
-	ln = Lst_Find(sufflist, transform->name, SuffSuffHasNameP);
-	/*
-	 * Replace the start of the target suffix
-	 */
-	cp[1] = s->name[0];
-	if (ln != NULL) {
-	    /*
-	     * Found it -- establish the proper relationship
-	     */
-	    s2 = (Suff *)Lst_Datum(ln);
-	    SuffInsert(s->children, s2);
-	    SuffInsert(s2->parents, s);
+	 * For reasons best known to whoever wrote it,
+	 * SuffSuffIsSuffix returns one less than the pointer to
+	 * the suffix inside transform->name, instead of the
+	 * pointer to the suffix.
+	 */
+	cp++;
+
+	matchlen = cp - transform->name;
+	for (i=0; i<numsuffixes; i++) {
+	    s2 = sufflist_get(&sufflist, i);
+	    if (s2->nameLen == matchlen &&
+		!memcmp(s2->name, transform->name, matchlen)) {
+		/*
+		 * Found it -- establish the proper relationship
+		 */
+		SuffInsert(&s->children, s2);
+		SuffInsert(&s2->parents, s);
+		break;
+	    }
 	}
     }
     return(0);
@@ -925,8 +897,8 @@ SuffScanTargets(GNode *target, GNodeSuff
 	    fprintf(debug_file, "defining transformation from `%s' to `%s'\n",
 		s->name, t->name);
 	}
-	SuffInsert(t->children, s);
-	SuffInsert(s->parents, t);
+	SuffInsert(&t->children, s);
+	SuffInsert(&s->parents, t);
     }
     return 0;
 }
@@ -950,30 +922,70 @@ SuffScanTargets(GNode *target, GNodeSuff
  *	transform and that target happened to be the main target.
  *-----------------------------------------------------------------------
  */
+
+static Suff *
+SuffFindByName(const char *name)
+{
+	unsigned i, num;
+	Suff *s;
+
+	num = sufflist_num(&sufflist);
+	for (i=0; i<num; i++) {
+		s = sufflist_get(&sufflist, i);
+		if (!strcmp(s->name, name)) {
+			return s;
+		}
+	}
+	return NULL;
+}
+
+static Suff *
+SuffFindBySuffix(struct sufflist *list, const char *name)
+{
+	unsigned i, num;
+	Suff *s;
+	SuffixCmpData sd;   /* Search string data */
+
+	sd.len = strlen(name);
+	sd.ename = name + sd.len;
+
+	num = sufflist_num(list);
+	for (i=0; i<num; i++) {
+		s = sufflist_get(list, i);
+		if (SuffSuffIsSuffix(s, &sd) != NULL) {
+			return s;
+		}
+	}
+	return NULL;
+}
+
 void
 Suff_AddSuffix(char *str, GNode **gn)
 {
-    Suff          *s;	    /* new suffix descriptor */
-    LstNode 	  ln;
-    GNodeSuff	  gs;
-    GList *alltargets;
-    unsigned i, num;
+	Suff *s;	    /* new suffix descriptor */
+	GNodeSuff gs;
+	GList *alltargets;
+	unsigned i, num;
+
+	s = SuffFindByName(str);
+	if (s != NULL) {
+		/* Already exists. */
+		return;
+	}
 
-    ln = Lst_Find(sufflist, str, SuffSuffHasNameP);
-    if (ln == NULL) {
 	s = bmake_malloc(sizeof(Suff));
 
 	s->name =   	bmake_strdup(str);
 	s->nameLen = 	strlen(s->name);
 	patharray_init(&s->searchPath);
-	s->children = 	Lst_Init(FALSE);
-	s->parents = 	Lst_Init(FALSE);
+	sufflist_init(&s->children);
+	sufflist_init(&s->parents);
 	s->ref = 	Lst_Init(FALSE);
 	s->sNum =   	sNum++;
 	s->flags =  	0;
 	s->refCount =	1;
 
-	(void)Lst_AtEnd(sufflist, s);
+	sufflist_add(&sufflist, s, NULL);
 	/*
 	 * We also look at our existing targets list to see if adding
 	 * this suffix will make one of our current targets mutate into
@@ -996,7 +1008,6 @@ Suff_AddSuffix(char *str, GNode **gn)
 	 * XXX: Only do this after a Suff_ClearSuffixes?
 	 */
 	Lst_ForEach(transforms, SuffRebuildGraph, s);
-    }
 }
 
 /*-
@@ -1015,14 +1026,12 @@ Suff_AddSuffix(char *str, GNode **gn)
 struct patharray *
 Suff_GetPath(char *sname)
 {
-    LstNode   	  ln;
     Suff    	  *s;
 
-    ln = Lst_Find(sufflist, sname, SuffSuffHasNameP);
-    if (ln == NULL) {
+    s = SuffFindByName(sname);
+    if (s == NULL) {
 	return NULL;
     } else {
-	s = (Suff *)Lst_Datum(ln);
 	return &s->searchPath;
     }
 }
@@ -1050,21 +1059,17 @@ void
 Suff_DoPaths(void)
 {
     Suff	   	*s;
-    LstNode  		ln;
     char		*ptr;
     struct patharray   	inIncludes; /* Cumulative .INCLUDES path */
     struct patharray   	inLibs;	    /* Cumulative .LIBS path */
     unsigned i, num;
 
-    if (Lst_Open(sufflist) == FAILURE) {
-	return;
-    }
-
     patharray_init(&inIncludes);
     patharray_init(&inLibs);
 
-    while ((ln = Lst_Next(sufflist)) != NULL) {
-	s = (Suff *)Lst_Datum(ln);
+    num = sufflist_num(&sufflist);
+    for (i=0; i<num; i++) {
+	s = sufflist_get(&sufflist, i);
 	if (patharray_num(&s->searchPath) > 0) {
 #ifdef INCLUDES
 	    if (s->flags & SUFF_INCLUDE) {
@@ -1076,8 +1081,6 @@ Suff_DoPaths(void)
 		Dir_Concat(&inLibs, &s->searchPath);
 	    }
 #endif /* LIBRARIES */
-	} else {
-	    num = patharray_num(&s->searchPath);
 	}
 	Dir_Concat(&s->searchPath, &dirSearchPath);
     }
@@ -1103,8 +1106,6 @@ Suff_DoPaths(void)
     }
     patharray_setsize(&inLibs, 0);
     patharray_cleanup(&inLibs);
-
-    Lst_Close(sufflist);
 }
 
 /*-
@@ -1128,12 +1129,10 @@ Suff_DoPaths(void)
 void
 Suff_AddInclude(char *sname)
 {
-    LstNode	  ln;
     Suff	  *s;
 
-    ln = Lst_Find(sufflist, sname, SuffSuffHasNameP);
-    if (ln != NULL) {
-	s = (Suff *)Lst_Datum(ln);
+    s = SuffFindByName(sname);
+    if (s != NULL) {
 	s->flags |= SUFF_INCLUDE;
     }
 }
@@ -1160,12 +1159,10 @@ Suff_AddInclude(char *sname)
 void
 Suff_AddLib(char *sname)
 {
-    LstNode	  ln;
     Suff	  *s;
 
-    ln = Lst_Find(sufflist, sname, SuffSuffHasNameP);
-    if (ln != NULL) {
-	s = (Suff *)Lst_Datum(ln);
+    s = SuffFindByName(sname);
+    if (s != NULL) {
 	s->flags |= SUFF_LIBRARY;
     }
 }
@@ -1180,25 +1177,21 @@ Suff_AddLib(char *sname)
  *	the prefix is used unaltered as the file name in the Src structure.
  *
  * Input:
- *	sp		suffix for which to create a Src structure
- *	lsp		list and parent for the new Src
+ *	s		suffix for which to create a Src structure
+ *	ll		list for the new Src
+ *	targ		parent for the new Src
  *
  * Results:
- *	always returns 0
+ *	nil
  *
  * Side Effects:
  *	A Src structure is created and tacked onto the end of the list
  *-----------------------------------------------------------------------
  */
-static int
-SuffAddSrc(void *sp, void *lsp)
+static void
+SuffAddSrc(Suff *s, Lst ll, Src *targ)
 {
-    Suff	*s = (Suff *)sp;
-    LstSrc      *ls = (LstSrc *)lsp;
     Src         *s2;	    /* new Src structure */
-    Src    	*targ; 	    /* Target structure */
-
-    targ = ls->s;
 
     if ((s->flags & SUFF_NULL) && (*s->name != '\0')) {
 	/*
@@ -1215,7 +1208,7 @@ SuffAddSrc(void *sp, void *lsp)
 	s->refCount++;
 	s2->children =	0;
 	targ->children += 1;
-	(void)Lst_AtEnd(ls->l, s2);
+	(void)Lst_AtEnd(ll, s2);
 #ifdef DEBUG_SRC
 	s2->cp = Lst_Init(FALSE);
 	Lst_AtEnd(targ->cp, s2);
@@ -1233,7 +1226,7 @@ SuffAddSrc(void *sp, void *lsp)
     s->refCount++;
     s2->children =  0;
     targ->children += 1;
-    (void)Lst_AtEnd(ls->l, s2);
+    (void)Lst_AtEnd(ll, s2);
 #ifdef DEBUG_SRC
     s2->cp = Lst_Init(FALSE);
     Lst_AtEnd(targ->cp, s2);
@@ -1241,8 +1234,6 @@ SuffAddSrc(void *sp, void *lsp)
     Lst_ForEach(ls->l, PrintAddr, NULL);
     fprintf(debug_file, "\n");
 #endif
-
-    return(0);
 }
 
 /*-
@@ -1264,12 +1255,14 @@ SuffAddSrc(void *sp, void *lsp)
 static void
 SuffAddLevel(Lst l, Src *targ)
 {
-    LstSrc         ls;
+	unsigned i, num;
+	Suff *s;
 
-    ls.s = targ;
-    ls.l = l;
-
-    Lst_ForEach(targ->suff->children, SuffAddSrc, &ls);
+	num = sufflist_num(&targ->suff->children);
+	for (i=0; i<num; i++) {
+		s = sufflist_get(&targ->suff->children, i);
+		SuffAddSrc(s, l, targ);
+	}
 }
 
 /*-
@@ -1426,7 +1419,6 @@ SuffFindThem(Lst srcs, Lst slst)
 static Src *
 SuffFindCmds(Src *targ, Lst slst)
 {
-    LstNode		ln;	/* General-purpose list node */
     GNode		*t, 	/* Target GNode */
 	    	  	*s; 	/* Source GNode */
     int	    	  	prefLen;/* The length of the defined prefix */
@@ -1469,8 +1461,8 @@ SuffFindCmds(Src *targ, Lst slst)
 	 * The node matches the prefix ok, see if it has a known
 	 * suffix.
 	 */
-	ln = Lst_Find(sufflist, &cp[prefLen], SuffSuffHasNameP);
-	if (ln == NULL)
+	suff = SuffFindByName(&cp[prefLen]);
+	if (suff == NULL)
 	    continue;
 	/*
 	 * It even has a known suffix, see if there's a transformation
@@ -1478,10 +1470,10 @@ SuffFindCmds(Src *targ, Lst slst)
 	 *
 	 * XXX: Handle multi-stage transformations here, too.
 	 */
-	suff = (Suff *)Lst_Datum(ln);
 
-	if (Lst_Member(suff->parents, targ->suff) != NULL)
+	if (sufflist_contains(&suff->parents, targ->suff)) {
 	    break;
+	}
     }
 
     /*
@@ -1802,17 +1794,10 @@ Suff_FindPath(GNode* gn)
     Suff *suff = gn->suffix;
 
     if (suff == NULL) {
-	SuffixCmpData sd;   /* Search string data */
-	LstNode ln;
-	sd.len = strlen(gn->name);
-	sd.ename = gn->name + sd.len;
-	ln = Lst_Find(sufflist, &sd, SuffSuffIsSuffixP);
-
+	suff = SuffFindBySuffix(&sufflist, gn->name);
 	if (DEBUG(SUFF)) {
 	    fprintf(debug_file, "Wildcard expanding \"%s\"...", gn->name);
 	}
-	if (ln != NULL)
-	    suff = (Suff *)Lst_Datum(ln);
 	/* XXX: Here we can save the suffix so we don't have to do this again */
     }
 
@@ -2017,25 +2002,19 @@ SuffFindArchiveDeps(GNode *gn, Lst slst)
 	 * through the entire list, we just look at suffixes to which the
 	 * member's suffix may be transformed...
 	 */
-	LstNode		ln;
-	SuffixCmpData	sd;		/* Search string data */
+	Suff *suff;
 
 	/*
 	 * Use first matching suffix...
 	 */
-	sd.len = eoarch - gn->name;
-	sd.ename = eoarch;
-	ln = Lst_Find(ms->parents, &sd, SuffSuffIsSuffixP);
-
-	if (ln != NULL) {
+	suff = SuffFindBySuffix(&ms->parents, eoarch);
+	if (suff != NULL) {
 	    /*
 	     * Got one -- apply it
 	     */
-	    if (!SuffApplyTransform(gn, mem, (Suff *)Lst_Datum(ln), ms) &&
-		DEBUG(SUFF))
-	    {
+	    if (!SuffApplyTransform(gn, mem, suff, ms) && DEBUG(SUFF)) {
 		fprintf(debug_file, "\tNo transformation from %s -> %s\n",
-		       ms->name, ((Suff *)Lst_Datum(ln))->name);
+		       ms->name, suff->name);
 	    }
 	}
     }
@@ -2083,7 +2062,6 @@ SuffFindNormalDeps(GNode *gn, Lst slst)
 {
     char    	*eoname;    /* End of name */
     char    	*sopref;    /* Start of prefix */
-    LstNode 	ln;    /* Next suffix node to check */
     Lst	    	srcs;	    /* List of sources at which to look */
     Lst	    	targs;	    /* List of targets to which things can be
 			     * transformed. They all have the same file,
@@ -2093,6 +2071,8 @@ SuffFindNormalDeps(GNode *gn, Lst slst)
     char    	*pref;	    /* Prefix to use */
     Src	    	*targ;	    /* General Src target pointer */
     SuffixCmpData sd;	    /* Search string data */
+    unsigned pos, num;
+    Suff *suff;
 
 
     sd.len = strlen(gn->name);
@@ -2100,10 +2080,11 @@ SuffFindNormalDeps(GNode *gn, Lst slst)
 
     sopref = gn->name;
 
+    num = sufflist_num(&sufflist);
+
     /*
      * Begin at the beginning...
      */
-    ln = Lst_First(sufflist);
     srcs = Lst_Init(FALSE);
     targs = Lst_Init(FALSE);
 
@@ -2126,13 +2107,14 @@ SuffFindNormalDeps(GNode *gn, Lst slst)
      * Should we find one, we discard the one we found before.
      */
 
-    while (ln != NULL) {
-	/*
-	 * Look for next possible suffix...
-	 */
-	ln = Lst_FindFrom(sufflist, ln, &sd, SuffSuffIsSuffixP);
+    for (pos = 0; pos < num; pos++) {
+	suff = sufflist_get(&sufflist, pos);
+	if (SuffSuffIsSuffix(suff, &sd)) {
+
+	    /*
+	     * Next possible suffix...
+	     */
 
-	if (ln != NULL) {
 	    int	    prefLen;	    /* Length of the prefix */
 
 	    /*
@@ -2140,7 +2122,7 @@ SuffFindNormalDeps(GNode *gn, Lst slst)
 	     */
 	    targ = bmake_malloc(sizeof(Src));
 	    targ->file = bmake_strdup(gn->name);
-	    targ->suff = (Suff *)Lst_Datum(ln);
+	    targ->suff = suff;
 	    targ->suff->refCount++;
 	    targ->node = gn;
 	    targ->parent = NULL;
@@ -2167,11 +2149,6 @@ SuffFindNormalDeps(GNode *gn, Lst slst)
 	     * Record the target so we can nuke it
 	     */
 	    (void)Lst_AtEnd(targs, targ);
-
-	    /*
-	     * Search from this suffix's successor...
-	     */
-	    ln = Lst_Succ(ln);
 	}
     }
 
@@ -2513,14 +2490,13 @@ SuffFindDeps(GNode *gn, Lst slst)
 	 * set the TARGET variable to the node's name in order to give it a
 	 * value).
 	 */
-	LstNode	ln;
 	Suff	*s;
 
-	ln = Lst_Find(sufflist, LIBSUFF, SuffSuffHasNameP);
+	s = SuffFindByName(LIBSUFF);
 	if (gn->suffix)
 	    gn->suffix->refCount--;
-	if (ln != NULL) {
-	    gn->suffix = s = (Suff *)Lst_Datum(ln);
+	if (s != NULL) {
+	    gn->suffix = s;
 	    gn->suffix->refCount++;
 	    Arch_FindLib(gn, &s->searchPath);
 	} else {
@@ -2562,11 +2538,9 @@ void
 Suff_SetNull(char *name)
 {
     Suff    *s;
-    LstNode ln;
 
-    ln = Lst_Find(sufflist, name, SuffSuffHasNameP);
-    if (ln != NULL) {
-	s = (Suff *)Lst_Datum(ln);
+    s = SuffFindByName(name);
+    if (s != NULL) {
 	if (suffNull != NULL) {
 	    suffNull->flags &= ~SUFF_NULL;
 	}
@@ -2596,9 +2570,9 @@ Suff_SetNull(char *name)
 void
 Suff_Init(void)
 {
-    sufflist = Lst_Init(FALSE);
+    sufflist_init(&sufflist);
 #ifdef CLEANUP
-    suffClean = Lst_Init(FALSE);
+    sufflist_init(&suffClean);
 #endif
     srclist = Lst_Init(FALSE);
     transforms = Lst_Init(FALSE);
@@ -2615,8 +2589,8 @@ Suff_Init(void)
     suffNull->nameLen =     0;
     patharray_init(&suffNull->searchPath);
     Dir_Concat(&suffNull->searchPath, &dirSearchPath);
-    suffNull->children =    Lst_Init(FALSE);
-    suffNull->parents =	    Lst_Init(FALSE);
+    sufflist_init(&suffNull->children);
+    sufflist_init(&suffNull->parents);
     suffNull->ref =	    Lst_Init(FALSE);
     suffNull->sNum =   	    sNum++;
     suffNull->flags =  	    SUFF_NULL;
@@ -2638,14 +2612,30 @@ Suff_Init(void)
  *----------------------------------------------------------------------
  */
 
+static void
+sufflist_purge(struct sufflist *l)
+{
+	unsigned i, num;
+	Suff *s;
+
+	num = sufflist_num(l);
+	for (i=0; i<num; i++) {
+		s = sufflist_get(l, i);
+		SuffFree(s);
+	}
+	sufflist_setsize(l, 0);
+}
+
 void
 Suff_End(void)
 {
 #ifdef CLEANUP
-    Lst_Destroy(sufflist, SuffFree);
-    Lst_Destroy(suffClean, SuffFree);
-    if (suffNull)
-	SuffFree(suffNull);
+	sufflist_purge(&sufflist);
+	sufflist_purge(&suffClean);
+	sufflist_cleanup(&sufflist);
+	sufflist_cleanup(&suffClean);
+	if (suffNull)
+		SuffFree(suffNull);
     Lst_Destroy(srclist, NULL);
     Lst_Destroy(transforms, NULL);
 #endif
@@ -2654,18 +2644,18 @@ Suff_End(void)
 
 /********************* DEBUGGING FUNCTIONS **********************/
 
-static int SuffPrintName(void *s, void *dummy)
+static void
+SuffPrintName(Suff *s)
 {
-    fprintf(debug_file, "%s ", ((Suff *)s)->name);
-    return (dummy ? 0 : 0);
+	fprintf(debug_file, "%s ", s->name);
 }
 
-static int
-SuffPrintSuff(void *sp, void *dummy)
+static void
+SuffPrintSuff(Suff *s)
 {
-    Suff    *s = (Suff *)sp;
     int	    flags;
     int	    flag;
+    unsigned i, num;
 
     fprintf(debug_file, "# `%s' [%d] ", s->name, s->refCount);
 
@@ -2690,16 +2680,24 @@ SuffPrintSuff(void *sp, void *dummy)
 	}
     }
     fputc('\n', debug_file);
+
     fprintf(debug_file, "#\tTo: ");
-    Lst_ForEach(s->parents, SuffPrintName, NULL);
+    num = sufflist_num(&s->parents);
+    for (i=0; i<num; i++) {
+	SuffPrintName(sufflist_get(&s->parents, i));
+    }
     fputc('\n', debug_file);
+
     fprintf(debug_file, "#\tFrom: ");
-    Lst_ForEach(s->children, SuffPrintName, NULL);
+    num = sufflist_num(&s->children);
+    for (i=0; i<num; i++) {
+	SuffPrintName(sufflist_get(&s->children, i));
+    }
     fputc('\n', debug_file);
+
     fprintf(debug_file, "#\tSearch Path: ");
     Dir_PrintPath(&s->searchPath);
     fputc('\n', debug_file);
-    return (dummy ? 0 : 0);
 }
 
 static int
@@ -2721,8 +2719,13 @@ SuffPrintTrans(void *tp, void *dummy)
 void
 Suff_PrintAll(void)
 {
+    unsigned i, num;
+
     fprintf(debug_file, "#*** Suffixes:\n");
-    Lst_ForEach(sufflist, SuffPrintSuff, NULL);
+    num = sufflist_num(&sufflist);
+    for (i=0; i<num; i++) {
+	SuffPrintSuff(sufflist_get(&sufflist, i));
+    }
 
     fprintf(debug_file, "#*** Transformations:\n");
     Lst_ForEach(transforms, SuffPrintTrans, NULL);

Reply via email to