Module Name:    src
Committed By:   rillig
Date:           Fri Aug 21 04:42:03 UTC 2020

Modified Files:
        src/usr.bin/make: arch.c dir.c lst.c lst.h make.c suff.c targ.c

Log Message:
make(1): use stricter list API for sequential access

In several places, it just doesn't make sense to have a null pointer
when a list is expected.

In the existing unit tests, the list passed to Lst_Open is always valid,
but that's not a guarantee for real-world usage.  Therefore, Lst_Open
has been left for now, and Lst_OpenS is only the preferred alternative
to it.


To generate a diff of this commit:
cvs rdiff -u -r1.85 -r1.86 src/usr.bin/make/arch.c
cvs rdiff -u -r1.95 -r1.96 src/usr.bin/make/dir.c
cvs rdiff -u -r1.9 -r1.10 src/usr.bin/make/lst.c
cvs rdiff -u -r1.25 -r1.26 src/usr.bin/make/lst.h
cvs rdiff -u -r1.106 -r1.107 src/usr.bin/make/make.c
cvs rdiff -u -r1.99 -r1.100 src/usr.bin/make/suff.c
cvs rdiff -u -r1.66 -r1.67 src/usr.bin/make/targ.c

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

Modified files:

Index: src/usr.bin/make/arch.c
diff -u src/usr.bin/make/arch.c:1.85 src/usr.bin/make/arch.c:1.86
--- src/usr.bin/make/arch.c:1.85	Fri Aug 21 04:09:12 2020
+++ src/usr.bin/make/arch.c	Fri Aug 21 04:42:02 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: arch.c,v 1.85 2020/08/21 04:09:12 rillig Exp $	*/
+/*	$NetBSD: arch.c,v 1.86 2020/08/21 04:42:02 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: arch.c,v 1.85 2020/08/21 04:09:12 rillig Exp $";
+static char rcsid[] = "$NetBSD: arch.c,v 1.86 2020/08/21 04:42:02 rillig Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)arch.c	8.2 (Berkeley) 1/2/94";
 #else
-__RCSID("$NetBSD: arch.c,v 1.85 2020/08/21 04:09:12 rillig Exp $");
+__RCSID("$NetBSD: arch.c,v 1.86 2020/08/21 04:42:02 rillig Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -1158,7 +1158,7 @@ Arch_MemMTime(GNode *gn)
 	}
     }
 
-    Lst_Close(gn->parents);
+    Lst_CloseS(gn->parents);
 
     return gn->mtime;
 }

Index: src/usr.bin/make/dir.c
diff -u src/usr.bin/make/dir.c:1.95 src/usr.bin/make/dir.c:1.96
--- src/usr.bin/make/dir.c:1.95	Fri Aug 21 04:09:12 2020
+++ src/usr.bin/make/dir.c	Fri Aug 21 04:42:02 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: dir.c,v 1.95 2020/08/21 04:09:12 rillig Exp $	*/
+/*	$NetBSD: dir.c,v 1.96 2020/08/21 04:42:02 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -70,14 +70,14 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: dir.c,v 1.95 2020/08/21 04:09:12 rillig Exp $";
+static char rcsid[] = "$NetBSD: dir.c,v 1.96 2020/08/21 04:42:02 rillig Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)dir.c	8.2 (Berkeley) 1/2/94";
 #else
-__RCSID("$NetBSD: dir.c,v 1.95 2020/08/21 04:09:12 rillig Exp $");
+__RCSID("$NetBSD: dir.c,v 1.96 2020/08/21 04:42:02 rillig Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -524,7 +524,7 @@ Dir_SetPATH(void)
 	    if (cur)
 		Var_Append(".PATH", cur->name, VAR_GLOBAL);
 	}
-	Lst_Close(dirSearchPath);
+	Lst_CloseS(dirSearchPath);
     }
 }
 
@@ -817,7 +817,7 @@ DirExpandInt(const char *word, Lst path,
 	    p = (Path *)Lst_Datum(ln);
 	    DirMatchFiles(word, p, expansions);
 	}
-	Lst_Close(path);
+	Lst_CloseS(path);
     }
 }
 
@@ -1181,7 +1181,7 @@ Dir_FindFile(const char *name, Lst path)
 	 * specifies (fish.c) and what pmake finds (./fish.c).
 	 */
 	if (!hasLastDot && (file = DirFindDot(hasSlash, name, cp)) != NULL) {
-	    Lst_Close(path);
+	    Lst_CloseS(path);
 	    return file;
 	}
 
