Instead of dynamically allocating list heads allocated them statically
authorMax Okumoto <okumoto@dragonflybsd.org>
Fri, 17 Dec 2004 08:13:30 +0000 (08:13 +0000)
committerMax Okumoto <okumoto@dragonflybsd.org>
Fri, 17 Dec 2004 08:13:30 +0000 (08:13 +0000)
now that their size is only two pointers. This eliminates a lot of calls
to Lst_Init and from there to malloc together with many calls to
Lst_Destroy (in places where the list is obviously empty). This also
reduces the chance to leave a list uninitilized so we can remove more
NULL pointer checks and probably eliminates a couple of memory leaks.

Taken-from: FreeBSD
Author: harti

19 files changed:
usr.bin/make/Makefile
usr.bin/make/arch.c
usr.bin/make/compat.c
usr.bin/make/cond.c
usr.bin/make/dir.c
usr.bin/make/for.c
usr.bin/make/job.c
usr.bin/make/lst.h
usr.bin/make/lst.lib/lstConcat.c
usr.bin/make/lst.lib/lstDestroy.c
usr.bin/make/lst.lib/lstDupl.c
usr.bin/make/main.c
usr.bin/make/make.c
usr.bin/make/make.h
usr.bin/make/nonints.h
usr.bin/make/parse.c
usr.bin/make/suff.c
usr.bin/make/targ.c
usr.bin/make/var.c

index 40de7bb..9e457ce 100644 (file)
@@ -1,13 +1,13 @@
 #      @(#)Makefile    5.2 (Berkeley) 12/28/90
 # $FreeBSD: src/usr.bin/make/Makefile,v 1.13.2.1 2001/05/25 08:33:40 sobomax Exp $
-# $DragonFly: src/usr.bin/make/Makefile,v 1.14 2004/12/17 07:56:08 okumoto Exp $
+# $DragonFly: src/usr.bin/make/Makefile,v 1.15 2004/12/17 08:13:30 okumoto Exp $
 
 PROG=  make
 CFLAGS+=-I${.CURDIR}
 SRCS=  arch.c buf.c compat.c cond.c dir.c for.c hash.c job.c main.c \
        make.c parse.c str.c suff.c targ.c util.c var.c var_modify.c
 SRCS+= lstAppend.c lstConcat.c lstDeQueue.c lstDestroy.c \
-       lstDupl.c lstFindFrom.c lstForEachFrom.c lstInit.c lstInsert.c \
+       lstDupl.c lstFindFrom.c lstForEachFrom.c lstInsert.c \
        lstMember.c lstRemove.c
 .PATH: ${.CURDIR}/lst.lib
 
