Module Name: src
Committed By: rillig
Date: Sat Jan 15 18:34:41 UTC 2022
Modified Files:
src/usr.bin/make: arch.c main.c meta.c nonints.h parse.c var.c
Log Message:
make: merge duplicate code for expanding variable expressions
No functional change.
To generate a diff of this commit:
cvs rdiff -u -r1.209 -r1.210 src/usr.bin/make/arch.c
cvs rdiff -u -r1.569 -r1.570 src/usr.bin/make/main.c
cvs rdiff -u -r1.189 -r1.190 src/usr.bin/make/meta.c
cvs rdiff -u -r1.237 -r1.238 src/usr.bin/make/nonints.h
cvs rdiff -u -r1.649 -r1.650 src/usr.bin/make/parse.c
cvs rdiff -u -r1.1000 -r1.1001 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/arch.c
diff -u src/usr.bin/make/arch.c:1.209 src/usr.bin/make/arch.c:1.210
--- src/usr.bin/make/arch.c:1.209 Wed Dec 15 12:58:01 2021
+++ src/usr.bin/make/arch.c Sat Jan 15 18:34:41 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: arch.c,v 1.209 2021/12/15 12:58:01 rillig Exp $ */
+/* $NetBSD: arch.c,v 1.210 2022/01/15 18:34:41 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -126,7 +126,7 @@
#include "config.h"
/* "@(#)arch.c 8.2 (Berkeley) 1/2/94" */
-MAKE_RCSID("$NetBSD: arch.c,v 1.209 2021/12/15 12:58:01 rillig Exp $");
+MAKE_RCSID("$NetBSD: arch.c,v 1.210 2022/01/15 18:34:41 rillig Exp $");
typedef struct List ArchList;
typedef struct ListNode ArchListNode;
@@ -236,12 +236,8 @@ Arch_ParseArchive(char **pp, GNodeList *
}
spec[cp++ - spec] = '\0';
- if (expandLib) {
- char *expanded;
- (void)Var_Subst(lib.str, scope, VARE_UNDEFERR, &expanded);
- /* TODO: handle errors */
- lib = FStr_InitOwn(expanded);
- }
+ if (expandLib)
+ Var_Expand(&lib, scope, VARE_UNDEFERR);
for (;;) {
/*
@@ -317,13 +313,10 @@ Arch_ParseArchive(char **pp, GNodeList *
*/
if (doSubst) {
char *fullName;
- char *p, *expandedMem;
+ char *p;
const char *unexpandedMem = mem.str;
- (void)Var_Subst(mem.str, scope, VARE_UNDEFERR,
- &expandedMem);
- /* TODO: handle errors */
- mem = FStr_InitOwn(expandedMem);
+ Var_Expand(&mem, scope, VARE_UNDEFERR);
/*
* Now form an archive spec and recurse to deal with
Index: src/usr.bin/make/main.c
diff -u src/usr.bin/make/main.c:1.569 src/usr.bin/make/main.c:1.570
--- src/usr.bin/make/main.c:1.569 Mon Jan 10 20:32:28 2022
+++ src/usr.bin/make/main.c Sat Jan 15 18:34:41 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: main.c,v 1.569 2022/01/10 20:32:28 rillig Exp $ */
+/* $NetBSD: main.c,v 1.570 2022/01/15 18:34:41 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -111,7 +111,7 @@
#include "trace.h"
/* "@(#)main.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: main.c,v 1.569 2022/01/10 20:32:28 rillig Exp $");
+MAKE_RCSID("$NetBSD: main.c,v 1.570 2022/01/15 18:34:41 rillig Exp $");
#if defined(MAKE_NATIVE) && !defined(lint)
__COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993 "
"The Regents of the University of California. "
@@ -743,14 +743,7 @@ SetVarObjdir(bool writable, const char *
return false;
}
- /* expand variable substitutions */
- if (strchr(path.str, '$') != 0) {
- char *expanded;
- (void)Var_Subst(path.str, SCOPE_GLOBAL, VARE_WANTRES, &expanded);
- /* TODO: handle errors */
- FStr_Done(&path);
- path = FStr_InitOwn(expanded);
- }
+ Var_Expand(&path, SCOPE_GLOBAL, VARE_WANTRES);
(void)Main_SetObjdir(writable, "%s%s", path.str, suffix);
Index: src/usr.bin/make/meta.c
diff -u src/usr.bin/make/meta.c:1.189 src/usr.bin/make/meta.c:1.190
--- src/usr.bin/make/meta.c:1.189 Sat Jan 15 09:08:57 2022
+++ src/usr.bin/make/meta.c Sat Jan 15 18:34:41 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: meta.c,v 1.189 2022/01/15 09:08:57 rillig Exp $ */
+/* $NetBSD: meta.c,v 1.190 2022/01/15 18:34:41 rillig Exp $ */
/*
* Implement 'meta' mode.
@@ -327,15 +327,14 @@ is_submake(const char *cmd, GNode *gn)
static const char *p_make = NULL;
static size_t p_len;
char *mp = NULL;
- const char *cp, *cp2;
+ const char *cp2;
bool rc = false;
if (p_make == NULL) {
p_make = Var_Value(gn, ".MAKE").str;
p_len = strlen(p_make);
}
- cp = strchr(cmd, '$');
- if (cp != NULL) {
+ if (strchr(cmd, '$') != NULL) {
(void)Var_Subst(cmd, gn, VARE_WANTRES, &mp);
/* TODO: handle errors */
cmd = mp;
@@ -382,13 +381,7 @@ printCMD(const char *ucmd, FILE *fp, GNo
{
FStr xcmd = FStr_InitRefer(ucmd);
- if (strchr(ucmd, '$') != NULL) {
- char *expanded;
- (void)Var_Subst(ucmd, gn, VARE_WANTRES, &expanded);
- /* TODO: handle errors */
- xcmd = FStr_InitOwn(expanded);
- }
-
+ Var_Expand(&xcmd, gn, VARE_WANTRES);
fprintf(fp, "CMD %s\n", xcmd.str);
FStr_Done(&xcmd);
}
Index: src/usr.bin/make/nonints.h
diff -u src/usr.bin/make/nonints.h:1.237 src/usr.bin/make/nonints.h:1.238
--- src/usr.bin/make/nonints.h:1.237 Sun Jan 9 18:49:28 2022
+++ src/usr.bin/make/nonints.h Sat Jan 15 18:34:41 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: nonints.h,v 1.237 2022/01/09 18:49:28 rillig Exp $ */
+/* $NetBSD: nonints.h,v 1.238 2022/01/15 18:34:41 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -310,6 +310,7 @@ FStr Var_Value(GNode *, const char *) MA
const char *GNode_ValueDirect(GNode *, const char *) MAKE_ATTR_USE;
VarParseResult Var_Parse(const char **, GNode *, VarEvalMode, FStr *);
VarParseResult Var_Subst(const char *, GNode *, VarEvalMode, char **);
+void Var_Expand(FStr *, GNode *, VarEvalMode);
void Var_Stats(void);
void Var_Dump(GNode *);
void Var_ReexportVars(void);
Index: src/usr.bin/make/parse.c
diff -u src/usr.bin/make/parse.c:1.649 src/usr.bin/make/parse.c:1.650
--- src/usr.bin/make/parse.c:1.649 Sun Jan 9 19:57:14 2022
+++ src/usr.bin/make/parse.c Sat Jan 15 18:34:41 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: parse.c,v 1.649 2022/01/09 19:57:14 rillig Exp $ */
+/* $NetBSD: parse.c,v 1.650 2022/01/15 18:34:41 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -106,7 +106,7 @@
#include "pathnames.h"
/* "@(#)parse.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: parse.c,v 1.649 2022/01/09 19:57:14 rillig Exp $");
+MAKE_RCSID("$NetBSD: parse.c,v 1.650 2022/01/15 18:34:41 rillig Exp $");
/*
* A file being read.
@@ -1621,13 +1621,7 @@ VarAssign_EvalShell(const char *name, co
char *output, *error;
cmd = FStr_InitRefer(uvalue);
- if (strchr(cmd.str, '$') != NULL) {
- char *expanded;
- (void)Var_Subst(cmd.str, SCOPE_CMDLINE, VARE_UNDEFERR,
- &expanded);
- /* TODO: handle errors */
- cmd = FStr_InitOwn(expanded);
- }
+ Var_Expand(&cmd, SCOPE_CMDLINE, VARE_UNDEFERR);
output = Cmd_Exec(cmd.str, &error);
Var_SetExpand(scope, name, output);
@@ -1955,13 +1949,7 @@ ParseInclude(char *directive)
*p = '\0';
- if (strchr(file.str, '$') != NULL) {
- char *xfile;
- Var_Subst(file.str, SCOPE_CMDLINE, VARE_WANTRES, &xfile);
- /* TODO: handle errors */
- file = FStr_InitOwn(xfile);
- }
-
+ Var_Expand(&file, SCOPE_CMDLINE, VARE_WANTRES);
IncludeFile(file.str, endc == '>', directive[0] == 'd', silent);
FStr_Done(&file);
}
Index: src/usr.bin/make/var.c
diff -u src/usr.bin/make/var.c:1.1000 src/usr.bin/make/var.c:1.1001
--- src/usr.bin/make/var.c:1.1000 Sun Jan 9 18:49:28 2022
+++ src/usr.bin/make/var.c Sat Jan 15 18:34:41 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: var.c,v 1.1000 2022/01/09 18:49:28 rillig Exp $ */
+/* $NetBSD: var.c,v 1.1001 2022/01/15 18:34:41 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -140,7 +140,7 @@
#include "metachar.h"
/* "@(#)var.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.1000 2022/01/09 18:49:28 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.1001 2022/01/15 18:34:41 rillig Exp $");
/*
* Variables are defined using one of the VAR=value assignments. Their
@@ -530,14 +530,7 @@ Var_DeleteExpand(GNode *scope, const cha
{
FStr varname = FStr_InitRefer(name);
- if (strchr(varname.str, '$') != NULL) {
- char *expanded;
- (void)Var_Subst(varname.str, SCOPE_GLOBAL, VARE_WANTRES,
- &expanded);
- /* TODO: handle errors */
- varname = FStr_InitOwn(expanded);
- }
-
+ Var_Expand(&varname, SCOPE_GLOBAL, VARE_WANTRES);
Var_Delete(scope, varname.str);
FStr_Done(&varname);
}
@@ -1049,12 +1042,7 @@ Var_SetExpandWithFlags(GNode *scope, con
assert(val != NULL);
- if (strchr(varname.str, '$') != NULL) {
- char *expanded;
- (void)Var_Subst(varname.str, scope, VARE_WANTRES, &expanded);
- /* TODO: handle errors */
- varname = FStr_InitOwn(expanded);
- }
+ Var_Expand(&varname, scope, VARE_WANTRES);
if (varname.str[0] == '\0') {
DEBUG2(VAR,
@@ -1178,22 +1166,14 @@ Var_AppendExpand(GNode *scope, const cha
assert(val != NULL);
- if (strchr(name, '$') != NULL) {
- char *expanded;
- (void)Var_Subst(name, scope, VARE_WANTRES, &expanded);
- /* TODO: handle errors */
- xname = FStr_InitOwn(expanded);
- if (expanded[0] == '\0') {
- DEBUG2(VAR,
- "Var_AppendExpand: variable name \"%s\" expands "
- "to empty string, with value \"%s\" - ignored\n",
- name, val);
- FStr_Done(&xname);
- return;
- }
- }
-
- Var_Append(scope, xname.str, val);
+ Var_Expand(&xname, scope, VARE_WANTRES);
+ if (xname.str != name && xname.str[0] == '\0')
+ DEBUG2(VAR,
+ "Var_AppendExpand: variable name \"%s\" expands "
+ "to empty string, with value \"%s\" - ignored\n",
+ name, val);
+ else
+ Var_Append(scope, xname.str, val);
FStr_Done(&xname);
}
@@ -1229,13 +1209,7 @@ Var_ExistsExpand(GNode *scope, const cha
FStr varname = FStr_InitRefer(name);
bool exists;
- if (strchr(varname.str, '$') != NULL) {
- char *expanded;
- (void)Var_Subst(varname.str, scope, VARE_WANTRES, &expanded);
- /* TODO: handle errors */
- varname = FStr_InitOwn(expanded);
- }
-
+ Var_Expand(&varname, scope, VARE_WANTRES);
exists = Var_Exists(scope, varname.str);
FStr_Done(&varname);
return exists;
@@ -1479,7 +1453,6 @@ ModifyWord_SysVSubst(Substring word, Sep
{
const struct ModifyWord_SysVSubstArgs *args = data;
FStr rhs;
- char *rhsExp;
const char *percent;
if (Substring_IsEmpty(word))
@@ -1491,11 +1464,7 @@ ModifyWord_SysVSubst(Substring word, Sep
goto no_match;
rhs = FStr_InitRefer(args->rhs);
- if (strchr(rhs.str, '$') != NULL) {
- (void)Var_Subst(args->rhs, args->scope, VARE_WANTRES, &rhsExp);
- /* TODO: handle errors */
- rhs = FStr_InitOwn(rhsExp);
- }
+ Var_Expand(&rhs, args->scope, VARE_WANTRES);
percent = args->lhsPercent ? strchr(rhs.str, '%') : NULL;
@@ -4775,6 +4744,19 @@ Var_Subst(const char *str, GNode *scope,
return VPR_OK;
}
+void
+Var_Expand(FStr *str, GNode *scope, VarEvalMode emode)
+{
+ char *expanded;
+
+ if (strchr(str->str, '$') == NULL)
+ return;
+ (void)Var_Subst(str->str, scope, emode, &expanded);
+ /* TODO: handle errors */
+ FStr_Done(str);
+ *str = FStr_InitOwn(expanded);
+}
+
/* Initialize the variables module. */
void
Var_Init(void)