Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/make make(1): make variable names in SysV modifier m...
details: https://anonhg.NetBSD.org/src/rev/f83e29dbb868
branches: trunk
changeset: 936667:f83e29dbb868
user: rillig <rillig%NetBSD.org@localhost>
date: Sat Aug 01 13:16:29 2020 +0000
description:
make(1): make variable names in SysV modifier more expressive
When matching a word against a substitution having a lhs and a rhs,
including a possible wildcard, there are just too many string variables
around to know what a simple "len" means and where it belongs.
diffstat:
usr.bin/make/var.c | 91 ++++++++++++++++++++++++++---------------------------
1 files changed, 44 insertions(+), 47 deletions(-)
diffs (170 lines):
diff -r fc3054135acd -r f83e29dbb868 usr.bin/make/var.c
--- a/usr.bin/make/var.c Sat Aug 01 12:47:56 2020 +0000
+++ b/usr.bin/make/var.c Sat Aug 01 13:16:29 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: var.c,v 1.376 2020/08/01 12:04:46 rillig Exp $ */
+/* $NetBSD: var.c,v 1.377 2020/08/01 13:16:29 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
*/
#ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: var.c,v 1.376 2020/08/01 12:04:46 rillig Exp $";
+static char rcsid[] = "$NetBSD: var.c,v 1.377 2020/08/01 13:16:29 rillig Exp $";
#else
#include <sys/cdefs.h>
#ifndef lint
#if 0
static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94";
#else
-__RCSID("$NetBSD: var.c,v 1.376 2020/08/01 12:04:46 rillig Exp $");
+__RCSID("$NetBSD: var.c,v 1.377 2020/08/01 13:16:29 rillig Exp $");
#endif
#endif /* not lint */
#endif
@@ -1165,55 +1165,55 @@
* Input:
* word Word to examine
* pattern Pattern to examine against
- * len Number of characters to substitute
*
* Results:
- * Returns the beginning position of a match or null. The number
- * of characters matched is returned in len.
+ * Returns the start of the match, or NULL.
+ * *match_len returns the length of the match, if any.
+ * *hasPercent returns whether the pattern contains a percent.
*-----------------------------------------------------------------------
*/
static const char *
-Str_SYSVMatch(const char *word, const char *pattern, size_t *len,
+Str_SYSVMatch(const char *word, const char *pattern, size_t *match_len,
Boolean *hasPercent)
{
const char *p = pattern;
const char *w = word;
- const char *m;
*hasPercent = FALSE;
- if (*p == '\0') {
- /* Null pattern is the whole string */
- *len = strlen(w);
+ if (*p == '\0') { /* ${VAR:=suffix} */
+ *match_len = strlen(w); /* Null pattern is the whole string */
return w;
}
- if ((m = strchr(p, '%')) != NULL) {
+ const char *percent = strchr(p, '%');
+ if (percent != NULL) { /* ${VAR:...%...=...} */
*hasPercent = TRUE;
- if (*w == '\0') {
- /* empty word does not match pattern */
- return NULL;
- }
+ if (*w == '\0')
+ return NULL; /* empty word does not match pattern */
+
/* check that the prefix matches */
- for (; p != m && *w && *w == *p; w++, p++)
+ for (; p != percent && *w != '\0' && *w == *p; w++, p++)
continue;
-
- if (p != m)
+ if (p != percent)
return NULL; /* No match */
- if (*++p == '\0') {
+ p++; /* Skip the percent */
+ if (*p == '\0') {
/* No more pattern, return the rest of the string */
- *len = strlen(w);
+ *match_len = strlen(w);
return w;
}
}
- m = w;
+ const char *suffix = w;
/* Find a matching tail */
+ /* XXX: This loop should not be necessary since there is only one
+ * possible position where strcmp could ever return 0. */
do {
if (strcmp(p, w) == 0) {
- *len = w - m;
- return m;
+ *match_len = w - suffix;
+ return suffix;
}
} while (*w++ != '\0');
@@ -1224,32 +1224,29 @@
/*-
*-----------------------------------------------------------------------
* Str_SYSVSubst --
- * Substitute '%' on the pattern with len characters from src.
- * If the pattern does not contain a '%' prepend len characters
- * from src.
- *
- * Side Effects:
- * Places result on buf
+ * Append rhs to the buffer, substituting the first '%' with the
+ * match, but only if the lhs had a '%' as well.
+ * If the rhs does not contain a '%', prepend the match.
*-----------------------------------------------------------------------
*/
static void
-Str_SYSVSubst(SepBuf *buf, const char *pat, const char *src, size_t src_len,
- Boolean lhsHasPercent)
+Str_SYSVSubst(SepBuf *buf, const char *rhs,
+ const char *match, size_t match_len, Boolean lhsHasPercent)
{
- const char *percent = strchr(pat, '%');
+ const char *percent = strchr(rhs, '%');
if (percent != NULL && lhsHasPercent) {
- /* Copy the prefix */
- SepBuf_AddBytesBetween(buf, pat, percent);
- pat = percent + 1;
+ /* Copy the prefix of the replacement pattern */
+ SepBuf_AddBytesBetween(buf, rhs, percent);
+ rhs = percent + 1;
}
if (percent != NULL || !lhsHasPercent) {
- /* Copy the pattern */
- SepBuf_AddBytes(buf, src, src_len);
+ /* Copy the matched part of the original word */
+ SepBuf_AddBytes(buf, match, match_len);
}
- /* append the rest */
- SepBuf_AddStr(buf, pat);
+ /* Append the suffix of the replacement pattern */
+ SepBuf_AddStr(buf, rhs);
}
@@ -1265,13 +1262,13 @@
{
const ModifyWord_SYSVSubstArgs *args = data;
- size_t len;
- Boolean hasPercent;
- const char *ptr = Str_SYSVMatch(word, args->lhs, &len, &hasPercent);
- if (ptr != NULL) {
- char *varexp = Var_Subst(args->rhs, args->ctx, VARE_WANTRES);
- Str_SYSVSubst(buf, varexp, ptr, len, hasPercent);
- free(varexp);
+ size_t match_len;
+ Boolean lhsPercent;
+ const char *match = Str_SYSVMatch(word, args->lhs, &match_len, &lhsPercent);
+ if (match != NULL) {
+ char *rhs_expanded = Var_Subst(args->rhs, args->ctx, VARE_WANTRES);
+ Str_SYSVSubst(buf, rhs_expanded, match, match_len, lhsPercent);
+ free(rhs_expanded);
} else {
SepBuf_AddStr(buf, word);
}
Home |
Main Index |
Thread Index |
Old Index