Module Name: src Committed By: rillig Date: Fri Nov 27 08:07:27 UTC 2020
Modified Files: src/usr.bin/make: lst.c lst.h make.c meta.c Log Message: make(1): inline Lst_ForEachUntil in meta mode This means no more unnecessary void pointers in function signatures and no more abstraction level at checking a single element of a list. In most cases it is more appropriate to define a function that operates on the list as a whole, thereby hiding implementation details like the ListNode from the caller. To generate a diff of this commit: cvs rdiff -u -r1.93 -r1.94 src/usr.bin/make/lst.c cvs rdiff -u -r1.86 -r1.87 src/usr.bin/make/lst.h cvs rdiff -u -r1.217 -r1.218 src/usr.bin/make/make.c cvs rdiff -u -r1.148 -r1.149 src/usr.bin/make/meta.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/lst.c diff -u src/usr.bin/make/lst.c:1.93 src/usr.bin/make/lst.c:1.94 --- src/usr.bin/make/lst.c:1.93 Tue Nov 24 19:46:29 2020 +++ src/usr.bin/make/lst.c Fri Nov 27 08:07:26 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: lst.c,v 1.93 2020/11/24 19:46:29 rillig Exp $ */ +/* $NetBSD: lst.c,v 1.94 2020/11/27 08:07:26 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -34,7 +34,7 @@ #include "make.h" -MAKE_RCSID("$NetBSD: lst.c,v 1.93 2020/11/24 19:46:29 rillig Exp $"); +MAKE_RCSID("$NetBSD: lst.c,v 1.94 2020/11/27 08:07:26 rillig Exp $"); static ListNode * LstNodeNew(ListNode *prev, ListNode *next, void *datum) @@ -198,20 +198,6 @@ Lst_FindDatum(List *list, const void *da return NULL; } -int -Lst_ForEachUntil(List *list, LstActionUntilProc proc, void *procData) -{ - ListNode *ln; - int result = 0; - - for (ln = list->first; ln != NULL; ln = ln->next) { - result = proc(ln->datum, procData); - if (result != 0) - break; - } - return result; -} - /* Move all nodes from src to the end of dst. * The source list is destroyed and freed. */ void Index: src/usr.bin/make/lst.h diff -u src/usr.bin/make/lst.h:1.86 src/usr.bin/make/lst.h:1.87 --- src/usr.bin/make/lst.h:1.86 Tue Nov 24 19:46:29 2020 +++ src/usr.bin/make/lst.h Fri Nov 27 08:07:26 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: lst.h,v 1.86 2020/11/24 19:46:29 rillig Exp $ */ +/* $NetBSD: lst.h,v 1.87 2020/11/27 08:07:26 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. @@ -104,8 +104,6 @@ struct List { /* Free the datum of a node, called before freeing the node itself. */ typedef void LstFreeProc(void *); -/* An action for Lst_ForEachUntil and Lst_ForEachUntilConcurrent. */ -typedef int LstActionUntilProc(void *datum, void *args); /* Create or destroy a list */ @@ -146,14 +144,6 @@ void LstNode_Set(ListNode *, void *); /* Set the value of the node to NULL. Having NULL in a list is unusual. */ void LstNode_SetNull(ListNode *); -/* Iterating over a list, using a callback function */ - -/* Run the action for each datum of the list, until the action returns - * non-zero. - * - * During this iteration, the list must not be modified structurally. */ -int Lst_ForEachUntil(List *, LstActionUntilProc, void *); - /* Using the list as a queue */ /* Add a datum at the tail of the queue. */ Index: src/usr.bin/make/make.c diff -u src/usr.bin/make/make.c:1.217 src/usr.bin/make/make.c:1.218 --- src/usr.bin/make/make.c:1.217 Tue Nov 24 23:13:09 2020 +++ src/usr.bin/make/make.c Fri Nov 27 08:07:26 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: make.c,v 1.217 2020/11/24 23:13:09 rillig Exp $ */ +/* $NetBSD: make.c,v 1.218 2020/11/27 08:07:26 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -102,7 +102,7 @@ #include "job.h" /* "@(#)make.c 8.1 (Berkeley) 6/6/93" */ -MAKE_RCSID("$NetBSD: make.c,v 1.217 2020/11/24 23:13:09 rillig Exp $"); +MAKE_RCSID("$NetBSD: make.c,v 1.218 2020/11/27 08:07:26 rillig Exp $"); /* Sequence # to detect recursion. */ static unsigned int checked_seqno = 1; @@ -1032,9 +1032,9 @@ MakePrintStatusOrder(GNode *gn) static void MakePrintStatusList(GNodeList *, int *); -/* Print the status of a top-level node, viz. it being up-to-date already +/* + * Print the status of a top-level node, viz. it being up-to-date already * or not created due to an error in a lower level. - * Callback function for Make_Run via Lst_ForEachUntil. */ static Boolean MakePrintStatus(GNode *gn, int *errors) Index: src/usr.bin/make/meta.c diff -u src/usr.bin/make/meta.c:1.148 src/usr.bin/make/meta.c:1.149 --- src/usr.bin/make/meta.c:1.148 Mon Nov 23 23:44:03 2020 +++ src/usr.bin/make/meta.c Fri Nov 27 08:07:26 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: meta.c,v 1.148 2020/11/23 23:44:03 rillig Exp $ */ +/* $NetBSD: meta.c,v 1.149 2020/11/27 08:07:26 rillig Exp $ */ /* * Implement 'meta' mode. @@ -312,17 +312,15 @@ meta_name(char *mname, size_t mnamelen, * Return true if running ${.MAKE} * Bypassed if target is flagged .MAKE */ -static int -is_submake(void *cmdp, void *gnp) +static Boolean +is_submake(const char *cmd, GNode *gn) { static const char *p_make = NULL; static size_t p_len; - char *cmd = cmdp; - GNode *gn = gnp; char *mp = NULL; char *cp; char *cp2; - int rc = 0; /* keep looking */ + Boolean rc = FALSE; if (p_make == NULL) { void *dontFreeIt; @@ -342,17 +340,17 @@ is_submake(void *cmdp, void *gnp) case ' ': case '\t': case '\n': - rc = 1; + rc = TRUE; break; } - if (cp2 > cmd && rc > 0) { + if (cp2 > cmd && rc) { switch (cp2[-1]) { case ' ': case '\t': case '\n': break; default: - rc = 0; /* no match */ + rc = FALSE; /* no match */ break; } } @@ -361,6 +359,17 @@ is_submake(void *cmdp, void *gnp) return rc; } +static Boolean +any_is_submake(GNode *gn) +{ + StringListNode *ln; + + for (ln = gn->commands->first; ln != NULL; ln = ln->next) + if (is_submake(ln->datum, gn)) + return TRUE; + return FALSE; +} + typedef struct meta_file_s { FILE *fp; GNode *gn; @@ -434,7 +443,7 @@ meta_needed(GNode *gn, const char *dname } if ((gn->type & (OP_META|OP_SUBMAKE)) == OP_SUBMAKE) { /* OP_SUBMAKE is a bit too aggressive */ - if (Lst_ForEachUntil(gn->commands, is_submake, gn)) { + if (any_is_submake(gn)) { DEBUG1(META, "Skipping meta for %s: .SUBMAKE\n", gn->name); return FALSE; } @@ -945,17 +954,25 @@ fgetLine(char **bufp, size_t *szp, int o return 0; } -/* Lst_ForEachUntil wants 1 to stop search */ -static int -prefix_match(void *p, void *q) +static Boolean +prefix_match(const char *prefix, const char *path) { - const char *prefix = p; - const char *path = q; size_t n = strlen(prefix); return strncmp(path, prefix, n) == 0; } +static Boolean +has_any_prefix(const char *path, StringList *prefixes) +{ + StringListNode *ln; + + for (ln = prefixes->first; ln != NULL; ln = ln->next) + if (prefix_match(ln->datum, path)) + return TRUE; + return FALSE; +} + /* See if the path equals prefix or starts with "prefix/". */ static Boolean path_starts_with(const char *path, const char *prefix) @@ -977,7 +994,7 @@ meta_ignore(GNode *gn, const char *p) if (*p == '/') { cached_realpath(p, fname); /* clean it up */ - if (Lst_ForEachUntil(metaIgnorePaths, prefix_match, fname)) { + if (has_any_prefix(fname, metaIgnorePaths)) { #ifdef DEBUG_META_MODE DEBUG1(META, "meta_oodate: ignoring path: %s\n", p); #endif @@ -1369,7 +1386,7 @@ meta_oodate(GNode *gn, Boolean oodate) if (strncmp(p, cwd, cwdlen) == 0) break; - if (!Lst_ForEachUntil(metaBailiwick, prefix_match, p)) + if (!has_any_prefix(p, metaBailiwick)) break; /* tmpdir might be within */