Module Name:    src
Committed By:   rillig
Date:           Mon Nov 23 18:07:10 UTC 2020

Modified Files:
        src/usr.bin/make: hash.h suff.c

Log Message:
make(1): add HashSet type

This makes the code for handling suffixes simpler since it doesn't need
the clumsy API of HashTable_CreateEntry anymore.


To generate a diff of this commit:
cvs rdiff -u -r1.34 -r1.35 src/usr.bin/make/hash.h
cvs rdiff -u -r1.306 -r1.307 src/usr.bin/make/suff.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/hash.h
diff -u src/usr.bin/make/hash.h:1.34 src/usr.bin/make/hash.h:1.35
--- src/usr.bin/make/hash.h:1.34	Mon Nov 23 17:59:21 2020
+++ src/usr.bin/make/hash.h	Mon Nov 23 18:07:10 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: hash.h,v 1.34 2020/11/23 17:59:21 rillig Exp $	*/
+/*	$NetBSD: hash.h,v 1.35 2020/11/23 18:07:10 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -103,6 +103,11 @@ typedef struct HashIter {
 	HashEntry *entry;	/* Next entry to check in current bucket. */
 } HashIter;
 
+/* A set of strings. */
+typedef struct HashSet {
+	HashTable tbl;
+} HashSet;
+
 MAKE_INLINE void *
 HashEntry_Get(HashEntry *h)
 {
@@ -129,4 +134,31 @@ void HashTable_DebugStats(HashTable *, c
 void HashIter_Init(HashIter *, HashTable *);
 HashEntry *HashIter_Next(HashIter *);
 
+MAKE_INLINE void
+HashSet_Init(HashSet *set)
+{
+	HashTable_Init(&set->tbl);
+}
+
+MAKE_INLINE void
+HashSet_Done(HashSet *set)
+{
+	HashTable_Done(&set->tbl);
+}
+
+MAKE_INLINE Boolean
+HashSet_Add(HashSet *set, const char *key)
+{
+	Boolean isNew;
+
+	(void)HashTable_CreateEntry(&set->tbl, key, &isNew);
+	return isNew;
+}
+
+MAKE_INLINE Boolean
+HashSet_Contains(HashSet *set, const char *key)
+{
+	return HashTable_FindEntry(&set->tbl, key) != NULL;
+}
+
 #endif /* MAKE_HASH_H */

Index: src/usr.bin/make/suff.c
diff -u src/usr.bin/make/suff.c:1.306 src/usr.bin/make/suff.c:1.307
--- src/usr.bin/make/suff.c:1.306	Mon Nov 23 14:47:12 2020
+++ src/usr.bin/make/suff.c	Mon Nov 23 18:07:10 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: suff.c,v 1.306 2020/11/23 14:47:12 rillig Exp $	*/
+/*	$NetBSD: suff.c,v 1.307 2020/11/23 18:07:10 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -114,7 +114,7 @@
 #include "dir.h"
 
 /*	"@(#)suff.c	8.4 (Berkeley) 3/21/94"	*/
-MAKE_RCSID("$NetBSD: suff.c,v 1.306 2020/11/23 14:47:12 rillig Exp $");
+MAKE_RCSID("$NetBSD: suff.c,v 1.307 2020/11/23 18:07:10 rillig Exp $");
 
 #define SUFF_DEBUG0(text) DEBUG0(SUFF, text)
 #define SUFF_DEBUG1(fmt, arg1) DEBUG1(SUFF, fmt, arg1)
@@ -1060,9 +1060,9 @@ RemoveCandidate(CandidateList *srcs)
 static Candidate *
 FindThem(CandidateList *srcs, CandidateSearcher *cs)
 {
-    HashTable seen;
+    HashSet seen;
 
-    HashTable_Init(&seen);
+    HashSet_Init(&seen);
 
     while (!Lst_IsEmpty(srcs)) {
 	Candidate *src = Lst_Dequeue(srcs);
@@ -1078,7 +1078,7 @@ FindThem(CandidateList *srcs, CandidateS
 	 */
 	if (Targ_FindNode(src->file) != NULL) {
 	found:
-	    HashTable_Done(&seen);
+	    HashSet_Done(&seen);
 	    SUFF_DEBUG0("got it\n");
 	    return src;
 	}
@@ -1093,22 +1093,16 @@ FindThem(CandidateList *srcs, CandidateS
 
 	SUFF_DEBUG0("not there\n");
 
-	{
-	    Boolean isNew;
-
-	    HashTable_CreateEntry(&seen, src->file, &isNew);
-	    if (isNew)
-		CandidateList_AddCandidatesFor(srcs, src);
-	    else {
-		DEBUG1(SUFF, "FindThem: skipping duplicate \"%s\"\n",
-		       src->file);
-	    }
+	if (HashSet_Add(&seen, src->file))
+	    CandidateList_AddCandidatesFor(srcs, src);
+	else {
+	    SUFF_DEBUG1("FindThem: skipping duplicate \"%s\"\n", src->file);
 	}
 
 	CandidateSearcher_Add(cs, src);
     }
 
-    HashTable_Done(&seen);
+    HashSet_Done(&seen);
     return NULL;
 }
 

Reply via email to