diff options
Diffstat (limited to 'contrib/bmake/var.c')
-rw-r--r-- | contrib/bmake/var.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/contrib/bmake/var.c b/contrib/bmake/var.c index 55d20bd324ac..66b18f769371 100644 --- a/contrib/bmake/var.c +++ b/contrib/bmake/var.c @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.1168 2025/06/13 18:31:08 rillig Exp $ */ +/* $NetBSD: var.c,v 1.1171 2025/06/29 11:02:17 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -143,7 +143,7 @@ #endif /* "@(#)var.c 8.3 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: var.c,v 1.1168 2025/06/13 18:31:08 rillig Exp $"); +MAKE_RCSID("$NetBSD: var.c,v 1.1171 2025/06/29 11:02:17 rillig Exp $"); /* * Variables are defined using one of the VAR=value assignments. Their @@ -452,6 +452,8 @@ VarNew(FStr name, const char *value, static Substring CanonicalVarname(Substring name) { + if (Substring_Equals(name, "^")) + return Substring_InitStr(ALLSRC); if (!(Substring_Length(name) > 0 && name.start[0] == '.')) return name; @@ -471,8 +473,6 @@ CanonicalVarname(Substring name) if (Substring_Equals(name, ".TARGET")) return Substring_InitStr(TARGET); - /* GNU make has an additional alias $^ == ${.ALLSRC}. */ - if (Substring_Equals(name, ".SHELL") && shellPath == NULL) Shell_Init(); @@ -2134,16 +2134,16 @@ typedef enum ApplyModifierResult { } ApplyModifierResult; /* - * Allow backslashes to escape the delimiter, $, and \, but don't touch other + * Allow backslashes to escape the delimiters, $, and \, but don't touch other * backslashes. */ static bool -IsEscapedModifierPart(const char *p, char delim, +IsEscapedModifierPart(const char *p, char end1, char end2, struct ModifyWord_SubstArgs *subst) { if (p[0] != '\\' || p[1] == '\0') return false; - if (p[1] == delim || p[1] == '\\' || p[1] == '$') + if (p[1] == end1 || p[1] == end2 || p[1] == '\\' || p[1] == '$') return true; return p[1] == '&' && subst != NULL; } @@ -2236,7 +2236,7 @@ ParseModifierPart( LazyBuf_Init(part, p); while (*p != '\0' && *p != end1 && *p != end2) { - if (IsEscapedModifierPart(p, end2, subst)) { + if (IsEscapedModifierPart(p, end1, end2, subst)) { LazyBuf_Add(part, p[1]); p += 2; } else if (*p != '$') { /* Unescaped, simple text */ @@ -2703,7 +2703,7 @@ ApplyModifier_Range(const char **pp, ModChain *ch) const char *p = mod + 6; if (!TryParseSize(&p, &n)) { Parse_Error(PARSE_FATAL, - "Invalid number \"%s\" for ':range' modifier", + "Invalid number \"%s\" for modifier \":range\"", mod + 6); return AMR_CLEANUP; } @@ -2834,7 +2834,7 @@ ModifyWord_Match(Substring word, SepBuf *buf, void *data) if (res.error != NULL && !args->error_reported) { args->error_reported = true; Parse_Error(PARSE_FATAL, - "%s in pattern '%s' of modifier '%s'", + "%s in pattern \"%s\" of modifier \"%s\"", res.error, args->pattern, args->neg ? ":N" : ":M"); } if (res.matched != args->neg) @@ -2927,7 +2927,7 @@ ApplyModifier_Mtime(const char **pp, ModChain *ch) invalid_argument: Parse_Error(PARSE_FATAL, - "Invalid argument '%.*s' for modifier ':mtime'", + "Invalid argument \"%.*s\" for modifier \":mtime\"", (int)strcspn(*pp + 1, ":{}()"), *pp + 1); return AMR_CLEANUP; } @@ -2965,7 +2965,7 @@ ApplyModifier_Subst(const char **pp, ModChain *ch) char delim = (*pp)[1]; if (delim == '\0') { Parse_Error(PARSE_FATAL, - "Missing delimiter for modifier ':S'"); + "Missing delimiter for modifier \":S\""); (*pp)++; return AMR_CLEANUP; } @@ -3017,7 +3017,7 @@ ApplyModifier_Regex(const char **pp, ModChain *ch) char delim = (*pp)[1]; if (delim == '\0') { Parse_Error(PARSE_FATAL, - "Missing delimiter for modifier ':C'"); + "Missing delimiter for modifier \":C\""); (*pp)++; return AMR_CLEANUP; } @@ -3995,7 +3995,7 @@ ApplyModifiersIndirect(ModChain *ch, const char **pp) else if (*p == '\0' && ch->endc != '\0') { Parse_Error(PARSE_FATAL, "Unclosed expression after indirect modifier, " - "expecting '%c'", + "expecting \"%c\"", ch->endc); *pp = p; return AMIR_OUT; @@ -4051,14 +4051,14 @@ ApplySingleModifier(const char **pp, ModChain *ch) if (*p == '\0' && ch->endc != '\0') { Parse_Error(PARSE_FATAL, - "Unclosed expression, expecting '%c' for " + "Unclosed expression, expecting \"%c\" for " "modifier \"%.*s\"", ch->endc, (int)(p - mod), mod); } else if (*p == ':') { p++; } else if (opts.strict && *p != '\0' && *p != ch->endc) { Parse_Error(PARSE_FATAL, - "Missing delimiter ':' after modifier \"%.*s\"", + "Missing delimiter \":\" after modifier \"%.*s\"", (int)(p - mod), mod); /* * TODO: propagate parse error to the enclosing @@ -4106,7 +4106,7 @@ ApplyModifiers( if (*p == '\0' && endc != '\0') { Parse_Error(PARSE_FATAL, - "Unclosed expression, expecting '%c'", ch.endc); + "Unclosed expression, expecting \"%c\"", ch.endc); goto cleanup; } @@ -4263,7 +4263,7 @@ IsShortVarnameValid(char varname, const char *start) Parse_Error(PARSE_FATAL, "Dollar followed by nothing"); else if (save_dollars) Parse_Error(PARSE_FATAL, - "Invalid variable name '%c', at \"%s\"", varname, start); + "Invalid variable name \"%c\", at \"%s\"", varname, start); return false; } @@ -4330,7 +4330,7 @@ FindLocalLegacyVar(Substring varname, GNode *scope, return NULL; if (varname.start[1] != 'F' && varname.start[1] != 'D') return NULL; - if (strchr("@%?*!<>", varname.start[0]) == NULL) + if (strchr("@%?*!<>^", varname.start[0]) == NULL) return NULL; v = VarFindSubstring(Substring_Init(varname.start, varname.start + 1), |