@@ -1190,17 +1190,17 @@ Dir_FindFile(const char *name, Lst path)
 	    if (p == dotLast)
 		continue;
 	    if ((file = DirLookup(p, name, cp, hasSlash)) != NULL) {
-		Lst_Close(path);
+		Lst_CloseS(path);
 		return file;
 	    }
 	}
 
 	if (hasLastDot && (file = DirFindDot(hasSlash, name, cp)) != NULL) {
-	    Lst_Close(path);
+	    Lst_CloseS(path);
 	    return file;
 	}
     }
-    Lst_Close(path);
+    Lst_CloseS(path);
 
     /*
      * We didn't find the file on any directory in the search path.
@@ -1242,7 +1242,7 @@ Dir_FindFile(const char *name, Lst path)
 		return file;
 	}
 
-	(void)Lst_Open(path);
+	Lst_OpenS(path);
 	while ((ln = Lst_NextS(path)) != NULL) {
 	    p = (Path *)Lst_Datum(ln);
 	    if (p == dotLast)
@@ -1253,11 +1253,11 @@ Dir_FindFile(const char *name, Lst path)
 		checkedDot = TRUE;
 	    }
 	    if ((file = DirLookupSubdir(p, name)) != NULL) {
-		Lst_Close(path);
+		Lst_CloseS(path);
 		return file;
 	    }
 	}
-	Lst_Close(path);
+	Lst_CloseS(path);
 
 	if (hasLastDot) {
 	    if (dot && !checkedDot) {
@@ -1300,13 +1300,13 @@ Dir_FindFile(const char *name, Lst path)
 	    return file;
 	}
 
-	(void)Lst_Open(path);
+	Lst_OpenS(path);
 	while ((ln = Lst_NextS(path)) != NULL) {
 	    p = (Path *)Lst_Datum(ln);
 	    if (p == dotLast)
 		continue;
 	    if ((file = DirLookupAbs(p, name, cp)) != NULL) {
-		Lst_Close(path);
+		Lst_CloseS(path);
 		if (file[0] == '\0') {
 		    free(file);
 		    return NULL;
@@ -1314,7 +1314,7 @@ Dir_FindFile(const char *name, Lst path)
 		return file;
 	    }
 	}
-	Lst_Close(path);
+	Lst_CloseS(path);
 
 	if (hasLastDot && cur &&
 	    ((file = DirLookupAbs(cur, name, cp)) != NULL)) {
@@ -1685,7 +1685,7 @@ Dir_MakeFlags(const char *flag, Lst path
 	    Buf_AddStr(&buf, flag);
 	    Buf_AddStr(&buf, p->name);
 	}
-	Lst_Close(path);
+	Lst_CloseS(path);
     }
 
     return Buf_Destroy(&buf, FALSE);
@@ -1808,7 +1808,7 @@ Dir_PrintDirectories(void)
 	    fprintf(debug_file, "# %-20s %10d\t%4d\n", p->name, p->refCount,
 		    p->hits);
 	}
-	Lst_Close(openDirectories);
+	Lst_CloseS(openDirectories);
     }
 }
 

Index: src/usr.bin/make/lst.c
diff -u src/usr.bin/make/lst.c:1.9 src/usr.bin/make/lst.c:1.10
--- src/usr.bin/make/lst.c:1.9	Fri Aug 21 04:09:12 2020
+++ src/usr.bin/make/lst.c	Fri Aug 21 04:42:02 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: lst.c,v 1.9 2020/08/21 04:09:12 rillig Exp $ */
+/* $NetBSD: lst.c,v 1.10 2020/08/21 04:42:02 rillig Exp $ */
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -38,11 +38,11 @@
 #include "make_malloc.h"
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: lst.c,v 1.9 2020/08/21 04:09:12 rillig Exp $";
+static char rcsid[] = "$NetBSD: lst.c,v 1.10 2020/08/21 04:42:02 rillig Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: lst.c,v 1.9 2020/08/21 04:09:12 rillig Exp $");
+__RCSID("$NetBSD: lst.c,v 1.10 2020/08/21 04:42:02 rillig Exp $");
 #endif /* not lint */
 #endif
 