index ccdab89..aba0e1b 100644 (file)
@@ -37,7 +37,7 @@
  *
  * @(#)arch.c  8.2 (Berkeley) 1/2/94
  * $FreeBSD: src/usr.bin/make/arch.c,v 1.15.2.1 2001/02/13 03:13:57 will Exp $
- * $DragonFly: src/usr.bin/make/arch.c,v 1.20 2004/12/17 07:56:08 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/arch.c,v 1.21 2004/12/17 08:13:30 okumoto Exp $
  */
 
 /*-
 #include    "dir.h"
 #include    "config.h"
 
-static Lst       *archives;  /* Lst of archives we've already examined */
+/* Lst of archives we've already examined */
+static Lst archives = Lst_Initializer(archives);
 
 typedef struct Arch {
     char         *name;      /* Name of archive */
@@ -332,16 +333,16 @@ Arch_ParseArchive(char **linePtr, Lst *nodeLst, GNode *ctxt)
             */
            free(buf);
        } else if (Dir_HasWildcards(memName)) {
-           Lst *members = Lst_Init();
+           Lst members = Lst_Initializer(members);
            char  *member;
            size_t sz = MAXPATHLEN;
            size_t nsz;
 
            nameBuf = emalloc(sz);
 
-           Dir_Expand(memName, dirSearchPath, members);
-           while (!Lst_IsEmpty(members)) {
-               member = Lst_DeQueue(members);
+           Dir_Expand(memName, &dirSearchPath, &members);
+           while (!Lst_IsEmpty(&members)) {
+               member = Lst_DeQueue(&members);
                nsz = strlen(libName) + strlen(member) + 3; /* 3 = ()+\0 */
                if (sz < nsz) {
                        sz = nsz * 2;
@@ -352,6 +353,7 @@ Arch_ParseArchive(char **linePtr, Lst *nodeLst, GNode *ctxt)
                gn = Targ_FindNode(nameBuf, TARG_CREATE);
                if (gn == NULL) {
                    free(nameBuf);
+                   /* XXXHB Lst_Destroy(&members) */
                    return (FAILURE);
                } else {
                    /*
@@ -365,7 +367,6 @@ Arch_ParseArchive(char **linePtr, Lst *nodeLst, GNode *ctxt)
                    Lst_AtEnd(nodeLst, (void *)gn);
                }
            }
-           Lst_Destroy(members, NOFREE);
            free(nameBuf);
        } else {
            size_t sz = strlen(libName) + strlen(memName) + 3;
@@ -479,7 +480,7 @@ ArchStatMember(char *archive, char *member, Boolean hash)
     if ((cp != NULL) && (strcmp(member, RANLIBMAG) != 0))
        member = cp + 1;
 
-    ln = Lst_Find(archives, archive, ArchFindArchive);
+    ln = Lst_Find(&archives, archive, ArchFindArchive);
     if (ln != NULL) {
        ar = Lst_Datum(ln);
 
@@ -629,7 +630,7 @@ ArchStatMember(char *archive, char *member, Boolean hash)
 
     fclose(arch);
 
-    Lst_AtEnd(archives, ar);
+    Lst_AtEnd(&archives, ar);
 
     /*
      * Now that the archive has been read and cached, we can look into
@@ -1017,7 +1018,7 @@ Arch_MemMTime(GNode *gn)
     char         *nameStart,
                  *nameEnd;
 
-    for (ln = Lst_First(gn->parents); ln != NULL; ln = Lst_Succ(ln)) {
+    for (ln = Lst_First(&gn->parents); ln != NULL; ln = Lst_Succ(ln)) {
        pgn = Lst_Datum(ln);
 
        if (pgn->type & OP_ARCHV) {
@@ -1130,7 +1131,7 @@ Arch_LibOODate(GNode *gn)
 {
     Boolean      oodate;
 
-    if (OP_NOP(gn->type) && Lst_IsEmpty(gn->children)) {
+    if (OP_NOP(gn->type) && Lst_IsEmpty(&gn->children)) {
        oodate = FALSE;
     } else if ((gn->mtime > now) || (gn->mtime < gn->cmtime)) {
        oodate = TRUE;
@@ -1173,16 +1174,11 @@ Arch_LibOODate(GNode *gn)
  * Results:
  *     None.
  *
- * Side Effects:
- *     The 'archives' list is initialized.
- *
  *-----------------------------------------------------------------------
  */
 void
 Arch_Init(void)
 {
-
-    archives = Lst_Init();
 }
 
 /*-
@@ -1202,5 +1198,5 @@ void
 Arch_End(void)
 {
 
-    Lst_Destroy(archives, ArchFree);
+    Lst_Destroy(&archives, ArchFree);
 }
index b99d5ad..142b0c5 100644 (file)
@@ -38,7 +38,7 @@
  *
  * @(#)compat.c        8.2 (Berkeley) 3/19/94
  * $FreeBSD: src/usr.bin/make/compat.c,v 1.16.2.2 2000/07/01 12:24:21 ps Exp $
- * $DragonFly: src/usr.bin/make/Attic/compat.c,v 1.18 2004/12/17 00:02:57 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/Attic/compat.c,v 1.19 2004/12/17 08:13:30 okumoto Exp $
  */
 
 /*-
@@ -159,7 +159,7 @@ CompatInterrupt (int signo)
     if (signo == SIGINT) {
        gn = Targ_FindNode(".INTERRUPT", TARG_NOCREATE);
        if (gn != NULL) {
-           Lst_ForEach(gn->commands, Compat_RunCommand, (void *)gn);
+           Lst_ForEach(&gn->commands, Compat_RunCommand, (void *)gn);
        }
     }
 
@@ -244,7 +244,7 @@ Compat_RunCommand(void *cmdp, void *gnp)
     errCheck = !(gn->type & OP_IGNORE);
     doit = FALSE;
 
-    cmdNode = Lst_Member(gn->commands, cmd);
+    cmdNode = Lst_Member(&gn->commands, cmd);
     cmdStart = Var_Subst(NULL, cmd, gn, FALSE);
 
     /*
@@ -264,7 +264,7 @@ Compat_RunCommand(void *cmdp, void *gnp)
     Lst_Replace (cmdNode, cmdStart);
 
     if ((gn->type & OP_SAVE_CMDS) && (gn != ENDNode)) {
-       Lst_AtEnd(ENDNode->commands, cmdStart);
+       Lst_AtEnd(&ENDNode->commands, cmdStart);
        return (0);
     } else if (strcmp(cmdStart, "...") == 0) {
        gn->type |= OP_SAVE_CMDS;
@@ -480,14 +480,14 @@ CompatMake(void *gnp, void *pgnp)
        gn->make = TRUE;
        gn->made = BEINGMADE;
        Suff_FindDeps(gn);
-       Lst_ForEach(gn->children, CompatMake, gn);
+       Lst_ForEach(&gn->children, CompatMake, gn);
        if (!gn->make) {
            gn->made = ABORTED;
            pgn->make = FALSE;
            return (0);
        }
 
-       if (Lst_Member(gn->iParents, pgn) != NULL) {
+       if (Lst_Member(&gn->iParents, pgn) != NULL) {
            char *p1;
            Var_Set(IMPSRC, Var_Value(TARGET, gn, &p1), pgn);
            free(p1);
@@ -541,7 +541,7 @@ CompatMake(void *gnp, void *pgnp)
             */
            if (!touchFlag) {
                curTarg = gn;
-               Lst_ForEach(gn->commands, Compat_RunCommand, (void *)gn);
+               Lst_ForEach(&gn->commands, Compat_RunCommand, (void *)gn);
                curTarg = NULL;
            } else {
                Job_Touch(gn, gn->type & OP_SILENT);
@@ -585,7 +585,7 @@ CompatMake(void *gnp, void *pgnp)
             * To force things that depend on FRC to be made, so we have to
             * check for gn->children being empty as well...
             */
-           if (!Lst_IsEmpty(gn->commands) || Lst_IsEmpty(gn->children)) {
+           if (!Lst_IsEmpty(&gn->commands) || Lst_IsEmpty(gn->children)) {
                gn->mtime = now;
            }
 #else
@@ -634,7 +634,7 @@ CompatMake(void *gnp, void *pgnp)
         */
        pgn->make = FALSE;
     } else {
-       if (Lst_Member(gn->iParents, pgn) != NULL) {
+       if (Lst_Member(&gn->iParents, pgn) != NULL) {
            char *p1;
            Var_Set(IMPSRC, Var_Value(TARGET, gn, &p1), pgn);
            free(p1);
@@ -707,7 +707,7 @@ Compat_Run(Lst *targs)
     if (!queryFlag) {
        gn = Targ_FindNode(".BEGIN", TARG_NOCREATE);
        if (gn != NULL) {
-           Lst_ForEach(gn->commands, Compat_RunCommand, gn);
+           Lst_ForEach(&gn->commands, Compat_RunCommand, gn);
             if (gn->made == ERROR) {
                 printf("\n\nStop.\n");
                 exit(1);
@@ -742,6 +742,6 @@ Compat_Run(Lst *targs)
      * If the user has defined a .END target, run its commands.
      */
     if (errors == 0) {
-       Lst_ForEach(ENDNode->commands, Compat_RunCommand, gn);
+       Lst_ForEach(&ENDNode->commands, Compat_RunCommand, gn);
     }
 }
index 1ad34ef..052a5da 100644 (file)
@@ -38,7 +38,7 @@
  *
  * @(#)cond.c  8.2 (Berkeley) 1/2/94
  * $FreeBSD: src/usr.bin/make/cond.c,v 1.12.2.1 2003/07/22 08:03:13 ru Exp $
- * $DragonFly: src/usr.bin/make/cond.c,v 1.16 2004/12/17 07:53:57 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/cond.c,v 1.17 2004/12/17 08:13:30 okumoto Exp $
  */
 
 /*-
@@ -331,7 +331,7 @@ CondDoMake(int argLen, char *arg)
     Boolean result;
 
     arg[argLen] = '\0';
-    if (Lst_Find(create, arg, CondStrMatch) == NULL) {
+    if (Lst_Find(&create, arg, CondStrMatch) == NULL) {
        result = FALSE;
     } else {
        result = TRUE;
@@ -361,7 +361,7 @@ CondDoExists(int argLen, char *arg)
     char    *path;
 
     arg[argLen] = '\0';
-    path = Dir_FindFile(arg, dirSearchPath);
+    path = Dir_FindFile(arg, &dirSearchPath);
     if (path != NULL) {
        result = TRUE;
        free(path);
index 8592405..7faebae 100644 (file)
@@ -38,7 +38,7 @@
  *
  * @(#)dir.c   8.2 (Berkeley) 1/2/94
  * $$FreeBSD: src/usr.bin/make/dir.c,v 1.10.2.2 2003/10/08 08:14:22 ru Exp $
- * $DragonFly: src/usr.bin/make/dir.c,v 1.25 2004/12/17 08:06:12 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/dir.c,v 1.26 2004/12/17 08:13:30 okumoto Exp $
  */
 
 /*-
  *     in a cache for when Dir_MTime was actually called.
  */
 
-Lst *dirSearchPath;            /* main search path */
+/* main search path */
+Lst dirSearchPath = Lst_Initializer(dirSearchPath);
 
-static Lst *openDirectories;   /* the list of all open directories */
+/* the list of all open directories */
+static Lst openDirectories = Lst_Initializer(openDirectories);
 
 /*
  * Variables for gathering statistics on the efficiency of the hashing
@@ -207,8 +209,6 @@ void
 Dir_Init(void)
 {
 
-       dirSearchPath = Lst_Init();
-       openDirectories = Lst_Init();
        Hash_InitTable(&mtimes, 0);
 }
 
@@ -229,8 +229,8 @@ Dir_InitDot(void)
 {
        LstNode *ln;
 
-       Dir_AddDir(openDirectories, ".");
-       if ((ln = Lst_Last(openDirectories)) == NULL)
+       Dir_AddDir(&openDirectories, ".");
+       if ((ln = Lst_Last(&openDirectories)) == NULL)
                err(1, "cannot open current directory");
        dot = Lst_Datum(ln);
 
@@ -259,10 +259,10 @@ Dir_End(void)
 
        dot->refCount -= 1;
        Dir_Destroy(dot);
-       Dir_ClearPath(dirSearchPath);
-       Lst_Destroy(dirSearchPath, NOFREE);
-       Dir_ClearPath(openDirectories);
-       Lst_Destroy(openDirectories, NOFREE);
+       Dir_ClearPath(&dirSearchPath);
+       Lst_Destroy(&dirSearchPath, NOFREE);
+       Dir_ClearPath(&openDirectories);
+       Lst_Destroy(&openDirectories, NOFREE);
        Hash_DeleteTable(&mtimes);
 }
 
@@ -610,14 +610,14 @@ Dir_Expand(char *word, Lst *path, Lst *expansions)
                                                char *dp =
                                                    &dirpath[strlen(dirpath)
                                                    - 1];
+                                               Lst tp = Lst_Initializer(tp);
 
                                                if (*dp == '/')
                                                        *dp = '\0';
-                                               path = Lst_Init();
-                                               Dir_AddDir(path, dirpath);
-                                               DirExpandInt(cp + 1, path,
+                                               Dir_AddDir(&tp, dirpath);
+                                               DirExpandInt(cp + 1, &tp,
                                                    expansions);
-                                               Lst_Destroy(path, NOFREE);
+                                               Lst_Destroy(&tp, NOFREE);
                                        }
                                } else {
                                        /*
@@ -941,7 +941,7 @@ Dir_MTime(GNode *gn)
                return (Arch_MTime(gn));
 
        else if (gn->path == NULL)
-               fullName = Dir_FindFile(gn->name, dirSearchPath);
+               fullName = Dir_FindFile(gn->name, &dirSearchPath);
        else
                fullName = gn->path;
 
@@ -999,7 +999,7 @@ Dir_AddDir(Lst *path, char *name)
        DIR *d;                 /* for reading directory */
        struct dirent *dp;      /* entry in directory */
 
-       ln = Lst_Find(openDirectories, name, DirFindName);
+       ln = Lst_Find(&openDirectories, name, DirFindName);
        if (ln != NULL) {
                p = Lst_Datum(ln);
                if (Lst_Member(path, p) == NULL) {
@@ -1042,8 +1042,8 @@ Dir_AddDir(Lst *path, char *name)
                                    (Boolean *)NULL);
                        }
                        closedir(d);
-                       Lst_AtEnd(openDirectories, p);
-                       if (path != openDirectories)
+                       Lst_AtEnd(&openDirectories, p);
+                       if (path != &openDirectories)
                                Lst_AtEnd(path, p);
                }
                DEBUGF(DIR, ("done\n"));
@@ -1138,8 +1138,8 @@ Dir_Destroy(void *pp)
        if (p->refCount == 0) {
                LstNode *ln;
 
-               if ((ln = Lst_Member(openDirectories, p)) != NULL)
-                       Lst_Remove(openDirectories, ln);
+               if ((ln = Lst_Member(&openDirectories, p)) != NULL)
+                       Lst_Remove(&openDirectories, ln);
 
                Hash_DeleteTable(&p->files);
                free(p->name);
@@ -1215,7 +1215,7 @@ Dir_PrintDirectories(void)
            (hits + bigmisses + nearmisses ?
            hits * 100 / (hits + bigmisses + nearmisses) : 0));
        printf("# %-20s referenced\thits\n", "directory");
-       for (ln = Lst_First(openDirectories); ln != NULL; ln = Lst_Succ(ln)) {
+       for (ln = Lst_First(&openDirectories); ln != NULL; ln = Lst_Succ(ln)) {
                p = Lst_Datum(ln);
                printf("# %-20s %10d\t%4d\n", p->name, p->refCount, p->hits);
        }
index 54a6de0..396027a 100644 (file)
@@ -35,7 +35,7 @@
  *
  * @(#)for.c   8.1 (Berkeley) 6/6/93
  * $FreeBSD: src/usr.bin/make/for.c,v 1.10 1999/09/11 13:08:01 hoek Exp $
- * $DragonFly: src/usr.bin/make/for.c,v 1.15 2004/12/17 00:02:57 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/for.c,v 1.16 2004/12/17 08:13:30 okumoto Exp $
  */
 
 /*-
@@ -71,7 +71,7 @@
 static int       forLevel = 0;         /* Nesting level        */
 static char     *forVar;               /* Iteration variable   */
 static Buffer    forBuf;               /* Commands in loop     */
-static Lst       *forLst;              /* List of items        */
+static Lst     forLst;         /* List of items        */
 
 /*
  * State of a for loop.
@@ -79,7 +79,7 @@ static Lst      *forLst;              /* List of items        */
 typedef struct _For {
     Buffer       buf;                  /* Unexpanded buffer    */
     char*        var;                  /* Index name           */
-    Lst          *lst;                 /* List of variables    */
+    Lst          lst;                  /* List of variables    */
     int          lineno;               /* Line #               */
 } For;
 
@@ -167,14 +167,14 @@ For_Eval(char *line)
        /*
         * Make a list with the remaining words
         */
-       forLst = Lst_Init();
+       Lst_Init(&forLst);
        buf = Buf_Init(0);
        sub = Var_Subst(NULL, ptr, VAR_CMD, FALSE);
 
 #define        ADDWORD() \
        Buf_AddBytes(buf, ptr - wrd, (Byte *)wrd), \
        Buf_AddByte(buf, (Byte)'\0'), \
-       Lst_AtFront(forLst, Buf_GetAll(buf, &varlen)), \
+       Lst_AtFront(&forLst, Buf_GetAll(buf, &varlen)), \
        Buf_Destroy(buf, FALSE)
 
        for (ptr = sub; *ptr && isspace((unsigned char)*ptr); ptr++)
@@ -276,19 +276,22 @@ For_Run(int lineno)
 {
     For arg;
 
-    if (forVar == NULL || forBuf == NULL || forLst == NULL)
+    if (forVar == NULL || forBuf == NULL)
        return;
     arg.var = forVar;
     arg.buf = forBuf;
-    arg.lst = forLst;
+
+    /* move the forLst to the arg to get it free for nested for's */
+    Lst_Init(&arg.lst);
+    Lst_Concat(&arg.lst, &forLst, LST_CONCLINK);
+
     arg.lineno = lineno;
     forVar = NULL;
     forBuf = NULL;
-    forLst = NULL;
 
-    Lst_ForEach(arg.lst, ForExec, &arg);
+    Lst_ForEach(&arg.lst, ForExec, &arg);
 
     free(arg.var);
-    Lst_Destroy(arg.lst, free);
+    Lst_Destroy(&arg.lst, free);
     Buf_Destroy(arg.buf, TRUE);
 }
index c8bd4f7..831f01e 100644 (file)
@@ -38,7 +38,7 @@
  *
  * @(#)job.c   8.2 (Berkeley) 3/19/94
  * $FreeBSD: src/usr.bin/make/job.c,v 1.17.2.2 2001/02/13 03:13:57 will Exp $
- * $DragonFly: src/usr.bin/make/job.c,v 1.33 2004/12/17 07:56:08 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/job.c,v 1.34 2004/12/17 08:13:30 okumoto Exp $
  */
 
 #ifndef OLD_JOKE
@@ -213,7 +213,10 @@ char               *shellPath = NULL,      /* full pathname of executable image */
 
 static int     maxJobs;        /* The most children we can run at once */
 STATIC int             nJobs;          /* The number of children currently running */
-STATIC Lst     *jobs;          /* The structures that describe them */
+
+/* The structures that describe them */
+STATIC Lst jobs = Lst_Initializer(jobs);
+
 STATIC Boolean jobFull;        /* Flag to tell when the job table is full. It
                                 * is set TRUE when (1) the total number of
                                 * running jobs equals the maximum allowed */
@@ -239,10 +242,11 @@ STATIC char       *targFmt;       /* Format string to use to head output from a
  * or when Job_CatchChildren detects a job that has
  * been stopped somehow, the job is placed on the stoppedJobs queue to be run
  * when the next job finishes.
+ *
+ * Lst of Job structures describing jobs that were stopped due to
+ * concurrency limits or externally
  */
-STATIC Lst     *stoppedJobs;   /* Lst of Job structures describing
-                                * jobs that were stopped due to concurrency
-                                * limits or externally */
+STATIC Lst stoppedJobs = Lst_Initializer(stoppedJobs);
 
 STATIC int     fifoFd;         /* Fd of our job fifo */
 STATIC char    fifoName[] = "/tmp/make_fifo_XXXXXXXXX";
@@ -360,7 +364,7 @@ JobPassSig(int signo)
     sigprocmask(SIG_SETMASK, &nmask, &omask);
 
     DEBUGF(JOB, ("JobPassSig(%d) called.\n", signo));
-    Lst_ForEach(jobs, JobCondPassSig, &signo);
+    Lst_ForEach(&jobs, JobCondPassSig, &signo);
 
     /*
      * Deal with proper cleanup based on the signal received. We only run
@@ -399,7 +403,7 @@ JobPassSig(int signo)
     KILL(getpid(), signo);
 
     signo = SIGCONT;
-    Lst_ForEach(jobs, JobCondPassSig, &signo);
+    Lst_ForEach(&jobs, JobCondPassSig, &signo);
 
     sigprocmask(SIG_SETMASK, &omask, NULL);
     sigprocmask(SIG_SETMASK, &omask, NULL);
@@ -478,7 +482,7 @@ JobPrintCommand(void *cmdp, void *jobp)
     if (strcmp(cmd, "...") == 0) {
        job->node->type |= OP_SAVE_CMDS;
        if ((job->flags & JOB_IGNDOTS) == 0) {
-           job->tailCmds = Lst_Succ(Lst_Member(job->node->commands, cmd));
+           job->tailCmds = Lst_Succ(Lst_Member(&job->node->commands, cmd));
            return (1);
        }
        return (0);
@@ -495,7 +499,7 @@ JobPrintCommand(void *cmdp, void *jobp)
      * For debugging, we replace each command with the result of expanding
      * the variables in the command.
      */
-    cmdNode = Lst_Member(job->node->commands, cmd);
+    cmdNode = Lst_Member(&job->node->commands, cmd);
     cmdStart = cmd = Var_Subst(NULL, cmd, job->node, FALSE);
     Lst_Replace(cmdNode, cmdStart);
 
@@ -633,7 +637,7 @@ JobSaveCommand(void *cmd, void *gn)
 {
 
     cmd = Var_Subst(NULL, cmd, gn, FALSE);
-    Lst_AtEnd(postCommands->commands, cmd);
+    Lst_AtEnd(&postCommands->commands, cmd);
     return (0);
 }
 
@@ -789,7 +793,7 @@ JobFinish(Job *job, int *status)
            fprintf(out, "*** Stopped -- signal %d\n",
                WSTOPSIG(*status));
            job->flags |= JOB_RESUME;
-           Lst_AtEnd(stoppedJobs, job);
+           Lst_AtEnd(&stoppedJobs, job);
            fflush(out);
            return;
        } else if (WTERMSIG(*status) == SIGCONT) {
@@ -818,7 +822,7 @@ JobFinish(Job *job, int *status)
 #endif
            }
            job->flags &= ~JOB_CONTINUING;
-           Lst_AtEnd(jobs, job);
+           Lst_AtEnd(&jobs, job);
            nJobs += 1;
            DEBUGF(JOB, ("Process %d is continuing locally.\n", job->pid));
            if (nJobs == maxJobs) {
@@ -883,7 +887,7 @@ JobFinish(Job *job, int *status)
         * on the .END target.
         */
        if (job->tailCmds != NULL) {
-           Lst_ForEachFrom(job->node->commands, job->tailCmds,
+           Lst_ForEachFrom(&job->node->commands, job->tailCmds,
                JobSaveCommand, job->node);
        }
        job->node->made = MADE;
@@ -1002,13 +1006,13 @@ Boolean
 Job_CheckCommands(GNode *gn, void (*abortProc)(const char *, ...))
 {
 
-    if (OP_NOP(gn->type) && Lst_IsEmpty(gn->commands) &&
+    if (OP_NOP(gn->type) && Lst_IsEmpty(&gn->commands) &&
        (gn->type & OP_LIB) == 0) {
        /*
         * No commands. Look for .DEFAULT rule from which we might infer
         * commands
         */
-       if ((DEFAULT != NULL) && !Lst_IsEmpty(DEFAULT->commands)) {
+       if ((DEFAULT != NULL) && !Lst_IsEmpty(&DEFAULT->commands)) {
            char *p1;
            /*
             * Make only looks for a .DEFAULT if the node was never the
@@ -1194,7 +1198,7 @@ JobExec(Job *job, char **argv)
      * Now the job is actually running, add it to the table.
      */
     nJobs += 1;
-    Lst_AtEnd(jobs, job);
+    Lst_AtEnd(&jobs, job);
     if (nJobs == maxJobs) {
        jobFull = TRUE;
     }
@@ -1290,7 +1294,7 @@ JobRestart(Job *job)
             * back on the hold queue and mark the table full
             */
            DEBUGF(JOB, ("holding\n"));
-           Lst_AtFront(stoppedJobs, (void *)job);
+           Lst_AtFront(&stoppedJobs, (void *)job);
            jobFull = TRUE;
            DEBUGF(JOB, ("Job queue is full.\n"));
            return;
@@ -1345,7 +1349,7 @@ JobRestart(Job *job)
             * place the job back on the list of stopped jobs.
             */
            DEBUGF(JOB, ("table full\n"));
-           Lst_AtFront(stoppedJobs, (void *)job);
+           Lst_AtFront(&stoppedJobs, (void *)job);
            jobFull = TRUE;
            DEBUGF(JOB, ("Job queue is full.\n"));
        }
@@ -1461,7 +1465,7 @@ JobStart(GNode *gn, int flags, Job *previous)
             * ellipsis, note that there's nothing more to execute.
             */
            if (job->flags & JOB_FIRST)
-               gn->compat_command = Lst_First(gn->commands);
+               gn->compat_command = Lst_First(&gn->commands);
            else
                gn->compat_command = Lst_Succ(gn->compat_command);
 
@@ -1488,7 +1492,7 @@ JobStart(GNode *gn, int flags, Job *previous)
             * We can do all the commands at once. hooray for sanity
             */
            numCommands = 0;
-           Lst_ForEach(gn->commands, JobPrintCommand, job);
+           Lst_ForEach(&gn->commands, JobPrintCommand, job);
 
            /*
             * If we didn't print out any commands to the shell script,
@@ -1514,7 +1518,7 @@ JobStart(GNode *gn, int flags, Job *previous)
         * doesn't do any harm in this case and may do some good.
         */
        if (cmdsOK) {
-           Lst_ForEach(gn->commands, JobPrintCommand, job);
+           Lst_ForEach(&gn->commands, JobPrintCommand, job);
        }
        /*
         * Don't execute the shell, thank you.
@@ -1553,7 +1557,7 @@ JobStart(GNode *gn, int flags, Job *previous)
        if (cmdsOK) {
            if (aborting == 0) {
                if (job->tailCmds != NULL) {
-                   Lst_ForEachFrom(job->node->commands, job->tailCmds,
+                   Lst_ForEachFrom(&job->node->commands, job->tailCmds,
                        JobSaveCommand, job->node);
                }
                job->node->made = MADE;
@@ -1611,7 +1615,7 @@ JobStart(GNode *gn, int flags, Job *previous)
 
        DEBUGF(JOB, ("Can only run job locally.\n"));
        job->flags |= JOB_RESTART;
-       Lst_AtEnd(stoppedJobs, job);
+       Lst_AtEnd(&stoppedJobs, job);
     } else {
        if (nJobs >= maxJobs) {
            /*
@@ -1915,24 +1919,24 @@ Job_CatchChildren(Boolean block)
            break;
        DEBUGF(JOB, ("Process %d exited or stopped.\n", pid));
 
-       jnode = Lst_Find(jobs, &pid, JobCmpPid);
+       jnode = Lst_Find(&jobs, &pid, JobCmpPid);
 
        if (jnode == NULL) {
            if (WIFSIGNALED(status) && (WTERMSIG(status) == SIGCONT)) {
-               jnode = Lst_Find(stoppedJobs, &pid, JobCmpPid);
+               jnode = Lst_Find(&stoppedJobs, &pid, JobCmpPid);
                if (jnode == NULL) {
                    Error("Resumed child (%d) not in table", pid);
                    continue;
                }
                job = Lst_Datum(jnode);
-               Lst_Remove(stoppedJobs, jnode);
+               Lst_Remove(&stoppedJobs, jnode);
            } else {
                Error("Child (%d) not in table?", pid);
                continue;
            }
        } else {
            job = Lst_Datum(jnode);
-           Lst_Remove(jobs, jnode);
+           Lst_Remove(&jobs, jnode);
            nJobs -= 1;
            if (fifoFd >= 0 && maxJobs > 1) {
                write(fifoFd, "+", 1);
@@ -2028,7 +2032,7 @@ Job_CatchOutput(int flag)
            if (--nfds <= 0)
                return;
        }
-       for (ln = Lst_First(jobs); nfds != 0 && ln != NULL; ln = Lst_Succ(ln)) {
+       for (ln = Lst_First(&jobs); nfds != 0 && ln != NULL; ln = Lst_Succ(ln)){
            job = Lst_Datum(ln);
            if (FD_ISSET(job->inPipe, &readfds)) {
                JobDoOutput(job, FALSE);
@@ -2177,8 +2181,6 @@ Job_Init(int maxproc)
     struct sigaction sa;
 
     fifoFd = -1;
-    jobs = Lst_Init();
-    stoppedJobs = Lst_Init();
     env = getenv("MAKE_JOBS_FIFO");
 
     if (env == NULL && maxproc > 1) {
@@ -2358,7 +2360,7 @@ Boolean
 Job_Empty(void)
 {
     if (nJobs == 0) {
-       if (!Lst_IsEmpty(stoppedJobs) && !aborting) {
+       if (!Lst_IsEmpty(&stoppedJobs) && !aborting) {
            /*
             * The job table is obviously not full if it has no jobs in
             * it...Try and restart the stopped jobs.
@@ -2612,7 +2614,7 @@ JobInterrupt(int runINTERRUPT, int signo)
 
     aborting = ABORT_INTERRUPT;
 
-    for (ln = Lst_First(jobs); ln != NULL; ln = Lst_Succ(ln)) {
+    for (ln = Lst_First(&jobs); ln != NULL; ln = Lst_Succ(ln)) {
        job = Lst_Datum(ln);
 
        if (!Targ_Precious(job->node)) {
@@ -2662,7 +2664,7 @@ int
 Job_Finish(void)
 {
 
-    if (postCommands != NULL && !Lst_IsEmpty(postCommands->commands)) {
+    if (postCommands != NULL && !Lst_IsEmpty(&postCommands->commands)) {
        if (errors) {
            Error("Errors reported so .END ignored");
        } else {
@@ -2733,7 +2735,7 @@ Job_AbortAll(void)
     aborting = ABORT_ERROR;
 
     if (nJobs) {
-       for (ln = Lst_First(jobs); ln != NULL; ln = Lst_Succ(ln)) {
+       for (ln = Lst_First(&jobs); ln != NULL; ln = Lst_Succ(ln)) {
            job = Lst_Datum(ln);
 
            /*
@@ -2770,8 +2772,8 @@ Job_AbortAll(void)
 static void
 JobRestartJobs(void)
 {
-    while (!jobFull && !Lst_IsEmpty(stoppedJobs)) {
+    while (!jobFull && !Lst_IsEmpty(&stoppedJobs)) {
        DEBUGF(JOB, ("Job queue is not full. Restarting a stopped job.\n"));
-       JobRestart(Lst_DeQueue(stoppedJobs));
+       JobRestart(Lst_DeQueue(&stoppedJobs));
     }
 }
index b8fec59..d2b6088 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.17 2004/12/17 08:07:49 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/lst.h,v 1.18 2004/12/17 08:13:30 okumoto Exp $
  */
 
 /*-
@@ -103,11 +103,17 @@ typedef   void FreeProc(void *);
  * Creation/destruction functions
  */
 /* Create a new list */
-Lst            *Lst_Init(void);
+#define        Lst_Init(LST)   do {                                            \
+                               (LST)->firstPtr = NULL;                 \
+                               (LST)->lastPtr = NULL;                  \
+                       } while (0)
+#define        Lst_Initializer(NAME)   { NULL, NULL }
+
 /* Duplicate an existing list */
-Lst            *Lst_Duplicate(Lst *, DuplicateProc *);
+void   Lst_Duplicate(Lst *, Lst *, DuplicateProc *);
+
 /* Destroy an old one */
-void           Lst_Destroy(Lst *, FreeProc *);
+void   Lst_Destroy(Lst *, FreeProc *);
 
 /*
  * Functions to modify a list
@@ -126,7 +132,7 @@ void                Lst_Remove(Lst *, LstNode *);
 #define        Lst_Replace(NODE, D)    (((NODE) == NULL) ? FAILURE : \
                                    (((NODE)->datum = (D)), SUCCESS))
 /* Concatenate two lists */
-void           Lst_Concat(Lst *, Lst *, int);
+void   Lst_Concat(Lst *, Lst *, int);
 
 /*
  * Node-specific functions
index 648c46d..f5f00ec 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.9 2004/12/17 08:01:40 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/lst.lib/Attic/lstConcat.c,v 1.10 2004/12/17 08:13:30 okumoto Exp $
  *
  * @(#)lstConcat.c     8.1 (Berkeley) 6/6/93
  */
@@ -94,6 +94,7 @@ Lst_Concat(Lst *list1, Lst *list2, int flags)
            list1->firstPtr = list2->firstPtr;
        list1->lastPtr = list2->lastPtr;
 
+       Lst_Init(list2);
     } else {
        /*
         * The loop simply goes through the entire
index 44114bc..10825df 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.11 2004/12/17 08:01:40 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/lst.lib/Attic/lstDestroy.c,v 1.12 2004/12/17 08:13:30 okumoto Exp $
  *
  * @(#)lstDestroy.c    8.1 (Berkeley) 6/6/93
  */
@@ -67,18 +67,9 @@ Lst_Destroy(Lst *list, FreeProc *freeProc)
 {
     LstNode *ln;
 
-    if (!Lst_Valid(list)) {
-       /*
-        * Note the check to catch uninitialized static Lst's.
-        * Gross, but useful.
-        */
+    if (list->firstPtr == NULL)
        return;
-    }
 
-    if (list->firstPtr == NULL) {
-       free(list);
-       return;
-    }
     if (freeProc != NOFREE) {
        while ((ln = list->firstPtr) != NULL) {
            list->firstPtr = ln->nextPtr;
@@ -88,9 +79,8 @@ Lst_Destroy(Lst *list, FreeProc *freeProc)
     } else {
        while ((ln = list->firstPtr) != NULL) {
            list->firstPtr = ln->nextPtr;
-            free(ln);
+           free(ln);
        }
     }
-
-    free(list);
+    list->lastPtr = NULL;
 }
index 67e7452..68f7d15 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/usr.bin/make/lst.lib/lstDupl.c,v 1.7 1999/08/28 01:03:49 peter Exp $
- * $DragonFly: src/usr.bin/make/lst.lib/Attic/lstDupl.c,v 1.11 2004/12/17 08:07:49 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/lst.lib/Attic/lstDupl.c,v 1.12 2004/12/17 08:13:30 okumoto Exp $
  *
  * @(#)lstDupl.c       8.1 (Berkeley) 6/6/93
  */
  *     Duplicate an entire list. If a function to copy a void * is
  *     given, the individual client elements will be duplicated as well.
  *
- * Results:
- *     The new Lst structure or NULL if failure.
- *
  * Arguments:
- *     l       the list to duplicate
+ *     dst     the destination list (initialized)
+ *     src     the list to duplicate
  *     copyProc A function to duplicate each void
  *
- * Side Effects:
- *     A new list is created.
  *-----------------------------------------------------------------------
  */
-Lst *
-Lst_Duplicate(Lst *list, DuplicateProc *copyProc)
+void
+Lst_Duplicate(Lst *dst, Lst *src, DuplicateProc *copyProc)
 {
-    Lst *nl;
     LstNode *ln;
 
-    if (!Lst_Valid(list)) {
-       return (NULL);
-    }
-
-    nl = Lst_Init();
-    if (nl == NULL) {
-       return (NULL);
-    }
-
-    ln = list->firstPtr;
+    ln = src->firstPtr;
     while (ln != NULL) {
        if (copyProc != NOCOPY)
-           Lst_AtEnd(nl, (*copyProc)(ln->datum));
+           Lst_AtEnd(dst, (*copyProc)(ln->datum));
        else
-           Lst_AtEnd(nl, ln->datum);
+           Lst_AtEnd(dst, ln->datum);
        ln = ln->nextPtr;
     }
-
-    return (nl);
 }
index 2f26410..2590d12 100644 (file)
@@ -38,7 +38,7 @@
  * @(#) Copyright (c) 1988, 1989, 1990, 1993 The Regents of the University of California.  All rights reserved.
  * @(#)main.c  8.3 (Berkeley) 3/19/94
  * $FreeBSD: src/usr.bin/make/main.c,v 1.35.2.10 2003/12/16 08:34:11 des Exp $
- * $DragonFly: src/usr.bin/make/main.c,v 1.36 2004/12/17 07:53:57 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/main.c,v 1.37 2004/12/17 08:13:30 okumoto Exp $
  */
 
 /*-
 
 #define        MAKEFLAGS       ".MAKEFLAGS"
 
-Lst                    *create;        /* Targets to be made */
+/* Targets to be made */
+Lst create = Lst_Initializer(create);
+
 time_t                 now;            /* Time at start of make */
 GNode                  *DEFAULT;       /* .DEFAULT node */
 Boolean                        allPrecious;    /* .PRECIOUS given on line by itself */
 
 static Boolean         noBuiltins;     /* -r flag */
-static Lst             *makefiles;     /* ordered list of makefiles to read */
+
+/* ordered list of makefiles to read */
+static Lst makefiles = Lst_Initializer(makefiles);
+
 static Boolean         expandVars;     /* fully expand printed variables */
-static Lst             *variables;     /* list of variables to print */
+
+/* list of variables to print */
+static Lst variables = Lst_Initializer(variables);
+
 int                    maxJobs;        /* -j argument */
 static Boolean          forceJobs;      /* -j argument given */
 Boolean                        compatMake;     /* -B argument */
@@ -109,7 +117,10 @@ Boolean                    beSilent;       /* -s flag */
 Boolean                        beVerbose;      /* -v flag */
 Boolean                        oldVars;        /* variable substitution style */
 Boolean                        checkEnvFirst;  /* -e flag */
-Lst                    *envFirstVars;  /* (-E) vars to override from env */
+
+/* (-E) vars to override from env */
+Lst envFirstVars = Lst_Initializer(envFirstVars);
+
 Boolean                        jobsRunning;    /* TRUE if the jobs might be running */
 
 static void            MainParseArgs(int, char **);
@@ -174,7 +185,7 @@ rearg:      while((c = getopt(argc, argv, OPTFLAGS)) != -1) {
                        MFLAGS_append("-I", optarg);
                        break;
                case 'V':
-                       (void)Lst_AtEnd(variables, (void *)optarg);
+                       Lst_AtEnd(&variables, (void *)optarg);
                        MFLAGS_append("-V", optarg);
                        break;
                case 'X':
@@ -251,7 +262,7 @@ rearg:      while((c = getopt(argc, argv, OPTFLAGS)) != -1) {
                case 'E':
                        p = emalloc(strlen(optarg) + 1);
                        strcpy(p, optarg);
-                       Lst_AtEnd(envFirstVars, p);
+                       Lst_AtEnd(&envFirstVars, p);
                        MFLAGS_append("-E", optarg);
                        break;
                case 'e':
@@ -259,7 +270,7 @@ rearg:      while((c = getopt(argc, argv, OPTFLAGS)) != -1) {
                        MFLAGS_append("-e", NULL);
                        break;
                case 'f':
-                       Lst_AtEnd(makefiles, optarg);
+                       Lst_AtEnd(&makefiles, optarg);
                        break;
                case 'i':
                        ignoreErrors = TRUE;
@@ -283,7 +294,7 @@ rearg:      while((c = getopt(argc, argv, OPTFLAGS)) != -1) {
                        MFLAGS_append("-k", NULL);
                        break;
                case 'm':
-                       Dir_AddDir(sysIncPath, optarg);
+                       Dir_AddDir(&sysIncPath, optarg);
                        MFLAGS_append("-m", optarg);
                        break;
                case 'n':
@@ -342,7 +353,7 @@ rearg:      while((c = getopt(argc, argv, OPTFLAGS)) != -1) {
                                        optind = 1;     /* - */
                                goto rearg;
                        }
-                       Lst_AtEnd(create, estrdup(*argv));
+                       Lst_AtEnd(&create, estrdup(*argv));
                }
 }
 
@@ -444,7 +455,6 @@ check_make_level(void)
 int
 main(int argc, char **argv)
 {
-       Lst *targs;     /* target nodes to create -- passed to Make_Init */
        Boolean outOfDate = TRUE;       /* FALSE if all targets up to date */
        struct stat sa;
        char *p, *p1, *path, *pathp;
@@ -454,7 +464,6 @@ main(int argc, char **argv)
        char *machine = getenv("MACHINE");
        char *machine_arch = getenv("MACHINE_ARCH");
        char *machine_cpu = getenv("MACHINE_CPU");
-       Lst *sysMkPath;                 /* Path of sys.mk */
        char *cp = NULL, *start;
                                        /* avoid faults on read-only strings */
        static char syspath[] = _PATH_DEFSYSPATH;
@@ -559,11 +568,7 @@ main(int argc, char **argv)
                        machine_cpu = "unknown";
        }
 
-       create = Lst_Init();
-       makefiles = Lst_Init();
-       envFirstVars = Lst_Init();
        expandVars = TRUE;
-       variables = Lst_Init();
        beSilent = FALSE;               /* Print commands as executed */
        ignoreErrors = FALSE;           /* Pay attention to non-zero returns */
        noExecute = FALSE;              /* Execute all commands */
@@ -673,7 +678,7 @@ main(int argc, char **argv)
        }
        Dir_InitDot();          /* Initialize the "." directory */
        if (objdir != curdir)
-               Dir_AddDir(dirSearchPath, curdir);
+               Dir_AddDir(&dirSearchPath, curdir);
        Var_Set(".DIRECTIVE_MAKEENV", "YES", VAR_GLOBAL);
        Var_Set(".CURDIR", curdir, VAR_GLOBAL);
        Var_Set(".OBJDIR", objdir, VAR_GLOBAL);
@@ -703,10 +708,10 @@ main(int argc, char **argv)
         * created. If none specified, make the variable empty -- the parser
         * will fill the thing in with the default or .MAIN target.
         */
-       if (!Lst_IsEmpty(create)) {
+       if (!Lst_IsEmpty(&create)) {
                LstNode *ln;
 
-               for (ln = Lst_First(create); ln != NULL; ln = Lst_Succ(ln)) {
+               for (ln = Lst_First(&create); ln != NULL; ln = Lst_Succ(ln)) {
                        char *name = Lst_Datum(ln);
 
                        Var_Append(".TARGETS", name, VAR_GLOBAL);
@@ -720,15 +725,15 @@ main(int argc, char **argv)
         * add the directories from the DEFSYSPATH (more than one may be given
         * as dir1:...:dirn) to the system include path.
         */
-       if (Lst_IsEmpty(sysIncPath)) {
+       if (Lst_IsEmpty(&sysIncPath)) {
                for (start = syspath; *start != '\0'; start = cp) {
                        for (cp = start; *cp != '\0' && *cp != ':'; cp++)
                                continue;
                        if (*cp == '\0') {
-                               Dir_AddDir(sysIncPath, start);
+                               Dir_AddDir(&sysIncPath, start);
                        } else {
                                *cp++ = '\0';
-                               Dir_AddDir(sysIncPath, start);
+                               Dir_AddDir(&sysIncPath, start);
                        }
                }
        }
@@ -739,21 +744,23 @@ main(int argc, char **argv)
         * Makefile and makefile, in that order, if it wasn't.
         */
        if (!noBuiltins) {
+               /* Path of sys.mk */
+               Lst sysMkPath = Lst_Initializer(sysMkPath);
                LstNode *ln;
 
-               sysMkPath = Lst_Init();
-               Dir_Expand(_PATH_DEFSYSMK, sysIncPath, sysMkPath);
-               if (Lst_IsEmpty(sysMkPath))
+               Dir_Expand(_PATH_DEFSYSMK, &sysIncPath, &sysMkPath);
+               if (Lst_IsEmpty(&sysMkPath))
                        Fatal("make: no system rules (%s).", _PATH_DEFSYSMK);
-               ln = Lst_Find(sysMkPath, NULL, ReadMakefile);
+               ln = Lst_Find(&sysMkPath, NULL, ReadMakefile);
                if (ln != NULL)
                        Fatal("make: cannot open %s.", (char *)Lst_Datum(ln));
+               Lst_Destroy(&sysMkPath, free);
        }
 
-       if (!Lst_IsEmpty(makefiles)) {
+       if (!Lst_IsEmpty(&makefiles)) {
                LstNode *ln;
 
-               ln = Lst_Find(makefiles, NULL, ReadMakefile);
+               ln = Lst_Find(&makefiles, NULL, ReadMakefile);
                if (ln != NULL)
                        Fatal("make: cannot open %s.", (char *)Lst_Datum(ln));
        } else if (!ReadMakefile("BSDmakefile", NULL))
@@ -792,7 +799,7 @@ main(int argc, char **argv)
                        savec = *cp;
                        *cp = '\0';
                        /* Add directory to search path */
-                       Dir_AddDir(dirSearchPath, path);
+                       Dir_AddDir(&dirSearchPath, path);
                        *cp = savec;
                        path = cp + 1;
                } while (savec == ':');
@@ -810,10 +817,10 @@ main(int argc, char **argv)
                Targ_PrintGraph(1);
 
        /* print the values of any variables requested by the user */
-       if (!Lst_IsEmpty(variables)) {
+       if (!Lst_IsEmpty(&variables)) {
                LstNode *ln;
 
-               for (ln = Lst_First(variables); ln != NULL;
+               for (ln = Lst_First(&variables); ln != NULL;
                    ln = Lst_Succ(ln)) {
                        char *value;
                        if (expandVars) {
@@ -836,10 +843,12 @@ main(int argc, char **argv)
                 * to create. If none was given on the command line, we consult the
                 * parsing module to find the main target(s) to create.
                 */
-               if (Lst_IsEmpty(create))
-                       targs = Parse_MainName();
+               Lst targs = Lst_Initializer(targs);
+
+               if (Lst_IsEmpty(&create))
+                       Parse_MainName(&targs);
                else
-                       targs = Targ_FindList(create, TARG_CREATE);
+                       Targ_FindList(&targs, &create, TARG_CREATE);
 
                if (!compatMake) {
                        /*
@@ -854,21 +863,21 @@ main(int argc, char **argv)
                        }
 
                        /* Traverse the graph, checking on all the targets */
-                       outOfDate = Make_Run(targs);
+                       outOfDate = Make_Run(&targs);
                } else {
                        /*
                         * Compat_Init will take care of creating all the targets as
                         * well as initializing the module.
                         */
-                       Compat_Run(targs);
+                       Compat_Run(&targs);
                        outOfDate = 0;
                }
-               Lst_Destroy(targs, NOFREE);
+               Lst_Destroy(&targs, NOFREE);
        }
 
-       Lst_Destroy(variables, NOFREE);
-       Lst_Destroy(makefiles, NOFREE);
-       Lst_Destroy(create, free);
+       Lst_Destroy(&variables, NOFREE);
+       Lst_Destroy(&makefiles, NOFREE);
+       Lst_Destroy(&create, free);
 
        /* print the graph now it's been processed if the user requested it */
        if (DEBUG(GRAPH2))
@@ -960,9 +969,9 @@ ReadMakefile(const void *p, const void *q __unused)
                }
 #endif
                /* look in -I and system include directories. */
-               name = Dir_FindFile(fname, parseIncPath);
+               name = Dir_FindFile(fname, &parseIncPath);
                if (!name)
-                       name = Dir_FindFile(fname, sysIncPath);
+                       name = Dir_FindFile(fname, &sysIncPath);
                if (!name || !(stream = fopen(name, "r")))
                        return (FALSE);
                MAKEFILE = fname = name;
index fa8b51c..c4c82d5 100644 (file)
@@ -37,7 +37,7 @@
  *
  * @(#)make.c  8.1 (Berkeley) 6/6/93
  * $FreeBSD: src/usr.bin/make/make.c,v 1.11 1999/09/11 13:08:01 hoek Exp $
- * $DragonFly: src/usr.bin/make/make.c,v 1.16 2004/12/17 07:56:08 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/make.c,v 1.17 2004/12/17 08:13:30 okumoto Exp $
  */
 
 /*-
 #include    "dir.h"
 #include    "job.h"
 
-static Lst     *toBeMade;      /* The current fringe of the graph. These
                               * are nodes which await examination by
-                                * MakeOODate. It is added to by
-                                * Make_Update and subtracted from by
-                                * MakeStartJobs */
+/* The current fringe of the graph. These are nodes which await examination
* by MakeOODate. It is added to by Make_Update and subtracted from by
+ * MakeStartJobs */
+static Lst toBeMade = Lst_Initializer(toBeMade);
+
 static int     numNodes;       /* Number of nodes to be processed. If this
                                 * is non-zero when Job_Empty() returns
                                 * TRUE, there's a cycle in the graph */
@@ -240,7 +240,7 @@ Make_OODate(GNode *gn)
      * thinking they're out-of-date.
      */
     if (!oodate) {
-       Lst_ForEach(gn->parents, MakeTimeStamp, gn);
+       Lst_ForEach(&gn->parents, MakeTimeStamp, gn);
     }
 
     return (oodate);
@@ -301,20 +301,20 @@ Make_HandleUse(GNode *cgn, GNode *pgn)
     LstNode    *ln;            /* An element in the children list */
 
     if (cgn->type & (OP_USE | OP_TRANSFORM)) {
-       if ((cgn->type & OP_USE) || Lst_IsEmpty(pgn->commands)) {
+       if ((cgn->type & OP_USE) || Lst_IsEmpty(&pgn->commands)) {
            /*
             * .USE or transformation and target has no commands -- append
             * the child's commands to the parent.
             */
-            Lst_Concat(pgn->commands, cgn->commands, LST_CONCNEW);
+            Lst_Concat(&pgn->commands, &cgn->commands, LST_CONCNEW);
        }
 
-       for (ln = Lst_First(cgn->children); ln != NULL; ln = Lst_Succ(ln)) {
+       for (ln = Lst_First(&cgn->children); ln != NULL; ln = Lst_Succ(ln)) {
            gn = Lst_Datum(ln);
 
-           if (Lst_Member(pgn->children, gn) == NULL) {
-               Lst_AtEnd(pgn->children, gn);
-               Lst_AtEnd(gn->parents, pgn);
+           if (Lst_Member(&pgn->children, gn) == NULL) {
+               Lst_AtEnd(&pgn->children, gn);
+               Lst_AtEnd(&gn->parents, pgn);
                pgn->unmade += 1;
            }
        }
@@ -411,7 +411,7 @@ Make_Update(GNode *cgn)
         * To force things that depend on FRC to be made, so we have to
         * check for gn->children being empty as well...
         */
-       if (!Lst_IsEmpty(cgn->commands) || Lst_IsEmpty(cgn->children)) {
+       if (!Lst_IsEmpty(&cgn->commands) || Lst_IsEmpty(&cgn->children)) {
            cgn->mtime = now;
        }
 #else
@@ -445,7 +445,7 @@ Make_Update(GNode *cgn)
 #endif
     }
 
-    for (ln = Lst_First(cgn->parents); ln != NULL; ln = Lst_Succ(ln)) {
+    for (ln = Lst_First(&cgn->parents); ln != NULL; ln = Lst_Succ(ln)) {
        pgn = Lst_Datum(ln);
        if (pgn->make) {
            pgn->unmade -= 1;
@@ -465,7 +465,7 @@ Make_Update(GNode *cgn)
                 * Queue the node up -- any unmade predecessors will
                 * be dealt with in MakeStartJobs.
                 */
-               Lst_EnQueue(toBeMade, pgn);
+               Lst_EnQueue(&toBeMade, pgn);
            } else if (pgn->unmade < 0) {
                Error("Graph cycles through %s", pgn->name);
            }
@@ -478,13 +478,13 @@ Make_Update(GNode *cgn)
      * it means we need to place it in the queue as it restrained itself
      * before.
      */
-    for (ln = Lst_First(cgn->successors); ln != NULL; ln = Lst_Succ(ln)) {
+    for (ln = Lst_First(&cgn->successors); ln != NULL; ln = Lst_Succ(ln)) {
        GNode   *succ = Lst_Datum(ln);
 
        if (succ->make && succ->unmade == 0 && succ->made == UNMADE &&
-           Lst_Member(toBeMade, succ) == NULL)
+           Lst_Member(&toBeMade, succ) == NULL)
        {
-           Lst_EnQueue(toBeMade, succ);
+           Lst_EnQueue(&toBeMade, succ);
        }
     }
 
@@ -493,7 +493,7 @@ Make_Update(GNode *cgn)
      * of this node.
      */
     cpref = Var_Value(PREFIX, cgn, &ptr);
-    for (ln = Lst_First(cgn->iParents); ln != NULL; ln = Lst_Succ(ln)) {
+    for (ln = Lst_First(&cgn->iParents); ln != NULL; ln = Lst_Succ(ln)) {
        pgn = Lst_Datum (ln);
        if (pgn->make) {
            Var_Set(IMPSRC, cname, pgn);
@@ -598,7 +598,7 @@ void
 Make_DoAllVar(GNode *gn)
 {
 
-    Lst_ForEach(gn->children, MakeAddAllSrc, gn);
+    Lst_ForEach(&gn->children, MakeAddAllSrc, gn);
 
     if (!Var_Exists (OODATE, gn)) {
        Var_Set(OODATE, "", gn);
@@ -636,17 +636,17 @@ MakeStartJobs(void)
 {
     GNode      *gn;
 
-    while (!Lst_IsEmpty(toBeMade) && !Job_Full()) {
-       gn = Lst_DeQueue(toBeMade);
+    while (!Lst_IsEmpty(&toBeMade) && !Job_Full()) {
+       gn = Lst_DeQueue(&toBeMade);
        DEBUGF(MAKE, ("Examining %s...", gn->name));
        /*
         * Make sure any and all predecessors that are going to be made,
         * have been.
         */
-       if (!Lst_IsEmpty(gn->preds)) {
+       if (!Lst_IsEmpty(&gn->preds)) {
            LstNode *ln;
 
-           for (ln = Lst_First(gn->preds); ln != NULL; ln = Lst_Succ(ln)){
+           for (ln = Lst_First(&gn->preds); ln != NULL; ln = Lst_Succ(ln)){
                GNode   *pgn = Lst_Datum(ln);
 
                if (pgn->make && pgn->made == UNMADE) {
@@ -733,11 +733,11 @@ MakePrintStatus(void *gnp, void *cyclep)
            if (gn->made == CYCLE) {
                Error("Graph cycles through `%s'", gn->name);
                gn->made = ENDCYCLE;
-               Lst_ForEach(gn->children, MakePrintStatus, &t);
+               Lst_ForEach(&gn->children, MakePrintStatus, &t);
                gn->made = UNMADE;
            } else if (gn->made != ENDCYCLE) {
                gn->made = CYCLE;
-               Lst_ForEach(gn->children, MakePrintStatus, &t);
+               Lst_ForEach(&gn->children, MakePrintStatus, &t);
            }
        } else {
            printf("`%s' not remade because of errors.\n", gn->name);
@@ -771,12 +771,11 @@ Boolean
 Make_Run(Lst *targs)
 {
     GNode          *gn;        /* a temporary pointer */
-    Lst                    *examine;   /* List of targets to examine */
+    Lst                    examine;    /* List of targets to examine */
     int                    errors;     /* Number of errors the Job module reports */
 
-    toBeMade = Lst_Init();
-
-    examine = Lst_Duplicate(targs, NOCOPY);
+    Lst_Init(&examine);
+    Lst_Duplicate(&examine, targs, NOCOPY);
     numNodes = 0;
 
     /*
@@ -787,8 +786,8 @@ Make_Run(Lst *targs)
      * be looked at in a minute, otherwise we add its children to our queue
      * and go on about our business.
      */
-    while (!Lst_IsEmpty(examine)) {
-       gn = Lst_DeQueue(examine);
+    while (!Lst_IsEmpty(&examine)) {
+       gn = Lst_DeQueue(&examine);
 
        if (!gn->make) {
            gn->make = TRUE;
@@ -798,19 +797,17 @@ Make_Run(Lst *targs)
             * Apply any .USE rules before looking for implicit dependencies
             * to make sure everything has commands that should...
             */
-           Lst_ForEach(gn->children, MakeHandleUse, gn);
+           Lst_ForEach(&gn->children, MakeHandleUse, gn);
            Suff_FindDeps(gn);
 
            if (gn->unmade != 0) {
-               Lst_ForEach(gn->children, MakeAddChild, examine);
+               Lst_ForEach(&gn->children, MakeAddChild, &examine);
            } else {
-               Lst_EnQueue(toBeMade, gn);
+               Lst_EnQueue(&toBeMade, gn);
            }
        }
     }
 
-    Lst_Destroy(examine, NOFREE);
-
     if (queryFlag) {
        /*
         * We wouldn't do any work unless we could start some jobs in the
@@ -840,7 +837,7 @@ Make_Run(Lst *targs)
      * keepgoing flag was given.
      */
     while (!Job_Empty ()) {
-       Job_CatchOutput(!Lst_IsEmpty(toBeMade));
+       Job_CatchOutput(!Lst_IsEmpty(&toBeMade));
        Job_CatchChildren(!usePipes);
        MakeStartJobs();
     }
index f704610..a808778 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     from: @(#)make.h        8.3 (Berkeley) 6/13/95
  * $FreeBSD: src/usr.bin/make/make.h,v 1.12.2.2 2001/02/13 03:13:58 will Exp $
- * $DragonFly: src/usr.bin/make/make.h,v 1.14 2004/12/17 07:56:08 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/make.h,v 1.15 2004/12/17 08:13:30 okumoto Exp $
  */
 
 /*-
@@ -126,16 +126,16 @@ typedef struct GNode {
     int                    cmtime;     /* The modification time of its youngest
                                 * child */
 
-    Lst            *iParents;  /* Links to parents for which this is an
+    Lst            iParents;   /* Links to parents for which this is an
                                 * implied source, if any */
-    Lst                    *cohorts;   /* Other nodes for the :: operator */
-    Lst                    *parents;   /* Nodes that depend on this one */
-    Lst                    *children;  /* Nodes on which this one depends */
-    Lst                    *successors;/* Nodes that must be made after this one */
-    Lst                    *preds;     /* Nodes that must be made before this one */
+    Lst                    cohorts;    /* Other nodes for the :: operator */
+    Lst                    parents;    /* Nodes that depend on this one */
+    Lst                    children;   /* Nodes on which this one depends */
+    Lst                    successors; /* Nodes that must be made after this one */
+    Lst                    preds;      /* Nodes that must be made before this one */
 
-    Lst            *context;   /* The local variables */
-    Lst            *commands;  /* Creation commands */
+    Lst             context;   /* The local variables */
+    Lst             commands;  /* Creation commands */
 
     /* current command executing in compat mode */
     LstNode       *compat_command;
@@ -284,14 +284,17 @@ typedef struct IFile {
 /*
  * Global Variables
  */
-extern Lst     *create;        /* The list of target names specified on the
-                                * command line. used to resolve #if
-                                * make(...) statements */
-extern Lst     *dirSearchPath;  /* The list of directories to search when
-                                * looking for targets */
+/* The list of target names specified on the  command line.
+ * Used to resolve #if make(...) statements */
+extern Lst create;
+
+/* The list of directories to search when looking for targets */
+extern Lst dirSearchPath;
+
 extern IFile   curFile;        /* current makefile */
-extern Lst     *parseIncPath;  /* The list of directories to search when
-                                * looking for includes */
+
+/* The list of directories to search when looking for includes */
+extern Lst parseIncPath;
 
 extern Boolean jobsRunning;    /* True if jobs are running */
 extern Boolean compatMake;     /* True if we are make compatible */
@@ -315,9 +318,10 @@ extern Boolean     queryFlag;      /* TRUE if we aren't supposed to really make
 
 extern Boolean checkEnvFirst;  /* TRUE if environment should be searched for
                                 * all variables before the global context */
-extern Lst     *envFirstVars;  /* List of specific variables for which the
-                                * environment should be searched before the
-                                * global context */
+
+/* List of specific variables for which the environment should be
+ * searched before the global context */
+extern Lst envFirstVars;
 
 extern GNode    *DEFAULT;      /* .DEFAULT rule */
 
@@ -334,7 +338,8 @@ extern time_t       now;            /* The time at the start of this whole
 
 extern Boolean oldVars;        /* Do old-style variable substitution */
 
-extern Lst     *sysIncPath;    /* The system include path. */
+/* The system include path. */
+extern Lst sysIncPath;
 
 /*
  * debug control:
index 2c9be97..43f5330 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     from: @(#)nonints.h     8.3 (Berkeley) 3/19/94
  * $FreeBSD: src/usr.bin/make/nonints.h,v 1.8 1999/08/28 01:03:35 peter Exp $
- * $DragonFly: src/usr.bin/make/Attic/nonints.h,v 1.20 2004/12/17 00:02:57 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/Attic/nonints.h,v 1.21 2004/12/17 08:13:30 okumoto Exp $
  */
 
 /* arch.c */
@@ -89,7 +89,7 @@ void Parse_File(char *, FILE *);
 void Parse_Init(void);
 void Parse_End(void);
 void Parse_FromString(char *, int);
-Lst *Parse_MainName(void);
+void Parse_MainName(Lst *);
 
 /* str.c */
 void str_init(void);
@@ -121,7 +121,7 @@ void Targ_Init(void);
 void Targ_End(void);
 GNode *Targ_NewGN(char *);
 GNode *Targ_FindNode(char *, int);
-Lst *Targ_FindList(Lst *, int);
+void Targ_FindList(Lst *, Lst *, int);
 Boolean Targ_Ignore(GNode *);
 Boolean Targ_Silent(GNode *);
 Boolean Targ_Precious(GNode *);
index 9d41212..8daf545 100644 (file)
@@ -37,7 +37,7 @@
  *
  * @(#)parse.c 8.3 (Berkeley) 3/19/94
  * $FreeBSD: src/usr.bin/make/parse.c,v 1.22.2.2 2004/07/10 08:14:42 eik Exp $
- * $DragonFly: src/usr.bin/make/parse.c,v 1.26 2004/12/17 08:09:58 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/parse.c,v 1.27 2004/12/17 08:13:30 okumoto Exp $
  */
 
 /*-
  */
 #define        CONTINUE        1
 #define        DONE            0
-static Lst          *targets;  /* targets we're working on */
+
+/* targets we're working on */
+static Lst targets = Lst_Initializer(targets);
+
 static Boolean     inLine;     /* true if currently in a dependency
                                 * line or its commands */
 static int         fatals = 0;
@@ -111,10 +114,14 @@ static GNode          *mainNode;  /* The main target to create. This is the
 
 IFile          curFile;        /* current makefile */
 
-static Lst      *includes;     /* stack of IFiles generated by
-                                * #includes */
-Lst            *parseIncPath;  /* list of directories for "..." includes */
-Lst            *sysIncPath;    /* list of directories for <...> includes */
+/* stack of IFiles generated by * #includes */
+static Lst includes = Lst_Initializer(includes);
+
+/* list of directories for "..." includes */
+Lst parseIncPath = Lst_Initializer(parseIncPath);
+
+/* list of directories for <...> includes */
+Lst sysIncPath = Lst_Initializer(sysIncPath);
 
 /*-
  * specType contains the SPECial TYPE of the current target. It is
@@ -321,10 +328,10 @@ ParseLinkSrc(void *pgnp, void *cgnp)
     GNode *pgn = pgnp;
     GNode *cgn = cgnp;
 
-    if (Lst_Member(pgn->children, cgn) == NULL) {
-       Lst_AtEnd(pgn->children, cgn);
+    if (Lst_Member(&pgn->children, cgn) == NULL) {
+       Lst_AtEnd(&pgn->children, cgn);
        if (specType == Not) {
-           Lst_AtEnd(cgn->parents, pgn);
+           Lst_AtEnd(&cgn->parents, pgn);
        }
        pgn->unmade += 1;
     }
@@ -387,14 +394,14 @@ ParseDoOp(void *gnp, void *opp)
         * anything with their local variables, but better safe than
         * sorry.
         */
-       Lst_ForEach(gn->parents, ParseLinkSrc, cohort);
+       Lst_ForEach(&gn->parents, ParseLinkSrc, cohort);
        cohort->type = OP_DOUBLEDEP|OP_INVISIBLE;
-       Lst_AtEnd(gn->cohorts, cohort);
+       Lst_AtEnd(&gn->cohorts, cohort);
 
        /*
         * Replace the node in the targets list with the new copy
         */
-       ln = Lst_Member(targets, gn);
+       ln = Lst_Member(&targets, gn);
        Lst_Replace(ln, cohort);
        gn = cohort;
     }
@@ -435,8 +442,8 @@ ParseAddDep(void *pp, void *sp)
         * but checking is tedious, and the debugging output can show the
         * problem
         */
-       Lst_AtEnd(p->successors, s);
-       Lst_AtEnd(s->preds, p);
+       Lst_AtEnd(&p->successors, s);
+       Lst_AtEnd(&s->preds, p);
        return (0);
     }
     else
@@ -471,7 +478,7 @@ ParseDoSrc(int tOp, char *src, Lst *allsrc)
        if (keywd != -1) {
            int op = parseKeywords[keywd].op;
            if (op != 0) {
-               Lst_ForEach(targets, ParseDoOp, &op);
+               Lst_ForEach(&targets, ParseDoOp, &op);
                return;
            }
            if (parseKeywords[keywd].spec == Wait) {
@@ -491,7 +498,7 @@ ParseDoSrc(int tOp, char *src, Lst *allsrc)
         * invoked if the user didn't specify a target on the command
         * line. This is to allow #ifmake's to succeed, or something...
         */
-       Lst_AtEnd(create, estrdup(src));
+       Lst_AtEnd(&create, estrdup(src));
        /*
         * Add the name to the .TARGETS variable as well, so the user cna
         * employ that, if desired.
@@ -506,8 +513,8 @@ ParseDoSrc(int tOp, char *src, Lst *allsrc)
         */
        gn = Targ_FindNode(src, TARG_CREATE);
        if (predecessor != NULL) {
-           Lst_AtEnd(predecessor->successors, gn);
-           Lst_AtEnd(gn->preds, predecessor);
+           Lst_AtEnd(&predecessor->successors, gn);
+           Lst_AtEnd(&gn->preds, predecessor);
        }
        /*
         * The current source now becomes the predecessor for the next one.
@@ -531,18 +538,18 @@ ParseDoSrc(int tOp, char *src, Lst *allsrc)
        if (tOp) {
            gn->type |= tOp;
        } else {
-           Lst_ForEach(targets, ParseLinkSrc, gn);
+           Lst_ForEach(&targets, ParseLinkSrc, gn);
        }
        if ((gn->type & OP_OPMASK) == OP_DOUBLEDEP) {
            GNode       *cohort;
            LstNode     *ln;
 
-           for (ln=Lst_First(gn->cohorts); ln != NULL; ln = Lst_Succ(ln)){
+           for (ln = Lst_First(&gn->cohorts); ln != NULL; ln = Lst_Succ(ln)) {
                cohort = Lst_Datum(ln);
                if (tOp) {
                    cohort->type |= tOp;
                } else {
-                   Lst_ForEach(targets, ParseLinkSrc, cohort);
+                   Lst_ForEach(&targets, ParseLinkSrc, cohort);
                }
            }
        }
@@ -668,23 +675,14 @@ ParseDoDependency (char *line)
     GNode         *gn;         /* a general purpose temporary node */
     int             op;                /* the operator on the line */
     char            savec;     /* a place to save a character */
-    Lst            *paths;     /* List of search paths to alter when parsing
-                                * a list of .PATH targets */
+    Lst paths; /* Search paths to alter when parsing a list of .PATH targets */
     int                    tOp;        /* operator from special target */
-    Lst                    *sources;   /* list of archive source names after
-                                * expansion */
-    Lst            *curTargs;  /* list of target names to be found and added
-                                * to the targets list */
-    Lst                    *curSrcs;   /* list of sources in order */
 
     tOp = 0;
 
     specType = Not;
     waiting = 0;
-    paths = NULL;
-
-    curTargs = Lst_Init();
-    curSrcs = Lst_Init();
+    Lst_Init(&paths);
 
     do {
        for (cp = line;
@@ -750,7 +748,7 @@ ParseDoDependency (char *line)
             * went well and FAILURE if there was an error in the
             * specification. On error, line should remain untouched.
             */
-           if (Arch_ParseArchive(&line, targets, VAR_CMD) != SUCCESS) {
+           if (Arch_ParseArchive(&line, &targets, VAR_CMD) != SUCCESS) {
                Parse_Error(PARSE_FATAL,
                             "Error in archive specification: \"%s\"", line);
                return;
@@ -825,13 +823,10 @@ ParseDoDependency (char *line)
                 */
                switch (specType) {
                    case ExPath:
-                       if (paths == NULL) {
-                           paths = Lst_Init();
-                       }
-                       Lst_AtEnd(paths, dirSearchPath);
+                       Lst_AtEnd(&paths, &dirSearchPath);
                        break;
                    case Main:
-                       if (!Lst_IsEmpty(create)) {
+                       if (!Lst_IsEmpty(&create)) {
                            specType = Not;
                        }
                        break;
@@ -840,12 +835,12 @@ ParseDoDependency (char *line)
                    case Interrupt:
                        gn = Targ_FindNode(line, TARG_CREATE);
                        gn->type |= OP_NOTMAIN;
-                       Lst_AtEnd(targets, gn);
+                       Lst_AtEnd(&targets, gn);
                        break;
                    case Default:
                        gn = Targ_NewGN(".DEFAULT");
                        gn->type |= (OP_NOTMAIN|OP_TRANSFORM);
-                       Lst_AtEnd(targets, gn);
+                       Lst_AtEnd(&targets, gn);
                        DEFAULT = gn;
                        break;
                    case NotParallel:
@@ -877,12 +872,8 @@ ParseDoDependency (char *line)
                                 "Suffix '%s' not defined (yet)",
                                 &line[5]);
                    return;
-               } else {
-                   if (paths == NULL) {
-                       paths = Lst_Init();
-                   }
-                   Lst_AtEnd(paths, path);
-               }
+               } else
+                   Lst_AtEnd(&paths, path);
            }
        }
 
@@ -891,6 +882,9 @@ ParseDoDependency (char *line)
         * the end of the targets list
         */
        if ((specType == Not) && (*line != '\0')) {
+           /* target names to be found and added to targets list */
+           Lst curTargs = Lst_Initializer(curTargs);
+
            if (Dir_HasWildcards(line)) {
                /*
                 * Targets are to be sought only in the current directory,
@@ -898,21 +892,21 @@ ParseDoDependency (char *line)
                 * use Dir_Destroy in the destruction of the path as the
                 * Dir module could have added a directory to the path...
                 */
-               Lst *emptyPath = Lst_Init();
+               Lst emptyPath = Lst_Initializer(emptyPath);
 
-               Dir_Expand(line, emptyPath, curTargs);
+               Dir_Expand(line, &emptyPath, &curTargs);
 
-               Lst_Destroy(emptyPath, Dir_Destroy);
+               Lst_Destroy(&emptyPath, Dir_Destroy);
            } else {
                /*
                 * No wildcards, but we want to avoid code duplication,
                 * so create a list with the word on it.
                 */
-               Lst_AtEnd(curTargs, line);
+               Lst_AtEnd(&curTargs, line);
            }
 
-           while(!Lst_IsEmpty(curTargs)) {
-               char    *targName = Lst_DeQueue(curTargs);
+           while (!Lst_IsEmpty(&curTargs)) {
+               char    *targName = Lst_DeQueue(&curTargs);
 
                if (!Suff_IsTransform (targName)) {
                    gn = Targ_FindNode(targName, TARG_CREATE);
@@ -920,7 +914,7 @@ ParseDoDependency (char *line)
                    gn = Suff_AddTransform(targName);
                }
 
-               Lst_AtEnd(targets, gn);
+               Lst_AtEnd(&targets, gn);
            }
        } else if (specType == ExPath && *line != '.' && *line != '\0') {
            Parse_Error(PARSE_WARNING, "Extra target (%s) ignored", line);
@@ -951,12 +945,7 @@ ParseDoDependency (char *line)
        line = cp;
     } while ((*line != '!') && (*line != ':') && *line);
 
-    /*
-     * Don't need the list of target names anymore...
-     */
-    Lst_Destroy(curTargs, NOFREE);
-
-    if (!Lst_IsEmpty(targets)) {
+    if (!Lst_IsEmpty(&targets)) {
        switch (specType) {
            default:
                Parse_Error(PARSE_WARNING, "Special and mundane targets don't mix. Mundane ones ignored");
@@ -997,7 +986,7 @@ ParseDoDependency (char *line)
 
     cp++;                      /* Advance beyond operator */
 
-    Lst_ForEach(targets, ParseDoOp, &op);
+    Lst_ForEach(&targets, ParseDoOp, &op);
 
     /*
      * Get to the first source
@@ -1031,7 +1020,7 @@ ParseDoDependency (char *line)
                beSilent = TRUE;
                break;
            case ExPath:
-               Lst_ForEach(paths, ParseClearPath, NULL);
+               Lst_ForEach(&paths, ParseClearPath, NULL);
                break;
            case Posix:
                Var_Set("%POSIX", "1003.2", VAR_GLOBAL);
@@ -1100,7 +1089,7 @@ ParseDoDependency (char *line)
                    Suff_AddSuffix(line);
                    break;
                case ExPath:
-                   Lst_ForEach(paths, ParseAddDir, line);
+                   Lst_ForEach(&paths, ParseAddDir, line);
                    break;
                case Includes:
                    Suff_AddInclude(line);
@@ -1123,10 +1112,11 @@ ParseDoDependency (char *line)
            }
            line = cp;
        }
-       if (paths) {
-           Lst_Destroy(paths, NOFREE);
-       }
+       Lst_Destroy(&paths, NOFREE);
+
     } else {
+        Lst curSrcs = Lst_Initializer(curSrc); /* list of sources in order */
        while (*line) {
            /*
             * The targets take real sources, so we must beware of archive
@@ -1149,19 +1139,19 @@ ParseDoDependency (char *line)
 
            if (*cp == '(') {
                GNode     *gnp;
+               /* list of archive source names after expansion */
+               Lst sources = Lst_Initializer(sources);
 
-               sources = Lst_Init();
-               if (Arch_ParseArchive(&line, sources, VAR_CMD) != SUCCESS) {
+               if (Arch_ParseArchive(&line, &sources, VAR_CMD) != SUCCESS) {
                    Parse_Error(PARSE_FATAL,
                                 "Error in source archive spec \"%s\"", line);
                    return;
                }
 
-               while (!Lst_IsEmpty (sources)) {
-                   gnp = Lst_DeQueue(sources);
-                   ParseDoSrc(tOp, gnp->name, curSrcs);
+               while (!Lst_IsEmpty(&sources)) {
+                   gnp = Lst_DeQueue(&sources);
+                   ParseDoSrc(tOp, gnp->name, &curSrcs);
                }
-               Lst_Destroy(sources, NOFREE);
                cp = line;
            } else {
                if (*cp) {
@@ -1169,13 +1159,14 @@ ParseDoDependency (char *line)
                    cp += 1;
                }
 
-               ParseDoSrc(tOp, line, curSrcs);
+               ParseDoSrc(tOp, line, &curSrcs);
            }
            while (*cp && isspace((unsigned char)*cp)) {
                cp++;
            }
            line = cp;
        }
+        Lst_Destroy(&curSrcs, NOFREE);
     }
 
     if (mainNode == NULL) {
@@ -1185,13 +1176,8 @@ ParseDoDependency (char *line)
         * the first dependency line that is actually a real target
         * (i.e. isn't a .USE or .EXEC rule) to be made.
         */
-       Lst_ForEach(targets, ParseFindMain, NULL);
+       Lst_ForEach(&targets, ParseFindMain, NULL);
     }
-
-    /*
-     * Finally, destroy the list of sources
-     */
-    Lst_Destroy(curSrcs, NOFREE);
 }
 
 /*-
@@ -1480,7 +1466,7 @@ ParseAddCmd(void *gnp, void *cmd)
 
     /* if target already supplied, ignore commands */
     if (!(gn->type & OP_HAS_COMMANDS))
-       Lst_AtEnd(gn->commands, cmd);
+       Lst_AtEnd(&gn->commands, cmd);
     else
        Parse_Error(PARSE_WARNING,
                    "duplicate script for target \"%s\" ignored",
@@ -1509,7 +1495,7 @@ ParseHasCommands(void *gnp)
 {
     GNode *gn = gnp;
 
-    if (!Lst_IsEmpty(gn->commands)) {
+    if (!Lst_IsEmpty(&gn->commands)) {
        gn->type |= OP_HAS_COMMANDS;
     }
 }
@@ -1532,7 +1518,7 @@ void
 Parse_AddIncludeDir(char *dir)
 {
 
-    Dir_AddDir(parseIncPath, dir);
+    Dir_AddDir(&parseIncPath, dir);
 }
 
 /*---------------------------------------------------------------------
@@ -1693,9 +1679,9 @@ ParseDoInclude (char *file)
                newName = estrdup(file);
            else
                newName = str_concat(Fname, file, STR_ADDSLASH);
-           fullname = Dir_FindFile(newName, parseIncPath);
+           fullname = Dir_FindFile(newName, &parseIncPath);
            if (fullname == NULL) {
-               fullname = Dir_FindFile(newName, dirSearchPath);
+               fullname = Dir_FindFile(newName, &dirSearchPath);
            }
            free(newName);
            *prefEnd = '/';
@@ -1714,9 +1700,9 @@ ParseDoInclude (char *file)
         * then on the .PATH search path, if not found in a -I directory.
         * XXX: Suffix specific?
         */
-       fullname = Dir_FindFile(file, parseIncPath);
+       fullname = Dir_FindFile(file, &parseIncPath);
        if (fullname == NULL) {
-           fullname = Dir_FindFile(file, dirSearchPath);
+           fullname = Dir_FindFile(file, &dirSearchPath);
        }
     }
 
@@ -1725,7 +1711,7 @@ ParseDoInclude (char *file)
         * Still haven't found the makefile. Look for it on the system
         * path as a last resort.
         */
-       fullname = Dir_FindFile(file, sysIncPath);
+       fullname = Dir_FindFile(file, &sysIncPath);
     }
 
     if (fullname == NULL) {
@@ -1746,7 +1732,7 @@ ParseDoInclude (char *file)
     oldFile = emalloc(sizeof (IFile));
     memcpy(oldFile, &curFile, sizeof(IFile));
 
-    Lst_AtFront(includes, oldFile);
+    Lst_AtFront(&includes, oldFile);
 
     /*
      * Once the previous state has been saved, we can get down to reading
@@ -1793,7 +1779,7 @@ Parse_FromString(char *str, int lineno)
     oldFile = emalloc(sizeof(IFile));
     memcpy(oldFile, &curFile, sizeof(IFile));
 
-    Lst_AtFront(includes, oldFile);
+    Lst_AtFront(&includes, oldFile);
 
     curFile.F = NULL;
     curFile.p = emalloc(sizeof (PTR));
@@ -1859,9 +1845,9 @@ ParseTraditionalInclude (char *file)
      * Search for it first on the -I search path, then on the .PATH
      * search path, if not found in a -I directory.
      */
-    fullname = Dir_FindFile(file, parseIncPath);
+    fullname = Dir_FindFile(file, &parseIncPath);
     if (fullname == NULL) {
-        fullname = Dir_FindFile(file, dirSearchPath);
+        fullname = Dir_FindFile(file, &dirSearchPath);
     }
 
     if (fullname == NULL) {
@@ -1869,7 +1855,7 @@ ParseTraditionalInclude (char *file)
         * Still haven't found the makefile. Look for it on the system
         * path as a last resort.
         */
-       fullname = Dir_FindFile(file, sysIncPath);
+       fullname = Dir_FindFile(file, &sysIncPath);
     }
 
     if (fullname == NULL) {
@@ -1887,7 +1873,7 @@ ParseTraditionalInclude (char *file)
     oldFile = emalloc(sizeof(IFile));
     memcpy(oldFile, &curFile, sizeof(IFile));
 
-    Lst_AtFront(includes, oldFile);
+    Lst_AtFront(&includes, oldFile);
 
     /*
      * Once the previous state has been saved, we can get down to reading
@@ -1933,12 +1919,12 @@ ParseEOF(int opened)
 {
     IFile     *ifile;  /* the state on the top of the includes stack */
 
-    if (Lst_IsEmpty (includes)) {
+    if (Lst_IsEmpty(&includes)) {
        Var_Append(".MAKEFILE_LIST", "..", VAR_GLOBAL);
        return (DONE);
     }
 
-    ifile = Lst_DeQueue(includes);
+    ifile = Lst_DeQueue(&includes);
     free(curFile.fname);
     if (opened && curFile.F) {
        fclose(curFile.F);
@@ -2348,9 +2334,8 @@ ParseFinishLine(void)
 {
 
     if (inLine) {
-       Lst_ForEach(targets, Suff_EndTransform, NULL);
-       Lst_Destroy(targets, ParseHasCommands);
-       targets = NULL;
+       Lst_ForEach(&targets, Suff_EndTransform, NULL);
+       Lst_Destroy(&targets, ParseHasCommands);
        inLine = FALSE;
     }
 }
@@ -2449,7 +2434,7 @@ Parse_File(char *name, FILE *stream)
                         * in a dependency spec, add the command to the list of
                         * commands of all targets in the dependency spec
                         */
-                       Lst_ForEach(targets, ParseAddCmd, cp);
+                       Lst_ForEach(&targets, ParseAddCmd, cp);
                        continue;
                    } else {
                        Parse_Error(PARSE_FATAL,
@@ -2500,10 +2485,7 @@ Parse_File(char *name, FILE *stream)
                /*
                 * Need a non-circular list for the target nodes
                 */
-               if (targets)
-                   Lst_Destroy(targets, NOFREE);
-
-               targets = Lst_Init();
+               Lst_Destroy(&targets, NOFREE);
                inLine = TRUE;
 
                ParseDoDependency (line);
@@ -2544,20 +2526,16 @@ Parse_Init(void)
 {
 
     mainNode = NULL;
-    parseIncPath = Lst_Init();
-    sysIncPath = Lst_Init();
-    includes = Lst_Init();
 }
 
 void
 Parse_End(void)
 {
 
-    if (targets)
-       Lst_Destroy(targets, NOFREE);
-    Lst_Destroy(sysIncPath, Dir_Destroy);
-    Lst_Destroy(parseIncPath, Dir_Destroy);
-    Lst_Destroy(includes, NOFREE);     /* Should be empty now */
+    Lst_Destroy(&targets, NOFREE);
+    Lst_Destroy(&sysIncPath, Dir_Destroy);
+    Lst_Destroy(&parseIncPath, Dir_Destroy);
+    Lst_Destroy(&includes, NOFREE);    /* Should be empty now */
 }
 
 
@@ -2575,21 +2553,17 @@ Parse_End(void)
  *
  *-----------------------------------------------------------------------
  */
-Lst *
-Parse_MainName(void)
+void
+Parse_MainName(Lst *listmain)
 {
-    Lst *listmain;             /* result list */
-
-    listmain = Lst_Init();
 
     if (mainNode == NULL) {
        Punt("no target to make.");
        /*NOTREACHED*/
     } else if (mainNode->type & OP_DOUBLEDEP) {
        Lst_AtEnd(listmain, mainNode);
-       Lst_Concat(listmain, mainNode->cohorts, LST_CONCNEW);
+       Lst_Concat(listmain, &mainNode->cohorts, LST_CONCNEW);
     }
     else
        Lst_AtEnd(listmain, mainNode);
-    return (listmain);
 }
index fbc990a..2534dd6 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.21 2004/12/17 08:01:40 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/suff.c,v 1.22 2004/12/17 08:13:30 okumoto Exp $
  */
 
 /*-
 #include         "hash.h"
 #include         "dir.h"
 
-static Lst       *sufflist;    /* Lst of suffixes */
-static Lst      *suffClean;    /* Lst of suffixes to be cleaned */
-static Lst      *srclist;      /* Lst of sources */
-static Lst       *transforms;  /* Lst of transformation rules */
+/* Lst of suffixes */
+static Lst sufflist = Lst_Initializer(sufflist);
+
+/* Lst of suffixes to be cleaned */
+static Lst suffClean = Lst_Initializer(suffClean);
+
+/* Lst of sources */
+static Lst srclist = Lst_Initializer(srclist);
+
+/* Lst of transformation rules */
+static Lst transforms = Lst_Initializer(transforms);
 
 static int        sNum = 0;    /* Counter for assigning suffix numbers */
 
@@ -113,13 +120,13 @@ typedef struct _Suff {
 #define        SUFF_INCLUDE      0x01      /* One which is #include'd */
 #define        SUFF_LIBRARY      0x02      /* One which contains a library */
 #define        SUFF_NULL         0x04      /* The empty suffix */
-    Lst         *searchPath;   /* The path along which files of this suffix
+    Lst         searchPath;    /* The path along which files of this suffix
                                 * may be found */
     int          sNum;         /* The suffix number */
     int                 refCount;      /* Reference count of list membership */
-    Lst          *parents;     /* Suffixes we have a transformation to */
-    Lst          *children;    /* Suffixes we have a transformation from */
-    Lst                 *ref;          /* List of lists this suffix is referenced */
+    Lst          parents;      /* Suffixes we have a transformation to */
+    Lst          children;     /* Suffixes we have a transformation from */
+    Lst                 ref;           /* List of lists this suffix is referenced */
 } Suff;
 
 /*
@@ -134,7 +141,7 @@ typedef struct _Src {
     int                    children;   /* Count of existing children (so we don't free
                                 * this thing too early or never nuke it) */
 #ifdef DEBUG_SRC
-    Lst                    *cp;        /* Debug; children list */
+    Lst                    cp;         /* Debug; children list */
 #endif
 } Src;
 
@@ -354,10 +361,10 @@ SuffFree(void *sp)
     if (s == emptySuff)
        emptySuff = NULL;
 
-    Lst_Destroy(s->ref, NOFREE);
-    Lst_Destroy(s->children, NOFREE);
-    Lst_Destroy(s->parents, NOFREE);
-    Lst_Destroy(s->searchPath, Dir_Destroy);
+    Lst_Destroy(&s->ref, NOFREE);
+    Lst_Destroy(&s->children, NOFREE);
+    Lst_Destroy(&s->parents, NOFREE);
+    Lst_Destroy(&s->searchPath, Dir_Destroy);
 
     free(s->name);
     free(s);
@@ -420,12 +427,12 @@ SuffInsert(Lst *l, Suff *s)
        DEBUGF(SUFF, ("at end of list\n"));
        Lst_AtEnd (l, s);
        s->refCount++;
-       Lst_AtEnd(s->ref, l);
+       Lst_AtEnd(&s->ref, l);
     } else if (s2->sNum != s->sNum) {
        DEBUGF(SUFF, ("before %s(%d)\n", s2->name, s2->sNum));
        Lst_Insert(l, ln, s);
        s->refCount++;
-       Lst_AtEnd(s->ref, l);
+       Lst_AtEnd(&s->ref, l);
     } else {
        DEBUGF(SUFF, ("already there\n"));
     }
@@ -452,9 +459,8 @@ void
 Suff_ClearSuffixes(void)
 {
 
-    Lst_Concat(suffClean, sufflist, LST_CONCLINK);
-    free(sufflist);
-    sufflist = Lst_Init();
+    Lst_Concat(&suffClean, &sufflist, LST_CONCLINK);
+
     sNum = 1;
     suffNull = emptySuff;
     /*
@@ -463,8 +469,7 @@ Suff_ClearSuffixes(void)
      * NOFREE is used because all suffixes are are on the suffClean list.
      * suffNull should not have parents.
      */
-    Lst_Destroy(suffNull->children, NOFREE);
-    suffNull->children = Lst_Init();
+    Lst_Destroy(&suffNull->children, NOFREE);
 }
 
 /*-
@@ -503,9 +508,9 @@ SuffParseTransform(char *str, Suff **srcPtr, Suff **targPtr)
      */
     for (;;) {
        if (srcLn == NULL) {
-           srcLn = Lst_Find(sufflist, str, SuffSuffIsPrefix);
+           srcLn = Lst_Find(&sufflist, str, SuffSuffIsPrefix);
        } else {
-           srcLn = Lst_FindFrom(sufflist, Lst_Succ(srcLn), str,
+           srcLn = Lst_FindFrom(&sufflist, Lst_Succ(srcLn), str,
                                  SuffSuffIsPrefix);
        }
        if (srcLn == NULL) {
@@ -534,7 +539,7 @@ SuffParseTransform(char *str, Suff **srcPtr, Suff **targPtr)
            single = src;
            singleLn = srcLn;
        } else {
-           targLn = Lst_Find(sufflist, str2, SuffSuffHasNameP);
+           targLn = Lst_Find(&sufflist, str2, SuffSuffHasNameP);
            if (targLn != NULL) {
                *srcPtr = src;
                *targPtr = Lst_Datum(targLn);
@@ -588,14 +593,14 @@ Suff_AddTransform(char *line)
                   *t;          /* target suffix */
     LstNode      *ln;          /* Node for existing transformation */
 
-    ln = Lst_Find(transforms, line, SuffGNHasNameP);
+    ln = Lst_Find(&transforms, line, SuffGNHasNameP);
     if (ln == NULL) {
        /*
         * Make a new graph node for the transformation. It will be filled in
         * by the Parse module.
         */
        gn = Targ_NewGN(line);
-       Lst_AtEnd(transforms, gn);
+       Lst_AtEnd(&transforms, gn);
     } else {
        /*
         * New specification for transformation rule. Just nuke the old list
@@ -604,10 +609,8 @@ Suff_AddTransform(char *line)
         * attached to several different transformations.
         */
        gn = Lst_Datum(ln);
-       Lst_Destroy(gn->commands, NOFREE);
-       Lst_Destroy(gn->children, NOFREE);
-       gn->commands = Lst_Init();
-       gn->children = Lst_Init();
+       Lst_Destroy(&gn->commands, NOFREE);
+       Lst_Destroy(&gn->children, NOFREE);
     }
 
     gn->type = OP_TRANSFORM;
@@ -619,8 +622,8 @@ Suff_AddTransform(char *line)
      */
     DEBUGF(SUFF, ("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);
 }
@@ -647,8 +650,8 @@ Suff_EndTransform(void *gnp, void *dummy __unused)
 {
     GNode *gn = (GNode *)gnp;
 
-    if ((gn->type & OP_TRANSFORM) && Lst_IsEmpty(gn->commands) &&
-       Lst_IsEmpty(gn->children))
+    if ((gn->type & OP_TRANSFORM) && Lst_IsEmpty(&gn->commands) &&
+       Lst_IsEmpty(&gn->children))
     {
        Suff    *s, *t;
 
@@ -670,12 +673,12 @@ Suff_EndTransform(void *gnp, void *dummy __unused)
         * 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(s->parents, t);
+       SuffRemove(&s->parents, t);
     } else if (gn->type & OP_TRANSFORM) {
        DEBUGF(SUFF, ("transformation %s complete\n", gn->name));
     }
@@ -719,7 +722,7 @@ SuffRebuildGraph(void *transformp, void *sp)
        if (cp[0] == '\0')  /* null rule */
            s2 = suffNull;
        else {
-           ln = Lst_Find(sufflist, cp, SuffSuffHasNameP);
+           ln = Lst_Find(&sufflist, cp, SuffSuffHasNameP);
            if (ln != NULL)
                s2 = Lst_Datum(ln);
        }
@@ -728,8 +731,8 @@ SuffRebuildGraph(void *transformp, void *sp)
             * Found target. Link in and return, since it can't be anything
             * else.
             */
-           SuffInsert(s2->children, s);
-           SuffInsert(s->parents, s2);
+           SuffInsert(&s2->children, s);
+           SuffInsert(&s->parents, s2);
            return (0);
        }
     }
@@ -743,7 +746,7 @@ SuffRebuildGraph(void *transformp, void *sp)
         * Null-terminate the source suffix in order to find it.
         */
        cp[1] = '\0';
-       ln = Lst_Find(sufflist, transform->name, SuffSuffHasNameP);
+       ln = Lst_Find(&sufflist, transform->name, SuffSuffHasNameP);
        /*
         * Replace the start of the target suffix
         */
@@ -753,8 +756,8 @@ SuffRebuildGraph(void *transformp, void *sp)
             * Found it -- establish the proper relationship
             */
            s2 = Lst_Datum(ln);
-           SuffInsert(s->children, s2);
-           SuffInsert(s2->parents, s);
+           SuffInsert(&s->children, s2);
+           SuffInsert(&s2->parents, s);
        }
     }
     return (0);
@@ -780,27 +783,27 @@ Suff_AddSuffix(char *str)
     Suff          *s;      /* new suffix descriptor */
     LstNode      *ln;
 
-    ln = Lst_Find(sufflist, str, SuffSuffHasNameP);
+    ln = Lst_Find(&sufflist, str, SuffSuffHasNameP);
     if (ln == NULL) {
        s = emalloc(sizeof(Suff));
 
        s->name = estrdup(str);
        s->nameLen = strlen (s->name);
-       s->searchPath = Lst_Init();
-       s->children = Lst_Init();
-       s->parents = Lst_Init();
-       s->ref = Lst_Init();
+       Lst_Init(&s->searchPath);
+       Lst_Init(&s->children);
+       Lst_Init(&s->parents);
+       Lst_Init(&s->ref);
        s->sNum = sNum++;
        s->flags = 0;
        s->refCount = 0;
 
-       Lst_AtEnd(sufflist, s);
+       Lst_AtEnd(&sufflist, s);
 
        /*
         * Look for any existing transformations from or to this suffix.
         * XXX: Only do this after a Suff_ClearSuffixes?
         */
-       Lst_ForEach(transforms, SuffRebuildGraph, s);
+       Lst_ForEach(&transforms, SuffRebuildGraph, s);
     }
 }
 
@@ -823,12 +826,12 @@ Suff_GetPath(char *sname)
     LstNode      *ln;
     Suff         *s;
 
-    ln = Lst_Find(sufflist, sname, SuffSuffHasNameP);
+    ln = Lst_Find(&sufflist, sname, SuffSuffHasNameP);
     if (ln == NULL) {
        return (NULL);
     } else {
        s = Lst_Datum(ln);
-       return (s->searchPath);
+       return (&s->searchPath);
     }
 }
 
@@ -856,39 +859,39 @@ Suff_DoPaths(void)
     Suff       *s;
     LstNode    *ln;
     char       *ptr;
-    Lst                *inIncludes;    /* Cumulative .INCLUDES path */
-    Lst                *inLibs;        /* Cumulative .LIBS path */
+    Lst                inIncludes;     /* Cumulative .INCLUDES path */
+    Lst                inLibs;         /* Cumulative .LIBS path */
 
-    inIncludes = Lst_Init();
-    inLibs = Lst_Init();
+    Lst_Init(&inIncludes);
+    Lst_Init(&inLibs);
 
-    for (ln = Lst_First(sufflist); ln != NULL; ln = Lst_Succ(ln)) {
+    for (ln = Lst_First(&sufflist); ln != NULL; ln = Lst_Succ(ln)) {
        s = Lst_Datum(ln);
-       if (!Lst_IsEmpty(s->searchPath)) {
+       if (!Lst_IsEmpty(&s->searchPath)) {
 #ifdef INCLUDES
            if (s->flags & SUFF_INCLUDE) {
-               Dir_Concat(inIncludes, s->searchPath);
+               Dir_Concat(&inIncludes, &s->searchPath);
            }
 #endif /* INCLUDES */
 #ifdef LIBRARIES
            if (s->flags & SUFF_LIBRARY) {
-               Dir_Concat(inLibs, s->searchPath);
+               Dir_Concat(&inLibs, &s->searchPath);
            }
 #endif /* LIBRARIES */
-           Dir_Concat(s->searchPath, dirSearchPath);
+           Dir_Concat(&s->searchPath, &dirSearchPath);
        } else {
-           Lst_Destroy(s->searchPath, Dir_Destroy);
-           s->searchPath = Lst_Duplicate(dirSearchPath, Dir_CopyDir);
+           Lst_Destroy(&s->searchPath, Dir_Destroy);
+           Lst_Duplicate(&s->searchPath, &dirSearchPath, Dir_CopyDir);
        }
     }
 
-    Var_Set(".INCLUDES", ptr = Dir_MakeFlags("-I", inIncludes), VAR_GLOBAL);
+    Var_Set(".INCLUDES", ptr = Dir_MakeFlags("-I", &inIncludes), VAR_GLOBAL);
     free(ptr);
-    Var_Set(".LIBS", ptr = Dir_MakeFlags("-L", inLibs), VAR_GLOBAL);
+    Var_Set(".LIBS", ptr = Dir_MakeFlags("-L", &inLibs), VAR_GLOBAL);
     free(ptr);
 
-    Lst_Destroy(inIncludes, Dir_Destroy);
-    Lst_Destroy(inLibs, Dir_Destroy);
+    Lst_Destroy(&inIncludes, Dir_Destroy);
+    Lst_Destroy(&inLibs, Dir_Destroy);
 }
 
 /*-
@@ -912,7 +915,7 @@ Suff_AddInclude(char *sname)
     LstNode      *ln;
     Suff         *s;
 
-    ln = Lst_Find(sufflist, sname, SuffSuffHasNameP);
+    ln = Lst_Find(&sufflist, sname, SuffSuffHasNameP);
     if (ln != NULL) {
        s = Lst_Datum(ln);
        s->flags |= SUFF_INCLUDE;
@@ -941,7 +944,7 @@ Suff_AddLib(char *sname)
     LstNode      *ln;
     Suff         *s;
 
-    ln = Lst_Find(sufflist, sname, SuffSuffHasNameP);
+    ln = Lst_Find(&sufflist, sname, SuffSuffHasNameP);
     if (ln != NULL) {
        s = Lst_Datum(ln);
        s->flags |= SUFF_LIBRARY;
@@ -991,9 +994,9 @@ SuffAddSrc(void *sp, void *lsp)
        targ->children += 1;
        Lst_AtEnd(ls->l, s2);
 #ifdef DEBUG_SRC
-       s2->cp = Lst_Init();
-       Lst_AtEnd(targ->cp, s2);
-       printf("1 add %x %x to %x:", targ, s2, ls->l);
+       Lst_Init(&s2->cp);
+       Lst_AtEnd(&targ->cp, s2);
+       printf("1 add %p %p to %p:", targ, s2, ls->l);
        Lst_ForEach(ls->l, PrintAddr, (void *)NULL);
        printf("\n");
 #endif
@@ -1009,9 +1012,9 @@ SuffAddSrc(void *sp, void *lsp)
     targ->children += 1;
     Lst_AtEnd(ls->l, s2);
 #ifdef DEBUG_SRC
-    s2->cp = Lst_Init();
-    Lst_AtEnd(targ->cp, s2);
-    printf("2 add %x %x to %x:", targ, s2, ls->l);
+    Lst_Init(&s2->cp);
+    Lst_AtEnd(&targ->cp, s2);
+    printf("2 add %p %p to %p:", targ, s2, ls->l);
     Lst_ForEach(ls->l, PrintAddr, (void *)NULL);
     printf("\n");
 #endif
@@ -1039,7 +1042,7 @@ SuffAddLevel(Lst *l, Src *targ)
     ls.s = targ;
     ls.l = l;
 
-    Lst_ForEach(targ->suff->children, SuffAddSrc, &ls);
+    Lst_ForEach(&targ->suff->children, SuffAddSrc, &ls);
 }
 
 /*-
@@ -1078,15 +1081,15 @@ SuffRemoveSrc(Lst *l)
                free(s->pref);
            else {
 #ifdef DEBUG_SRC
-               LstNode *ln = Lst_Member(s->parent->cp, s);
+               LstNode *ln = Lst_Member(&s->parent->cp, s);
                if (ln != NULL)
-                   Lst_Remove(s->parent->cp, ln);
+                   Lst_Remove(&s->parent->cp, ln);
 #endif
                --s->parent->children;
            }
 #ifdef DEBUG_SRC
-           printf("free: [l=%x] p=%x %d\n", l, s, s->children);
-           Lst_Destroy(s->cp, NOFREE);
+           printf("free: [l=%p] p=%p %d\n", l, s, s->children);
+           Lst_Destroy(&s->cp, NOFREE);
 #endif
            Lst_Remove(l, ln);
            free(s);
@@ -1095,8 +1098,8 @@ SuffRemoveSrc(Lst *l)
        }
 #ifdef DEBUG_SRC
        else {
-           printf("keep: [l=%x] p=%x %d: ", l, s, s->children);
-           Lst_ForEach(s->cp, PrintAddr, (void *)NULL);
+           printf("keep: [l=%p] p=%p %d: ", l, s, s->children);
+           Lst_ForEach(&s->cp, PrintAddr, (void *)NULL);
            printf("\n");
        }
 #endif
@@ -1137,16 +1140,16 @@ SuffFindThem(Lst *srcs, Lst *slst)
         */
        if (Targ_FindNode(s->file, TARG_NOCREATE) != NULL) {
 #ifdef DEBUG_SRC
-           printf("remove %x from %x\n", s, srcs);
+           printf("remove %p from %p\n", s, srcs);
 #endif
            rs = s;
            break;
        }
 
-       if ((ptr = Dir_FindFile(s->file, s->suff->searchPath)) != NULL) {
+       if ((ptr = Dir_FindFile(s->file, &s->suff->searchPath)) != NULL) {
            rs = s;
 #ifdef DEBUG_SRC
-           printf("remove %x from %x\n", s, srcs);
+           printf("remove %p from %p\n", s, srcs);
 #endif
            free(ptr);
            break;
@@ -1193,7 +1196,7 @@ SuffFindCmds (Src *targ, Lst *slst)
     t = targ->node;
     prefLen = strlen(targ->pref);
 
-    for (ln = Lst_First(t->children); ln != NULL; ln = Lst_Succ(ln)) {
+    for (ln = Lst_First(&t->children); ln != NULL; ln = Lst_Succ(ln)) {
        s = Lst_Datum(ln);
 
        cp = strrchr(s->name, '/');
@@ -1207,7 +1210,7 @@ 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);
+           ln = Lst_Find(&sufflist, &cp[prefLen], SuffSuffHasNameP);
            if (ln != NULL) {
                /*
                 * It even has a known suffix, see if there's a transformation
@@ -1217,7 +1220,7 @@ SuffFindCmds (Src *targ, Lst *slst)
                 */
                suff = Lst_Datum(ln);
 
-               if (Lst_Member(suff->parents, targ->suff) != NULL) {
+               if (Lst_Member(&suff->parents, targ->suff) != NULL) {
                    /*
                     * Hot Damn! Create a new Src structure to describe
                     * this transformation (making sure to duplicate the
@@ -1234,9 +1237,9 @@ SuffFindCmds (Src *targ, Lst *slst)
                    ret->children = 0;
                    targ->children += 1;
 #ifdef DEBUG_SRC
-                   ret->cp = Lst_Init();
-                   printf("3 add %x %x\n", targ, ret);
-                   Lst_AtEnd(targ->cp, ret);
+                   Lst_Init(&ret->cp);
+                   printf("3 add %p %p\n", &targ, ret);
+                   Lst_AtEnd(&targ->cp, ret);
 #endif
                    Lst_AtEnd(slst, ret);
                    DEBUGF(SUFF, ("\tusing existing source %s\n", s->name));
@@ -1278,7 +1281,7 @@ SuffExpandChildren(void *cgnp, void *pgnp)
      * New nodes effectively take the place of the child, so place them
      * after the child
      */
-    prevLN = Lst_Member(pgn->children, cgn);
+    prevLN = Lst_Member(&pgn->children, cgn);
 
     /*
      * First do variable expansion -- this takes precedence over
@@ -1291,7 +1294,7 @@ SuffExpandChildren(void *cgnp, void *pgnp)
        cp = Var_Subst(NULL, cgn->name, pgn, TRUE);
 
        if (cp != NULL) {
-           Lst *members = Lst_Init();
+           Lst members = Lst_Initializer(members);
 
            if (cgn->type & OP_ARCHV) {
                /*
@@ -1301,7 +1304,7 @@ SuffExpandChildren(void *cgnp, void *pgnp)
                 */
                char    *sacrifice = cp;
 
-               Arch_ParseArchive(&sacrifice, members, pgn);
+               Arch_ParseArchive(&sacrifice, &members, pgn);
            } else {
                /*
                 * Break the result into a vector of strings whose nodes
@@ -1323,7 +1326,7 @@ SuffExpandChildren(void *cgnp, void *pgnp)
                         */
                        *cp++ = '\0';
                        gn = Targ_FindNode(start, TARG_CREATE);
-                       Lst_AtEnd(members, gn);
+                       Lst_AtEnd(&members, gn);
                        while (*cp == ' ' || *cp == '\t') {
                            cp++;
                        }
@@ -1362,7 +1365,7 @@ SuffExpandChildren(void *cgnp, void *pgnp)
                     * Stuff left over -- add it to the list too
                     */
                    gn = Targ_FindNode(start, TARG_CREATE);
-                   Lst_AtEnd(members, gn);
+                   Lst_AtEnd(&members, gn);
                }
                /*
                 * Point cp back at the beginning again so the variable value
@@ -1373,18 +1376,18 @@ SuffExpandChildren(void *cgnp, void *pgnp)
            /*
             * Add all elements of the members list to the parent node.
             */
-           while(!Lst_IsEmpty(members)) {
-               gn = Lst_DeQueue(members);
+           while(!Lst_IsEmpty(&members)) {
+               gn = Lst_DeQueue(&members);
 
                DEBUGF(SUFF, ("%s...", gn->name));
-               if (Lst_Member(pgn->children, gn) == NULL) {
-                   Lst_Append(pgn->children, prevLN, gn);
+               if (Lst_Member(&pgn->children, gn) == NULL) {
+                   Lst_Append(&pgn->children, prevLN, gn);
                    prevLN = Lst_Succ(prevLN);
-                   Lst_AtEnd(gn->parents, pgn);
+                   Lst_AtEnd(&gn->parents, pgn);
                    pgn->unmade++;
                }
            }
-           Lst_Destroy(members, NOFREE);
+
            /*
             * Free the result
             */
@@ -1394,12 +1397,12 @@ SuffExpandChildren(void *cgnp, void *pgnp)
         * Now the source is expanded, remove it from the list of children to
         * keep it from being processed.
         */
-       ln = Lst_Member(pgn->children, cgn);
+       ln = Lst_Member(&pgn->children, cgn);
        pgn->unmade--;
-       Lst_Remove(pgn->children, ln);
+       Lst_Remove(&pgn->children, ln);
        DEBUGF(SUFF, ("\n"));
     } else if (Dir_HasWildcards(cgn->name)) {
-       Lst *exp;           /* List of expansions */
+       Lst exp;            /* List of expansions */
        Lst *path;          /* Search path along which to expand */
 
        /*
@@ -1411,7 +1414,7 @@ SuffExpandChildren(void *cgnp, void *pgnp)
         * Else use the default system search path.
         */
        cp = cgn->name + strlen(cgn->name);
-       ln = Lst_Find(sufflist, cp, SuffSuffIsSuffixP);
+       ln = Lst_Find(&sufflist, cp, SuffSuffIsSuffixP);
 
        DEBUGF(SUFF, ("Wildcard expanding \"%s\"...", cgn->name));
 
@@ -1419,25 +1422,25 @@ SuffExpandChildren(void *cgnp, void *pgnp)
            Suff    *s = Lst_Datum(ln);
 
            DEBUGF(SUFF, ("suffix is \"%s\"...", s->name));
-           path = s->searchPath;
+           path = &s->searchPath;
        } else {
            /*
             * Use default search path
             */
-           path = dirSearchPath;
+           path = &dirSearchPath;
        }
 
        /*
         * Expand the word along the chosen path
         */
-       exp = Lst_Init();
-       Dir_Expand(cgn->name, path, exp);
+       Lst_Init(&exp);
+       Dir_Expand(cgn->name, path, &exp);
 
-       while (!Lst_IsEmpty(exp)) {
+       while (!Lst_IsEmpty(&exp)) {
            /*
             * Fetch next expansion off the list and find its GNode
             */
-           cp = Lst_DeQueue(exp);
+           cp = Lst_DeQueue(&exp);
 
            DEBUGF(SUFF, ("%s...", cp));
            gn = Targ_FindNode(cp, TARG_CREATE);
@@ -1446,26 +1449,21 @@ SuffExpandChildren(void *cgnp, void *pgnp)
             * If gn isn't already a child of the parent, make it so and
             * up the parent's count of unmade children.
             */
-           if (Lst_Member(pgn->children, gn) == NULL) {
-               Lst_Append(pgn->children, prevLN, gn);
+           if (Lst_Member(&pgn->children, gn) == NULL) {
+               Lst_Append(&pgn->children, prevLN, gn);
                prevLN = Lst_Succ(prevLN);
-               Lst_AtEnd(gn->parents, pgn);
+               Lst_AtEnd(&gn->parents, pgn);
                pgn->unmade++;
            }
        }
 
-       /*
-        * Nuke what's left of the list
-        */
-       Lst_Destroy(exp, NOFREE);
-
        /*
         * Now the source is expanded, remove it from the list of children to
         * keep it from being processed.
         */
-       ln = Lst_Member(pgn->children, cgn);
+       ln = Lst_Member(&pgn->children, cgn);
        pgn->unmade--;
-       Lst_Remove(pgn->children, ln);
+       Lst_Remove(&pgn->children, ln);
        DEBUGF(SUFF, ("\n"));
     }
 
@@ -1497,13 +1495,13 @@ SuffApplyTransform(GNode *tGn, GNode *sGn, Suff *t, Suff *s)
     char       *tname;     /* Name of transformation rule */
     GNode      *gn;        /* Node for same */
 
-    if (Lst_Member(tGn->children, sGn) == NULL) {
+    if (Lst_Member(&tGn->children, sGn) == NULL) {
        /*
         * Not already linked, so form the proper links between the
         * target and source.
         */
-       Lst_AtEnd(tGn->children, sGn);
-       Lst_AtEnd(sGn->parents, tGn);
+       Lst_AtEnd(&tGn->children, sGn);
+       Lst_AtEnd(&sGn->parents, tGn);
        tGn->unmade += 1;
     }
 
@@ -1514,16 +1512,16 @@ SuffApplyTransform(GNode *tGn, GNode *sGn, Suff *t, Suff *s)
         * sGn gets the target in its iParents list, however, as that
         * will be sufficient to get the .IMPSRC variable set for tGn
         */
-       for (ln = Lst_First(sGn->cohorts); ln != NULL; ln = Lst_Succ(ln)) {
+       for (ln = Lst_First(&sGn->cohorts); ln != NULL; ln = Lst_Succ(ln)) {
            gn = Lst_Datum(ln);
 
-           if (Lst_Member(tGn->children, gn) == NULL) {
+           if (Lst_Member(&tGn->children, gn) == NULL) {
                /*
                 * Not already linked, so form the proper links between the
                 * target and source.
                 */
-               Lst_AtEnd(tGn->children, gn);
-               Lst_AtEnd(gn->parents, tGn);
+               Lst_AtEnd(&tGn->children, gn);
+               Lst_AtEnd(&gn->parents, tGn);
                tGn->unmade += 1;
            }
        }
@@ -1532,7 +1530,7 @@ SuffApplyTransform(GNode *tGn, GNode *sGn, Suff *t, Suff *s)
      * Locate the transformation rule itself
      */
     tname = str_concat(s->name, t->name, 0);
-    ln = Lst_Find(transforms, tname, SuffGNHasNameP);
+    ln = Lst_Find(&transforms, tname, SuffGNHasNameP);
     free(tname);
 
     if (ln == NULL) {
@@ -1551,7 +1549,7 @@ SuffApplyTransform(GNode *tGn, GNode *sGn, Suff *t, Suff *s)
     /*
      * Record last child for expansion purposes
      */
-    ln = Lst_Last(tGn->children);
+    ln = Lst_Last(&tGn->children);
 
     /*
      * Pass the buck to Make_HandleUse to apply the rule
@@ -1563,14 +1561,14 @@ SuffApplyTransform(GNode *tGn, GNode *sGn, Suff *t, Suff *s)
      */
     ln = Lst_Succ(ln);
     if (ln != NULL) {
-       Lst_ForEachFrom(tGn->children, ln, SuffExpandChildren, tGn);
+       Lst_ForEachFrom(&tGn->children, ln, SuffExpandChildren, tGn);
     }
 
     /*
      * Keep track of another parent to which this beast is transformed so
      * the .IMPSRC variable can be set correctly for the parent.
      */
-    Lst_AtEnd(sGn->iParents, tGn);
+    Lst_AtEnd(&sGn->iParents, tGn);
 
     return (TRUE);
 }
@@ -1628,9 +1626,9 @@ SuffFindArchiveDeps(GNode *gn, Lst *slst)
     /*
      * Create the link between the two nodes right off
      */
-    if (Lst_Member(gn->children, mem) == NULL) {
-       Lst_AtEnd(gn->children, mem);
-       Lst_AtEnd(mem->parents, gn);
+    if (Lst_Member(&gn->children, mem) == NULL) {
+       Lst_AtEnd(&gn->children, mem);
+       Lst_AtEnd(&mem->parents, gn);
        gn->unmade += 1;
     }
 
@@ -1672,7 +1670,7 @@ SuffFindArchiveDeps(GNode *gn, Lst *slst)
        /*
         * Use first matching suffix...
         */
-       ln = Lst_Find(ms->parents, eoarch, SuffSuffIsSuffixP);
+       ln = Lst_Find(&ms->parents, eoarch, SuffSuffIsSuffixP);
 
        if (ln != NULL) {
            /*
@@ -1726,8 +1724,8 @@ 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
+    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,
                             * but different suff and pref fields */
     Src                *bottom;    /* Start of found transformation path */
@@ -1743,9 +1741,9 @@ SuffFindNormalDeps(GNode *gn, Lst *slst)
     /*
      * Begin at the beginning...
      */
-    ln = Lst_First(sufflist);
-    srcs = Lst_Init();
-    targs = Lst_Init();
+    ln = Lst_First(&sufflist);
+    Lst_Init(&srcs);
+    Lst_Init(&targs);
 
     /*
      * We're caught in a catch-22 here. On the one hand, we want to use any
@@ -1770,7 +1768,7 @@ SuffFindNormalDeps(GNode *gn, Lst *slst)
        /*
         * Look for next possible suffix...
         */
-       ln = Lst_FindFrom(sufflist, ln, eoname, SuffSuffIsSuffixP);
+       ln = Lst_FindFrom(&sufflist, ln, eoname, SuffSuffIsSuffixP);
 
        if (ln != NULL) {
            int     prefLen;        /* Length of the prefix */
@@ -1787,7 +1785,7 @@ SuffFindNormalDeps(GNode *gn, Lst *slst)
            target->parent = NULL;
            target->children = 0;
 #ifdef DEBUG_SRC
-           target->cp = Lst_Init();
+           Lst_Init(&target->cp);
 #endif
 
            /*
@@ -1802,12 +1800,12 @@ SuffFindNormalDeps(GNode *gn, Lst *slst)
            /*
             * Add nodes from which the target can be made
             */
-           SuffAddLevel(srcs, target);
+           SuffAddLevel(&srcs, target);
 
            /*
             * Record the target so we can nuke it
             */
-           Lst_AtEnd(targs, target);
+           Lst_AtEnd(&targs, target);
 
            /*
             * Search from this suffix's successor...
@@ -1819,7 +1817,7 @@ SuffFindNormalDeps(GNode *gn, Lst *slst)
     /*
      * Handle target of unknown suffix...
      */
-    if (Lst_IsEmpty(targs) && suffNull != NULL) {
+    if (Lst_IsEmpty(&targs) && suffNull != NULL) {
        DEBUGF(SUFF, ("\tNo known suffix on %s. Using .NULL suffix\n", gn->name));
 
        targ = emalloc(sizeof(Src));
@@ -1831,37 +1829,37 @@ SuffFindNormalDeps(GNode *gn, Lst *slst)
        targ->children = 0;
        targ->pref = estrdup(sopref);
 #ifdef DEBUG_SRC
-       targ->cp = Lst_Init();
+       Lst_Init(&targ->cp);
 #endif
 
        /*
         * Only use the default suffix rules if we don't have commands
         * or dependencies defined for this gnode
         */
-       if (Lst_IsEmpty(gn->commands) && Lst_IsEmpty(gn->children))
-           SuffAddLevel(srcs, targ);
+       if (Lst_IsEmpty(&gn->commands) && Lst_IsEmpty(&gn->children))
+           SuffAddLevel(&srcs, targ);
        else {
            DEBUGF(SUFF, ("not "));
        }
 
        DEBUGF(SUFF, ("adding suffix rules\n"));
 
-       Lst_AtEnd(targs, targ);
+       Lst_AtEnd(&targs, targ);
     }
 
     /*
      * 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 = Lst_Datum(Lst_First(targs));
+       if (!Lst_IsEmpty(&targs)) {
+           targ = Lst_Datum(Lst_First(&targs));
        } else {
            targ = NULL;
        }
@@ -1889,7 +1887,7 @@ SuffFindNormalDeps(GNode *gn, Lst *slst)
      * Now we've got the important local variables set, expand any sources
      * that still contain variables or wildcards in their names.
      */
-    Lst_ForEach(gn->children, SuffExpandChildren, (void *)gn);
+    Lst_ForEach(&gn->children, SuffExpandChildren, (void *)gn);
 
     if (targ == NULL) {
        DEBUGF(SUFF, ("\tNo valid suffix on %s\n", gn->name));
@@ -1901,11 +1899,11 @@ sfnd_abort:
         * or [XXX] it has neither children or commands).
         */
        if (OP_NOP(gn->type) ||
-           (Lst_IsEmpty(gn->children) && Lst_IsEmpty(gn->commands)))
+           (Lst_IsEmpty(&gn->children) && Lst_IsEmpty(&gn->commands)))
        {
            gn->path = Dir_FindFile(gn->name,
-                                   (targ == NULL ? dirSearchPath :
-                                    targ->suff->searchPath));
+                                   (targ == NULL ? &dirSearchPath :
+                                    &targ->suff->searchPath));
            if (gn->path != NULL) {
                char *ptr;
                Var_Set(TARGET, gn->path, gn);
@@ -1980,7 +1978,7 @@ sfnd_abort:
     /*
      * Check for overriding transformation rule implied by sources
      */
-    if (!Lst_IsEmpty(gn->children)) {
+    if (!Lst_IsEmpty(&gn->children)) {
        src = SuffFindCmds(targ, slst);
 
        if (src != NULL) {
@@ -2074,13 +2072,11 @@ sfnd_return:
        if (Lst_Member(slst, bottom) == NULL)
            Lst_AtEnd(slst, bottom);
 
-    while (SuffRemoveSrc(srcs) || SuffRemoveSrc(targs))
+    while (SuffRemoveSrc(&srcs) || SuffRemoveSrc(&targs))
        continue;
 
-    Lst_Concat(slst, srcs, LST_CONCLINK);
-    Lst_Concat(slst, targs, LST_CONCLINK);
-    free(srcs);
-    free(targs);
+    Lst_Concat(slst, &srcs, LST_CONCLINK);
+    Lst_Concat(slst, &targs, LST_CONCLINK);
 }
 
 /*-
@@ -2114,8 +2110,8 @@ void
 Suff_FindDeps(GNode *gn)
 {
 
-    SuffFindDeps(gn, srclist);
-    while (SuffRemoveSrc(srclist))
+    SuffFindDeps(gn, &srclist);
+    while (SuffRemoveSrc(&srclist))
        continue;
 }
 
@@ -2149,13 +2145,13 @@ SuffFindDeps(GNode *gn, Lst *slst)
        LstNode *ln;
        Suff    *s;
 
-       ln = Lst_Find(sufflist, LIBSUFF, SuffSuffHasNameP);
+       ln = Lst_Find(&sufflist, LIBSUFF, SuffSuffHasNameP);
        if (gn->suffix)
            gn->suffix->refCount--;
        if (ln != NULL) {
            gn->suffix = s = Lst_Datum (ln);
            gn->suffix->refCount++;
-           Arch_FindLib(gn, s->searchPath);
+           Arch_FindLib(gn, &s->searchPath);
        } else {
            gn->suffix = NULL;
            Var_Set(TARGET, gn->name, gn);
@@ -2194,7 +2190,7 @@ Suff_SetNull(char *name)
     Suff    *s;
     LstNode *ln;
 
-    ln = Lst_Find(sufflist, name, SuffSuffHasNameP);
+    ln = Lst_Find(&sufflist, name, SuffSuffHasNameP);
     if (ln != NULL) {
        s = Lst_Datum(ln);
        if (suffNull != NULL) {
@@ -2227,11 +2223,6 @@ void
 Suff_Init(void)
 {
 
-    sufflist = Lst_Init();
-    suffClean = Lst_Init();
-    srclist = Lst_Init();
-    transforms = Lst_Init();
-
     sNum = 0;
     /*
      * Create null suffix for single-suffix rules (POSIX). The thing doesn't
@@ -2242,11 +2233,11 @@ Suff_Init(void)
 
     suffNull->name = estrdup("");
     suffNull->nameLen = 0;
-    suffNull->searchPath = Lst_Init();
-    Dir_Concat(suffNull->searchPath, dirSearchPath);
-    suffNull->children = Lst_Init();
-    suffNull->parents = Lst_Init();
-    suffNull->ref = Lst_Init();
+    Lst_Init(&suffNull->searchPath);
+    Dir_Concat(&suffNull->searchPath, &dirSearchPath);
+    Lst_Init(&suffNull->children);
+    Lst_Init(&suffNull->parents);
+    Lst_Init(&suffNull->ref);
     suffNull->sNum = sNum++;
     suffNull->flags = SUFF_NULL;
     suffNull->refCount = 1;
@@ -2269,12 +2260,12 @@ void
 Suff_End(void)
 {
 
-    Lst_Destroy(sufflist, SuffFree);
-    Lst_Destroy(suffClean, SuffFree);
+    Lst_Destroy(&sufflist, SuffFree);
+    Lst_Destroy(&suffClean, SuffFree);
     if (suffNull)
        SuffFree(suffNull);
-    Lst_Destroy(srclist, NOFREE);
-    Lst_Destroy(transforms, NOFREE);
+    Lst_Destroy(&srclist, NOFREE);
+    Lst_Destroy(&transforms, NOFREE);
 }
 
 /********************* DEBUGGING FUNCTIONS **********************/
@@ -2320,13 +2311,13 @@ SuffPrintSuff(void *sp, void *dummy __unused)
     }
     fputc('\n', stdout);
     printf("#\tTo: ");
-    Lst_ForEach(s->parents, SuffPrintName, (void *)NULL);
+    Lst_ForEach(&s->parents, SuffPrintName, (void *)NULL);
     fputc('\n', stdout);
     printf("#\tFrom: ");
-    Lst_ForEach(s->children, SuffPrintName, (void *)NULL);
+    Lst_ForEach(&s->children, SuffPrintName, (void *)NULL);
     fputc('\n', stdout);
     printf("#\tSearch Path: ");
-    Dir_PrintPath(s->searchPath);
+    Dir_PrintPath(&s->searchPath);
     fputc('\n', stdout);
     return (0);
 }
@@ -2339,7 +2330,7 @@ SuffPrintTrans(void *tp, void *dummy __unused)
     printf("%-16s: ", t->name);
     Targ_PrintType(t->type);
     fputc('\n', stdout);
-    Lst_ForEach(t->commands, Targ_PrintCmd, (void *)NULL);
+    Lst_ForEach(&t->commands, Targ_PrintCmd, (void *)NULL);
     fputc('\n', stdout);
     return (0);
 }
@@ -2349,8 +2340,8 @@ Suff_PrintAll(void)
 {
 
     printf("#*** Suffixes:\n");
-    Lst_ForEach(sufflist, SuffPrintSuff, (void *)NULL);
+    Lst_ForEach(&sufflist, SuffPrintSuff, (void *)NULL);
 
     printf("#*** Transformations:\n");
-    Lst_ForEach(transforms, SuffPrintTrans, (void *)NULL);
+    Lst_ForEach(&transforms, SuffPrintTrans, (void *)NULL);
 }
index 62bced8..affbe60 100644 (file)
@@ -37,7 +37,7 @@
  *
  * @(#)targ.c  8.2 (Berkeley) 3/19/94
  * $FreeBSD: src/usr.bin/make/targ.c,v 1.10 1999/09/11 13:08:02 hoek Exp $
- * $DragonFly: src/usr.bin/make/targ.c,v 1.18 2004/12/17 08:09:58 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/targ.c,v 1.19 2004/12/17 08:13:30 okumoto Exp $
  */
 
 /*-
@@ -87,7 +87,9 @@
 #include         "hash.h"
 #include         "dir.h"
 
-static Lst        *allTargets; /* the list of all targets found so far */
+/* the list of all targets found so far */
+static Lst allTargets = Lst_Initializer(allTargets);
+
 static Hash_Table targets;     /* a hash table of same */
 
 #define        HTSIZE  191             /* initial size of hash table */
@@ -112,7 +114,6 @@ void
 Targ_Init(void)
 {
 
-    allTargets = Lst_Init();
     Hash_InitTable(&targets, HTSIZE);
 }
 
@@ -132,7 +133,7 @@ void
 Targ_End(void)
 {
 
-    Lst_Destroy(allTargets, NOFREE);
+    Lst_Destroy(&allTargets, NOFREE);
     Hash_DeleteTable(&targets);
 }
 
@@ -168,14 +169,14 @@ Targ_NewGN(char *name)
     gn->childMade = FALSE;
     gn->order = 0;
     gn->mtime = gn->cmtime = 0;
-    gn->iParents = Lst_Init();
-    gn->cohorts = Lst_Init();
-    gn->parents = Lst_Init();
-    gn->children = Lst_Init();
-    gn->successors = Lst_Init();
-    gn->preds = Lst_Init();
-    gn->context = Lst_Init();
-    gn->commands = Lst_Init();
+    Lst_Init(&gn->iParents);
+    Lst_Init(&gn->cohorts);
+    Lst_Init(&gn->parents);
+    Lst_Init(&gn->children);
+    Lst_Init(&gn->successors);
+    Lst_Init(&gn->preds);
+    Lst_Init(&gn->context);
+    Lst_Init(&gn->commands);
     gn->suffix = NULL;
 
     return (gn);
@@ -208,7 +209,7 @@ Targ_FindNode(char *name, int flags)
        if (isNew) {
            gn = Targ_NewGN(name);
            Hash_SetValue (he, gn);
-           Lst_AtEnd(allTargets, gn);
+           Lst_AtEnd(&allTargets, gn);
        }
     } else {
        he = Hash_FindEntry(&targets, name);
@@ -236,16 +237,13 @@ Targ_FindNode(char *name, int flags)
  *     an error message will be printed for each name which can't be found.
  * -----------------------------------------------------------------------
  */
-Lst *
-Targ_FindList(Lst *names, int flags)
+void
+Targ_FindList(Lst *nodes, Lst *names, int flags)
 {
-    Lst            *nodes;     /* result list */
     LstNode       *ln;         /* name list element */
     GNode         *gn;         /* node in tLn */
     char          *name;
 
-    nodes = Lst_Init();
-
     for (ln = Lst_First(names); ln != NULL; ln = Lst_Succ(ln)) {
        name = Lst_Datum(ln);
        gn = Targ_FindNode(name, flags);
@@ -257,13 +255,12 @@ Targ_FindList(Lst *names, int flags)
             */
            Lst_AtEnd(nodes, gn);
            if (gn->type & OP_DOUBLEDEP) {
-               Lst_Concat(nodes, gn->cohorts, LST_CONCNEW);
+               Lst_Concat(nodes, &gn->cohorts, LST_CONCNEW);
            }
        } else if (flags == TARG_NOCREATE) {
            Error("\"%s\" -- target unknown.", name);
        }
     }
-    return (nodes);
 }
 
 /*-
@@ -500,15 +497,15 @@ TargPrintNode(void *gnp, void *passp)
                    printf("# unmade\n");
                }
            }
-           if (!Lst_IsEmpty (gn->iParents)) {
+           if (!Lst_IsEmpty(&gn->iParents)) {
                printf("# implicit parents: ");
-               Lst_ForEach(gn->iParents, TargPrintName, (void *)NULL);
+               Lst_ForEach(&gn->iParents, TargPrintName, (void *)NULL);
                fputc('\n', stdout);
            }
        }
-       if (!Lst_IsEmpty (gn->parents)) {
+       if (!Lst_IsEmpty(&gn->parents)) {
            printf("# parents: ");
-           Lst_ForEach(gn->parents, TargPrintName, (void *)NULL);
+           Lst_ForEach(&gn->parents, TargPrintName, (void *)NULL);
            fputc('\n', stdout);
        }
 
@@ -524,12 +521,12 @@ TargPrintNode(void *gnp, void *passp)
                break;
        }
        Targ_PrintType(gn->type);
-       Lst_ForEach(gn->children, TargPrintName, (void *)NULL);
+       Lst_ForEach(&gn->children, TargPrintName, (void *)NULL);
        fputc('\n', stdout);
-       Lst_ForEach(gn->commands, Targ_PrintCmd, (void *)NULL);
+       Lst_ForEach(&gn->commands, Targ_PrintCmd, (void *)NULL);
        printf("\n\n");
        if (gn->type & OP_DOUBLEDEP) {
-           Lst_ForEach(gn->cohorts, TargPrintNode, &pass);
+           Lst_ForEach(&gn->cohorts, TargPrintNode, &pass);
        }
     }
     return (0);
@@ -576,10 +573,10 @@ Targ_PrintGraph(int pass)
 {
 
     printf("#*** Input graph:\n");
-    Lst_ForEach(allTargets, TargPrintNode, &pass);
+    Lst_ForEach(&allTargets, TargPrintNode, &pass);
     printf("\n\n");
     printf("#\n#   Files that are only sources:\n");
-    Lst_ForEach(allTargets, TargPrintOnlySrc, (void *)NULL);
+    Lst_ForEach(&allTargets, TargPrintOnlySrc, (void *)NULL);
     printf("#*** Global Variables:\n");
     Var_Dump(VAR_GLOBAL);
     printf("#*** Command-line Variables:\n");
index 6810889..262730b 100644 (file)
@@ -37,7 +37,7 @@
  *
  * @(#)var.c   8.3 (Berkeley) 3/19/94
  * $FreeBSD: src/usr.bin/make/var.c,v 1.16.2.3 2002/02/27 14:18:57 cjc Exp $
- * $DragonFly: src/usr.bin/make/var.c,v 1.26 2004/12/17 08:09:58 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/var.c,v 1.27 2004/12/17 08:13:30 okumoto Exp $
  */
 
 /*-
@@ -245,7 +245,7 @@ VarFind(char *name, GNode *ctxt, int flags)
      * Note whether this is one of the specific variables we were told through
      * the -E flag to use environment-variable-override for.
      */
-    if (Lst_Find(envFirstVars, name, (CompareProc *)strcmp) != NULL) {
+    if (Lst_Find(&envFirstVars, name, (CompareProc *)strcmp) != NULL) {
        localCheckEnvFirst = TRUE;
     } else {
        localCheckEnvFirst = FALSE;
@@ -256,15 +256,15 @@ VarFind(char *name, GNode *ctxt, int flags)
      * look for it in VAR_CMD, VAR_GLOBAL and the environment, in that order,
      * depending on the FIND_* flags in 'flags'
      */
-    var = Lst_Find(ctxt->context, name, VarCmp);
+    var = Lst_Find(&ctxt->context, name, VarCmp);
 
     if ((var == NULL) && (flags & FIND_CMD) && (ctxt != VAR_CMD)) {
-       var = Lst_Find(VAR_CMD->context, name, VarCmp);
+       var = Lst_Find(&VAR_CMD->context, name, VarCmp);
     }
     if ((var == NULL) && (flags & FIND_GLOBAL) && (ctxt != VAR_GLOBAL) &&
        !checkEnvFirst && !localCheckEnvFirst)
     {
-       var = Lst_Find(VAR_GLOBAL->context, name, VarCmp);
+       var = Lst_Find(&VAR_GLOBAL->context, name, VarCmp);
     }
     if ((var == NULL) && (flags & FIND_ENV)) {
        char *env;
@@ -285,7 +285,7 @@ VarFind(char *name, GNode *ctxt, int flags)
        } else if ((checkEnvFirst || localCheckEnvFirst) &&
                   (flags & FIND_GLOBAL) && (ctxt != VAR_GLOBAL))
        {
-           var = Lst_Find(VAR_GLOBAL->context, name, VarCmp);
+           var = Lst_Find(&VAR_GLOBAL->context, name, VarCmp);
            if (var == NULL) {
                return (NULL);
            } else {
@@ -331,7 +331,7 @@ VarAdd(char *name, char *val, GNode *ctxt)
 
     v->flags = 0;
 
-    Lst_AtFront(ctxt->context, v);
+    Lst_AtFront(&ctxt->context, v);
     DEBUGF(VAR, ("%s:%s = %s\n", ctxt->name, name, val));
 }
 
@@ -376,10 +376,10 @@ Var_Delete(char *name, GNode *ctxt)
     LstNode *ln;
 
     DEBUGF(VAR, ("%s:delete %s\n", ctxt->name, name));
-    ln = Lst_Find(ctxt->context, name, VarCmp);
+    ln = Lst_Find(&ctxt->context, name, VarCmp);
     if (ln != NULL) {
        VarDelete(Lst_Datum(ln));
-       Lst_Remove(ctxt->context, ln);
+       Lst_Remove(&ctxt->context, ln);
     }
 }
 
@@ -501,7 +501,7 @@ Var_Append(char *name, char *val, GNode *ctxt)
             * export other variables...)
             */
            v->flags &= ~VAR_FROM_ENV;
-           Lst_AtFront(ctxt->context, v);
+           Lst_AtFront(&ctxt->context, v);
        }
     }
     free(name);
@@ -1967,5 +1967,5 @@ void
 Var_Dump(GNode *ctxt)
 {
 
-    Lst_ForEach (ctxt->context, VarPrintVar, (void *)NULL);
+    Lst_ForEach(&ctxt->context, VarPrintVar, (void *)NULL);
 }