Module Name: othersrc Committed By: dholland Date: Sat Mar 23 17:33:58 UTC 2013
Modified Files: othersrc/usr.bin/dholland-make2: suff.c Log Message: More arrays, fewer lists. To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 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/suff.c diff -u othersrc/usr.bin/dholland-make2/suff.c:1.10 othersrc/usr.bin/dholland-make2/suff.c:1.11 --- othersrc/usr.bin/dholland-make2/suff.c:1.10 Sat Mar 23 17:09:40 2013 +++ othersrc/usr.bin/dholland-make2/suff.c Sat Mar 23 17:33:58 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: suff.c,v 1.10 2013/03/23 17:09:40 dholland Exp $ */ +/* $NetBSD: suff.c,v 1.11 2013/03/23 17:33:58 dholland Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -131,7 +131,7 @@ #include "hash.h" #include "dir.h" -MAKE_RCSID("$NetBSD: suff.c,v 1.10 2013/03/23 17:09:40 dholland Exp $"); +MAKE_RCSID("$NetBSD: suff.c,v 1.11 2013/03/23 17:33:58 dholland Exp $"); /* * Structure describing an individual suffix. @@ -168,11 +168,15 @@ typedef struct { /* * Structure used in the search for implied sources. */ -typedef struct _Src { + +struct Src; +DECLARRAY_BYTYPE(srclist, struct Src, static); + +typedef struct Src { char *file; /* The file to look for */ char *pref; /* Prefix from which file was formed */ Suff *suff; /* The suffix on the file */ - struct _Src *parent; /* The Src for which this is a source */ + struct Src *parent; /* The Src for which this is a source */ GNode *node; /* The node describing the file */ int children; /* Count of existing children (so we don't free * this thing too early or never nuke it) */ @@ -193,14 +197,15 @@ typedef struct { } GNodeSuff; DEFARRAY_BYTYPE(sufflist, Suff, MAKE_ATTR_UNUSED static); +DEFARRAY_BYTYPE(srclist, Src, MAKE_ATTR_UNUSED static); #define CLEANUP -static struct sufflist sufflist; /* suffixes */ +static struct sufflist sufflist; /* all current suffixes */ #ifdef CLEANUP static struct sufflist suffClean; /* suffixes to be cleaned */ #endif -static Lst srclist; /* Lst of sources */ +static struct srclist srclist; /* sources */ static Lst transforms; /* Lst of transformation rules */ static int sNum = 0; /* Counter for assigning suffix numbers */ @@ -219,17 +224,17 @@ static void SuffInsert(struct sufflist * static void SuffRemove(struct sufflist *, Suff *); static Boolean SuffParseTransform(char *, Suff **, Suff **); static int SuffRebuildGraph(void *, void *); -static void SuffAddSrc(Suff *, Lst, Src *); -static int SuffRemoveSrc(Lst); -static void SuffAddLevel(Lst, Src *); -static Src *SuffFindThem(Lst, Lst); -static Src *SuffFindCmds(Src *, Lst); +static void SuffAddSrc(Suff *, struct srclist *, Src *); +static int SuffRemoveSrc(struct srclist *); +static void SuffAddLevel(struct srclist *, Src *); +static Src *SuffFindThem(struct srclist *, struct srclist *); +static Src *SuffFindCmds(Src *, struct srclist *); static unsigned SuffExpandChildren(GNode *, unsigned, GNode *); static unsigned SuffExpandWildcards(GNode *, unsigned, GNode *); static Boolean SuffApplyTransform(GNode *, GNode *, Suff *, Suff *); -static void SuffFindDeps(GNode *, Lst); -static void SuffFindArchiveDeps(GNode *, Lst); -static void SuffFindNormalDeps(GNode *, Lst); +static void SuffFindDeps(GNode *, struct srclist *); +static void SuffFindArchiveDeps(GNode *, struct srclist *); +static void SuffFindNormalDeps(GNode *, struct srclist *); static void SuffPrintName(Suff *); static void SuffPrintSuff(Suff *); static int SuffPrintTrans(void *, void *); @@ -1189,7 +1194,7 @@ Suff_AddLib(char *sname) *----------------------------------------------------------------------- */ static void -SuffAddSrc(Suff *s, Lst ll, Src *targ) +SuffAddSrc(Suff *s, struct srclist *ll, Src *targ) { Src *s2; /* new Src structure */ @@ -1208,7 +1213,7 @@ SuffAddSrc(Suff *s, Lst ll, Src *targ) s->refCount++; s2->children = 0; targ->children += 1; - (void)Lst_AtEnd(ll, s2); + srclist_add(ll, s2, NULL); #ifdef DEBUG_SRC s2->cp = Lst_Init(FALSE); Lst_AtEnd(targ->cp, s2); @@ -1226,7 +1231,7 @@ SuffAddSrc(Suff *s, Lst ll, Src *targ) s->refCount++; s2->children = 0; targ->children += 1; - (void)Lst_AtEnd(ll, s2); + srclist_add(ll, s2, NULL); #ifdef DEBUG_SRC s2->cp = Lst_Init(FALSE); Lst_AtEnd(targ->cp, s2); @@ -1253,7 +1258,7 @@ SuffAddSrc(Suff *s, Lst ll, Src *targ) *----------------------------------------------------------------------- */ static void -SuffAddLevel(Lst l, Src *targ) +SuffAddLevel(struct srclist *l, Src *targ) { unsigned i, num; Suff *s; @@ -1278,24 +1283,20 @@ SuffAddLevel(Lst l, Src *targ) *---------------------------------------------------------------------- */ static int -SuffRemoveSrc(Lst l) +SuffRemoveSrc(struct srclist *l) { - LstNode ln; Src *s; - int t = 0; + unsigned i, num; - if (Lst_Open(l) == FAILURE) { - return 0; - } #ifdef DEBUG_SRC fprintf(debug_file, "cleaning %lx: ", (unsigned long) l); Lst_ForEach(l, PrintAddr, NULL); fprintf(debug_file, "\n"); #endif - - while ((ln = Lst_Next(l)) != NULL) { - s = (Src *)Lst_Datum(ln); + num = srclist_num(l); + for (i=0; i<num; i++) { + s = srclist_get(l, i); if (s->children == 0) { free(s->file); if (!s->parent) @@ -1312,10 +1313,8 @@ SuffRemoveSrc(Lst l) fprintf(debug_file, "free: [l=%x] p=%x %d\n", l, s, s->children); Lst_Destroy(s->cp, NULL); #endif - Lst_Remove(l, ln); + srclist_remove(l, i); free(s); - t |= 1; - Lst_Close(l); return TRUE; } #ifdef DEBUG_SRC @@ -1327,9 +1326,7 @@ SuffRemoveSrc(Lst l) #endif } - Lst_Close(l); - - return t; + return FALSE; } /*- @@ -1348,7 +1345,7 @@ SuffRemoveSrc(Lst l) *----------------------------------------------------------------------- */ static Src * -SuffFindThem(Lst srcs, Lst slst) +SuffFindThem(struct srclist *srcs, struct srclist *slst) { Src *s; /* current Src */ Src *rs; /* returned Src */ @@ -1356,8 +1353,10 @@ SuffFindThem(Lst srcs, Lst slst) rs = NULL; - while (!Lst_IsEmpty (srcs)) { - s = (Src *)Lst_DeQueue(srcs); + /* XXX there must be a better way to write this loop */ + while (srclist_num(srcs) > 0) { + s = srclist_get(srcs, 0); + srclist_remove(srcs, 0); if (DEBUG(SUFF)) { fprintf(debug_file, "\ttrying %s...", s->file); @@ -1389,7 +1388,7 @@ SuffFindThem(Lst srcs, Lst slst) } SuffAddLevel(srcs, s); - Lst_AtEnd(slst, s); + srclist_add(slst, s, NULL); } if (DEBUG(SUFF) && rs) { @@ -1417,7 +1416,7 @@ SuffFindThem(Lst srcs, Lst slst) *----------------------------------------------------------------------- */ static Src * -SuffFindCmds(Src *targ, Lst slst) +SuffFindCmds(Src *targ, struct srclist *slst) { GNode *t, /* Target GNode */ *s; /* Source GNode */ @@ -1496,7 +1495,7 @@ SuffFindCmds(Src *targ, Lst slst) fprintf(debug_file, "3 add %x %x\n", targ, ret); Lst_AtEnd(targ->cp, ret); #endif - Lst_AtEnd(slst, ret); + srclist_add(slst, ret, NULL); if (DEBUG(SUFF)) { fprintf(debug_file, "\tusing existing source %s\n", s->name); } @@ -1923,7 +1922,7 @@ SuffApplyTransform(GNode *tGn, GNode *sG *----------------------------------------------------------------------- */ static void -SuffFindArchiveDeps(GNode *gn, Lst slst) +SuffFindArchiveDeps(GNode *gn, struct srclist *slst) { char *eoarch; /* End of archive portion */ char *eoname; /* End of member portion */ @@ -2058,12 +2057,12 @@ SuffFindArchiveDeps(GNode *gn, Lst slst) *----------------------------------------------------------------------- */ static void -SuffFindNormalDeps(GNode *gn, Lst slst) +SuffFindNormalDeps(GNode *gn, struct srclist *slst) { char *eoname; /* End of name */ char *sopref; /* Start of prefix */ - Lst srcs; /* List of sources at which to look */ - Lst targs; /* List of targets to which things can be + struct srclist srcs; /* Sources at which to look */ + struct srclist targs; /* Targets to which things can be * transformed. They all have the same file, * but different suff and pref fields */ Src *bottom; /* Start of found transformation path */ @@ -2071,7 +2070,7 @@ SuffFindNormalDeps(GNode *gn, Lst slst) char *pref; /* Prefix to use */ Src *targ; /* General Src target pointer */ SuffixCmpData sd; /* Search string data */ - unsigned pos, num; + unsigned pos, i, num; Suff *suff; @@ -2085,8 +2084,8 @@ SuffFindNormalDeps(GNode *gn, Lst slst) /* * Begin at the beginning... */ - srcs = Lst_Init(FALSE); - targs = Lst_Init(FALSE); + srclist_init(&srcs); + srclist_init(&targs); /* * We're caught in a catch-22 here. On the one hand, we want to use any @@ -2143,19 +2142,19 @@ SuffFindNormalDeps(GNode *gn, Lst slst) /* * Add nodes from which the target can be made */ - SuffAddLevel(srcs, targ); + SuffAddLevel(&srcs, targ); /* * Record the target so we can nuke it */ - (void)Lst_AtEnd(targs, targ); + srclist_add(&targs, targ, NULL); } } /* * Handle target of unknown suffix... */ - if (Lst_IsEmpty(targs) && suffNull != NULL) { + if (srclist_num(&targs) == 0 && suffNull != NULL) { if (DEBUG(SUFF)) { fprintf(debug_file, "\tNo known suffix on %s. Using .NULL suffix\n", gn->name); } @@ -2179,7 +2178,7 @@ SuffFindNormalDeps(GNode *gn, Lst slst) * don't do this anymore. */ if (stringarray_num(&gn->commands) == 0) - SuffAddLevel(srcs, targ); + SuffAddLevel(&srcs, targ); else { if (DEBUG(SUFF)) fprintf(debug_file, "not "); @@ -2188,22 +2187,22 @@ SuffFindNormalDeps(GNode *gn, Lst slst) if (DEBUG(SUFF)) fprintf(debug_file, "adding suffix rules\n"); - (void)Lst_AtEnd(targs, targ); + srclist_add(&targs, targ, NULL); } /* * Using the list of possible sources built up from the target suffix(es), * try and find an existing file/target that matches. */ - bottom = SuffFindThem(srcs, slst); + bottom = SuffFindThem(&srcs, slst); if (bottom == NULL) { /* * No known transformations -- use the first suffix found for setting * the local variables. */ - if (!Lst_IsEmpty(targs)) { - targ = (Src *)Lst_Datum(Lst_First(targs)); + if (srclist_num(&targs) > 0) { + targ = srclist_get(&targs, 0); } else { targ = NULL; } @@ -2323,8 +2322,8 @@ sfnd_abort: * up to, but not including, the parent node. */ while (bottom && bottom->parent != NULL) { - if (Lst_Member(slst, bottom) == NULL) { - Lst_AtEnd(slst, bottom); + if (!srclist_contains(slst, bottom)) { + srclist_add(slst, bottom, NULL); } bottom = bottom->parent; } @@ -2398,15 +2397,30 @@ sfnd_abort: * two lists. */ sfnd_return: - if (bottom) - if (Lst_Member(slst, bottom) == NULL) - Lst_AtEnd(slst, bottom); + if (bottom) { + if (!srclist_contains(slst, bottom)) { + srclist_add(slst, bottom, NULL); + } + } - while (SuffRemoveSrc(srcs) || SuffRemoveSrc(targs)) + while (SuffRemoveSrc(&srcs) || SuffRemoveSrc(&targs)) { continue; + } + + num = srclist_num(&srcs); + for (i=0; i<num; i++) { + srclist_add(slst, srclist_get(&srcs, i), NULL); + } + srclist_setsize(&srcs, 0); + + num = srclist_num(&targs); + for (i=0; i<num; i++) { + srclist_add(slst, srclist_get(&targs, i), NULL); + } + srclist_setsize(&targs, 0); - Lst_Concat(slst, srcs, LST_CONCLINK); - Lst_Concat(slst, targs, LST_CONCLINK); + srclist_cleanup(&srcs); + srclist_cleanup(&targs); } @@ -2442,8 +2456,8 @@ void Suff_FindDeps(GNode *gn) { - SuffFindDeps(gn, srclist); - while (SuffRemoveSrc(srclist)) + SuffFindDeps(gn, &srclist); + while (SuffRemoveSrc(&srclist)) continue; } @@ -2454,7 +2468,7 @@ Suff_FindDeps(GNode *gn) * */ static void -SuffFindDeps(GNode *gn, Lst slst) +SuffFindDeps(GNode *gn, struct srclist *slst) { if (gn->type & OP_DEPS_FOUND) { /* @@ -2574,7 +2588,7 @@ Suff_Init(void) #ifdef CLEANUP sufflist_init(&suffClean); #endif - srclist = Lst_Init(FALSE); + srclist_init(&srclist); transforms = Lst_Init(FALSE); sNum = 0; @@ -2636,7 +2650,7 @@ Suff_End(void) sufflist_cleanup(&suffClean); if (suffNull) SuffFree(suffNull); - Lst_Destroy(srclist, NULL); + srclist_cleanup(&srclist); Lst_Destroy(transforms, NULL); #endif }