@@ -907,20 +907,21 @@ Lst_Open(Lst l)
     return SUCCESS;
 }
 
-/*-
- *-----------------------------------------------------------------------
- * Lst_Next --
- *	Return the next node for the given list.
- *
- * Results:
- *	The next node or NULL if the list has yet to be opened. Also
- *	if the end has been reached, NULL is returned.
- *
- * Side Effects:
- *	the curPtr field is updated.
- *
- *-----------------------------------------------------------------------
- */
+/* Open a list for sequential access. A list can still be searched, etc.,
+ * without confusing these functions. */
+void
+Lst_OpenS(Lst l)
+{
+    assert(LstValid(l));
+    assert(!l->isOpen);
+
+    l->isOpen = TRUE;
+    l->atEnd = LstIsEmpty(l) ? Head : Unknown;
+    l->curPtr = NULL;
+}
+
+/* Return the next node for the given list, or NULL if the end has been
+ * reached. */
 LstNode
 Lst_NextS(Lst l)
 {
@@ -965,31 +966,16 @@ Lst_NextS(Lst l)
     return tln;
 }
 
-/*-
- *-----------------------------------------------------------------------
- * Lst_Close --
- *	Close a list which was opened for sequential access.
- *
- * Input:
- *	l		The list to close
- *
- * Results:
- *	None.
- *
- * Side Effects:
- *	The list is closed.
- *
- *-----------------------------------------------------------------------
- */
+/* Close a list which was opened for sequential access. */
 void
-Lst_Close(Lst l)
+Lst_CloseS(Lst l)
 {
     List list = l;
 
-    if (LstValid(l) == TRUE) {
-	list->isOpen = FALSE;
-	list->atEnd = Unknown;
-    }
+    assert(LstValid(l));
+    assert(list->isOpen);
+    list->isOpen = FALSE;
+    list->atEnd = Unknown;
 }
 
 

Index: src/usr.bin/make/lst.h
diff -u src/usr.bin/make/lst.h:1.25 src/usr.bin/make/lst.h:1.26
--- src/usr.bin/make/lst.h:1.25	Fri Aug 21 04:09:12 2020
+++ src/usr.bin/make/lst.h	Fri Aug 21 04:42:02 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: lst.h,v 1.25 2020/08/21 04:09:12 rillig Exp $	*/
+/*	$NetBSD: lst.h,v 1.26 2020/08/21 04:42:02 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -167,10 +167,11 @@ int		Lst_ForEachFrom(Lst, LstNode, int (
  */
 /* Open the list */
 ReturnStatus	Lst_Open(Lst);
+void		Lst_OpenS(Lst);
 /* Next element please, or NULL */
 LstNode		Lst_NextS(Lst);
 /* Finish table access */
