Module Name: src
Committed By: rillig
Date: Fri May 31 20:21:34 UTC 2024
Modified Files:
src/usr.bin/make: var.c
Log Message:
make: merge functions that parse modifier parts
This commit subtly changes the behavior for the :gmtime and :localtime
modifiers, but only in irrelevant cases since the time value must be an
integer, and neither '\' nor ':' nor '$' may occur in these values.
To generate a diff of this commit:
cvs rdiff -u -r1.1114 -r1.1115 src/usr.bin/make/var.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/var.c
diff -u src/usr.bin/make/var.c:1.1114 src/usr.bin/make/var.c:1.1115
--- src/usr.bin/make/var.c:1.1114 Fri May 31 05:50:11 2024
+++ src/usr.bin/make/var.c Fri May 31 20:21:34 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: var.c,v 1.1114 2024/05/31 05:50:11 rillig Exp $ */
+/* $NetBSD: var.c,v 1.1115 2024/05/31 20:21:34 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -132,7 +132,7 @@
#include "metachar.h"
/* "@(#)var.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.1114 2024/05/31 05:50:11 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.1115 2024/05/31 20:21:34 rillig Exp $");
/*
* Variables are defined using one of the VAR=value assignments. Their
@@ -2145,13 +2145,23 @@ ParseModifierPartBalanced(const char **p
}
}
-/* See ParseModifierPart for the documentation. */
+/*
+ * Parse a part of a modifier such as the "from" and "to" in :S/from/to/ or
+ * the "var" or "replacement ${var}" in :@var@replacement ${var}@, up to and
+ * including the next unescaped delimiter. The delimiter, as well as the
+ * backslash or the dollar, can be escaped with a backslash.
+ *
+ * Return true if parsing succeeded, together with the parsed (and possibly
+ * expanded) part. In that case, pp points right after the delimiter. The
+ * delimiter is not included in the part though.
+ */
static bool
-ParseModifierPartSubst(
+ParseModifierPart(
+ /* The parsing position, updated upon return */
const char **pp,
- /* If true, parse up to but excluding the next ':' or ch->endc. */
- bool whole,
- char delim,
+ char end1,
+ char end2,
+ /* Mode for evaluating nested expressions. */
VarEvalMode emode,
ModChain *ch,
LazyBuf *part,
@@ -2167,16 +2177,11 @@ ParseModifierPartSubst(
struct ModifyWord_SubstArgs *subst
)
{
- const char *p;
- char end1, end2;
+ const char *p = *pp;
- p = *pp;
LazyBuf_Init(part, p);
-
- end1 = whole ? ':' : delim;
- end2 = whole ? ch->endc : delim;
while (*p != '\0' && *p != end1 && *p != end2) {
- if (IsEscapedModifierPart(p, delim, subst)) {
+ if (IsEscapedModifierPart(p, end2, subst)) {
LazyBuf_Add(part, p[1]);
p += 2;
} else if (*p != '$') { /* Unescaped, simple text */
@@ -2185,7 +2190,7 @@ ParseModifierPartSubst(
else
LazyBuf_Add(part, *p);
p++;
- } else if (p[1] == delim) { /* Unescaped '$' at end */
+ } else if (p[1] == end2) { /* Unescaped '$' at end */
if (out_pflags != NULL)
out_pflags->anchorEnd = true;
else
@@ -2204,7 +2209,7 @@ ParseModifierPartSubst(
LazyBuf_Done(part);
return false;
}
- if (!whole)
+ if (end1 == end2)
(*pp)++;
{
@@ -2216,32 +2221,6 @@ ParseModifierPartSubst(
return true;
}
-/*
- * Parse a part of a modifier such as the "from" and "to" in :S/from/to/ or
- * the "var" or "replacement ${var}" in :@var@replacement ${var}@, up to and
- * including the next unescaped delimiter. The delimiter, as well as the
- * backslash or the dollar, can be escaped with a backslash.
- *
- * Return true if parsing succeeded, together with the parsed (and possibly
- * expanded) part. In that case, pp points right after the delimiter. The
- * delimiter is not included in the part though.
- */
-static bool
-ParseModifierPart(
- /* The parsing position, updated upon return */
- const char **pp,
- /* Parsing stops at this delimiter */
- char delim,
- /* Mode for evaluating nested expressions. */
- VarEvalMode emode,
- ModChain *ch,
- LazyBuf *part
-)
-{
- return ParseModifierPartSubst(pp, false, delim, emode, ch, part,
- NULL, NULL);
-}
-
MAKE_INLINE bool
IsDelimiter(char c, const ModChain *ch)
{
@@ -2386,7 +2365,8 @@ ApplyModifier_Loop(const char **pp, ModC
args.scope = expr->scope;
(*pp)++; /* Skip the first '@' */
- if (!ParseModifierPart(pp, '@', VARE_PARSE_ONLY, ch, &tvarBuf))
+ if (!ParseModifierPart(pp, '@', '@', VARE_PARSE_ONLY,
+ ch, &tvarBuf, NULL, NULL))
return AMR_CLEANUP;
tvar = LazyBuf_DoneGet(&tvarBuf);
args.var = tvar.str;
@@ -2398,7 +2378,8 @@ ApplyModifier_Loop(const char **pp, ModC
goto cleanup_tvar;
}
- if (!ParseModifierPart(pp, '@', VARE_PARSE_BALANCED, ch, &strBuf))
+ if (!ParseModifierPart(pp, '@', '@', VARE_PARSE_BALANCED,
+ ch, &strBuf, NULL, NULL))
goto cleanup_tvar;
str = LazyBuf_DoneGet(&strBuf);
args.body = str.str;
@@ -2542,7 +2523,7 @@ ApplyModifier_Time(const char **pp, ModC
const char *p = args + 1;
LazyBuf buf;
FStr arg;
- if (!ParseModifierPartSubst(&p, true, '\0', ch->expr->emode,
+ if (!ParseModifierPart(&p, ':', ch->endc, ch->expr->emode,
ch, &buf, NULL, NULL))
return AMR_CLEANUP;
arg = LazyBuf_DoneGet(&buf);
@@ -2624,7 +2605,8 @@ ApplyModifier_ShellCommand(const char **
FStr cmd;
(*pp)++;
- if (!ParseModifierPart(pp, '!', expr->emode, ch, &cmdBuf))
+ if (!ParseModifierPart(pp, '!', '!', expr->emode,
+ ch, &cmdBuf, NULL, NULL))
return AMR_CLEANUP;
cmd = LazyBuf_DoneGet(&cmdBuf);
@@ -2941,13 +2923,13 @@ ApplyModifier_Subst(const char **pp, Mod
(*pp)++;
}
- if (!ParseModifierPartSubst(pp,
- false, delim, ch->expr->emode, ch, &lhsBuf, &args.pflags, NULL))
+ if (!ParseModifierPart(pp, delim, delim, ch->expr->emode,
+ ch, &lhsBuf, &args.pflags, NULL))
return AMR_CLEANUP;
args.lhs = LazyBuf_Get(&lhsBuf);
- if (!ParseModifierPartSubst(pp,
- false, delim, ch->expr->emode, ch, &rhsBuf, NULL, &args)) {
+ if (!ParseModifierPart(pp, delim, delim, ch->expr->emode,
+ ch, &rhsBuf, NULL, &args)) {
LazyBuf_Done(&lhsBuf);
return AMR_CLEANUP;
}
@@ -2982,11 +2964,13 @@ ApplyModifier_Regex(const char **pp, Mod
*pp += 2;
- if (!ParseModifierPart(pp, delim, ch->expr->emode, ch, &reBuf))
+ if (!ParseModifierPart(pp, delim, delim, ch->expr->emode,
+ ch, &reBuf, NULL, NULL))
return AMR_CLEANUP;
re = LazyBuf_DoneGet(&reBuf);
- if (!ParseModifierPart(pp, delim, ch->expr->emode, ch, &replaceBuf)) {
+ if (!ParseModifierPart(pp, delim, delim, ch->expr->emode,
+ ch, &replaceBuf, NULL, NULL)) {
FStr_Done(&re);
return AMR_CLEANUP;
}
@@ -3213,7 +3197,8 @@ ApplyModifier_Words(const char **pp, Mod
FStr arg;
(*pp)++; /* skip the '[' */
- if (!ParseModifierPart(pp, ']', expr->emode, ch, &argBuf))
+ if (!ParseModifierPart(pp, ']', ']', expr->emode,
+ ch, &argBuf, NULL, NULL))
return AMR_CLEANUP;
arg = LazyBuf_DoneGet(&argBuf);
p = arg.str;
@@ -3450,10 +3435,12 @@ ApplyModifier_IfElse(const char **pp, Mo
}
(*pp)++; /* skip past the '?' */
- if (!ParseModifierPart(pp, ':', then_emode, ch, &thenBuf))
+ if (!ParseModifierPart(pp, ':', ':', then_emode,
+ ch, &thenBuf, NULL, NULL))
return AMR_CLEANUP;
- if (!ParseModifierPart(pp, ch->endc, else_emode, ch, &elseBuf)) {
+ if (!ParseModifierPart(pp, ch->endc, ch->endc, else_emode,
+ ch, &elseBuf, NULL, NULL)) {
LazyBuf_Done(&thenBuf);
return AMR_CLEANUP;
}
@@ -3533,7 +3520,8 @@ found_op:
*pp = mod + (op[0] != '=' ? 3 : 2);
- if (!ParseModifierPart(pp, ch->endc, expr->emode, ch, &buf))
+ if (!ParseModifierPart(pp, ch->endc, ch->endc, expr->emode,
+ ch, &buf, NULL, NULL))
return AMR_CLEANUP;
val = LazyBuf_DoneGet(&buf);
@@ -3692,13 +3680,12 @@ ApplyModifier_SysV(const char **pp, ModC
if (!IsSysVModifier(mod, ch->startc, ch->endc))
return AMR_UNKNOWN;
- if (!ParseModifierPart(pp, '=', expr->emode, ch, &lhsBuf))
+ if (!ParseModifierPart(pp, '=', '=', expr->emode,
+ ch, &lhsBuf, NULL, NULL))
return AMR_CLEANUP;
- /*
- * The SysV modifier lasts until the end of the expression.
- */
- if (!ParseModifierPart(pp, ch->endc, expr->emode, ch, &rhsBuf)) {
+ if (!ParseModifierPart(pp, ch->endc, ch->endc, expr->emode,
+ ch, &rhsBuf, NULL, NULL)) {
LazyBuf_Done(&lhsBuf);
return AMR_CLEANUP;
}