-void		Lst_Close(Lst);
+void		Lst_CloseS(Lst);
 
 /*
  * for using the list as a queue

Index: src/usr.bin/make/make.c
diff -u src/usr.bin/make/make.c:1.106 src/usr.bin/make/make.c:1.107
--- src/usr.bin/make/make.c:1.106	Fri Aug 21 04:09:12 2020
+++ src/usr.bin/make/make.c	Fri Aug 21 04:42:02 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: make.c,v 1.106 2020/08/21 04:09:12 rillig Exp $	*/
+/*	$NetBSD: make.c,v 1.107 2020/08/21 04:42:02 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: make.c,v 1.106 2020/08/21 04:09:12 rillig Exp $";
+static char rcsid[] = "$NetBSD: make.c,v 1.107 2020/08/21 04:42:02 rillig Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)make.c	8.1 (Berkeley) 6/6/93";
 #else
-__RCSID("$NetBSD: make.c,v 1.106 2020/08/21 04:09:12 rillig Exp $");
+__RCSID("$NetBSD: make.c,v 1.107 2020/08/21 04:42:02 rillig Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -496,7 +496,7 @@ Make_HandleUse(GNode *cgn, GNode *pgn)
 	    (void)Lst_AtEnd(gn->parents, pgn);
 	    pgn->unmade += 1;
 	}
-	Lst_Close(cgn->children);
+	Lst_CloseS(cgn->children);
     }
 
     pgn->type |= cgn->type & ~(OP_OPMASK|OP_USE|OP_USEBEFORE|OP_TRANSFORM);
@@ -818,7 +818,7 @@ Make_Update(GNode *cgn)
 	    pgn->made = REQUESTED;
 	    (void)Lst_EnQueue(toBeMade, pgn);
 	}
-	Lst_Close(parents);
+	Lst_CloseS(parents);
     }
 
     /*
@@ -837,7 +837,7 @@ Make_Update(GNode *cgn)
 	    }
 	}
 	bmake_free(p1);
-	Lst_Close(cgn->iParents);
+	Lst_CloseS(cgn->iParents);
     }
 }
 
@@ -1446,7 +1446,7 @@ Make_ProcessWait(Lst targs)
 	}
 
 	owln = Lst_First(pgn->children);
-	Lst_Open(pgn->children);
+	Lst_OpenS(pgn->children);
 	for (; (ln = Lst_NextS(pgn->children)) != NULL; ) {
 	    cgn = Lst_Datum(ln);
 	    if (cgn->type & OP_WAIT) {
@@ -1457,7 +1457,7 @@ Make_ProcessWait(Lst targs)
 		Lst_AtEnd(examine, cgn);
 	    }
 	}
-	Lst_Close(pgn->children);
+	Lst_CloseS(pgn->children);
     }
 
     Lst_Destroy(examine, NULL);

Index: src/usr.bin/make/suff.c
diff -u src/usr.bin/make/suff.c:1.99 src/usr.bin/make/suff.c:1.100
--- src/usr.bin/make/suff.c:1.99	Fri Aug 21 04:09:12 2020
+++ src/usr.bin/make/suff.c	Fri Aug 21 04:42:02 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: suff.c,v 1.99 2020/08/21 04:09:12 rillig Exp $	*/
+/*	$NetBSD: suff.c,v 1.100 2020/08/21 04:42:02 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: suff.c,v 1.99 2020/08/21 04:09:12 rillig Exp $";
+static char rcsid[] = "$NetBSD: suff.c,v 1.100 2020/08/21 04:42:02 rillig Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)suff.c	8.4 (Berkeley) 3/21/94";
 #else
-__RCSID("$NetBSD: suff.c,v 1.99 2020/08/21 04:09:12 rillig Exp $");
+__RCSID("$NetBSD: suff.c,v 1.100 2020/08/21 04:42:02 rillig Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -499,17 +499,15 @@ SuffInsert(Lst l, Suff *s)
     LstNode 	  ln;		/* current element in l we're examining */
     Suff          *s2 = NULL;	/* the suffix descriptor in this element */
 
-    if (Lst_Open(l) == FAILURE) {
-	return;
-    }
+    Lst_OpenS(l);
     while ((ln = Lst_NextS(l)) != NULL) {
 	s2 = (Suff *)Lst_Datum(ln);
 	if (s2->sNum >= s->sNum) {
 	    break;
 	}
     }
+    Lst_CloseS(l);
 
-    Lst_Close(l);
     if (DEBUG(SUFF)) {
 	fprintf(debug_file, "inserting %s(%d)...", s->name, s->sNum);
     }
@@ -1069,13 +1067,11 @@ Suff_DoPaths(void)
     Lst	    	    	inIncludes; /* Cumulative .INCLUDES path */
     Lst	    	    	inLibs;	    /* Cumulative .LIBS path */
 
-    if (Lst_Open(sufflist) == FAILURE) {
-	return;
-    }
 
     inIncludes = Lst_Init();
     inLibs = Lst_Init();
 
+    Lst_OpenS(sufflist);
     while ((ln = Lst_NextS(sufflist)) != NULL) {
 	s = (Suff *)Lst_Datum(ln);
 	if (!Lst_IsEmpty (s->searchPath)) {
@@ -1095,6 +1091,7 @@ Suff_DoPaths(void)
 	    s->searchPath = Lst_Duplicate(dirSearchPath, Dir_CopyDir);
 	}
     }
+    Lst_CloseS(sufflist);
 
     Var_Set(".INCLUDES", ptr = Dir_MakeFlags("-I", inIncludes), VAR_GLOBAL);
     free(ptr);
@@ -1103,8 +1100,6 @@ Suff_DoPaths(void)
 
     Lst_Destroy(inIncludes, Dir_Destroy);
     Lst_Destroy(inLibs, Dir_Destroy);
-
-    Lst_Close(sufflist);
 }
 
 /*-
@@ -1291,9 +1286,8 @@ SuffRemoveSrc(Lst l)
     Src *s;
     int t = 0;
 
-    if (Lst_Open(l) == FAILURE) {
-	return 0;
-    }
+    Lst_OpenS(l);
+
 #ifdef DEBUG_SRC
     fprintf(debug_file, "cleaning %lx: ", (unsigned long) l);
     Lst_ForEach(l, PrintAddr, NULL);
@@ -1322,7 +1316,7 @@ SuffRemoveSrc(Lst l)
 	    Lst_RemoveS(l, ln);
 	    free(s);
 	    t |= 1;
-	    Lst_Close(l);
+	    Lst_CloseS(l);
 	    return TRUE;
 	}
 #ifdef DEBUG_SRC
@@ -1334,7 +1328,7 @@ SuffRemoveSrc(Lst l)
 #endif
     }
 
-    Lst_Close(l);
+    Lst_CloseS(l);
 
     return t;
 }
@@ -1435,13 +1429,13 @@ SuffFindCmds(Src *targ, Lst slst)
     char    	  	*cp;
 
     t = targ->node;
-    (void)Lst_Open(t->children);
+    Lst_OpenS(t->children);
     prefLen = strlen(targ->pref);
 
     for (;;) {
 	ln = Lst_NextS(t->children);
 	if (ln == NULL) {
-	    Lst_Close(t->children);
+	    Lst_CloseS(t->children);
 	    return NULL;
 	}
 	s = (GNode *)Lst_Datum(ln);

Index: src/usr.bin/make/targ.c
diff -u src/usr.bin/make/targ.c:1.66 src/usr.bin/make/targ.c:1.67
--- src/usr.bin/make/targ.c:1.66	Fri Aug 21 04:09:12 2020
+++ src/usr.bin/make/targ.c	Fri Aug 21 04:42:02 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: targ.c,v 1.66 2020/08/21 04:09:12 rillig Exp $	*/
+/*	$NetBSD: targ.c,v 1.67 2020/08/21 04:42:02 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: targ.c,v 1.66 2020/08/21 04:09:12 rillig Exp $";
+static char rcsid[] = "$NetBSD: targ.c,v 1.67 2020/08/21 04:42:02 rillig Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)targ.c	8.2 (Berkeley) 3/19/94";
 #else
-__RCSID("$NetBSD: targ.c,v 1.66 2020/08/21 04:09:12 rillig Exp $");
+__RCSID("$NetBSD: targ.c,v 1.67 2020/08/21 04:42:02 rillig Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -395,9 +395,7 @@ Targ_FindList(Lst names, int flags)
 
     nodes = Lst_Init();
 
-    if (Lst_Open(names) == FAILURE) {
-	return nodes;
-    }
+    Lst_OpenS(names);
     while ((ln = Lst_NextS(names)) != NULL) {
 	name = (char *)Lst_Datum(ln);
 	gn = Targ_FindNode(name, flags);
@@ -412,7 +410,7 @@ Targ_FindList(Lst names, int flags)
 	    Error("\"%s\" -- target unknown.", name);
 	}
     }
-    Lst_Close(names);
+    Lst_CloseS(names);
     return nodes;
 }
 

Reply via email to