Module Name: src Committed By: rillig Date: Tue Sep 22 20:19:46 UTC 2020
Modified Files: src/usr.bin/make: arch.c compat.c for.c job.c main.c make.c meta.c nonints.h parse.c suff.c var.c Log Message: make(1): prepare Var_Subst for proper error handling Returning a VarParseResult instead of a string makes it possible to let the error bubble up, until it reaches the main expression. To generate a diff of this commit: cvs rdiff -u -r1.117 -r1.118 src/usr.bin/make/arch.c cvs rdiff -u -r1.147 -r1.148 src/usr.bin/make/compat.c cvs rdiff -u -r1.84 -r1.85 src/usr.bin/make/for.c cvs rdiff -u -r1.233 -r1.234 src/usr.bin/make/job.c cvs rdiff -u -r1.340 -r1.341 src/usr.bin/make/main.c cvs rdiff -u -r1.137 -r1.138 src/usr.bin/make/make.c cvs rdiff -u -r1.116 -r1.117 src/usr.bin/make/meta.c cvs rdiff -u -r1.125 -r1.126 src/usr.bin/make/nonints.h cvs rdiff -u -r1.322 -r1.323 src/usr.bin/make/parse.c cvs rdiff -u -r1.157 -r1.158 src/usr.bin/make/suff.c cvs rdiff -u -r1.532 -r1.533 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.117 src/usr.bin/make/arch.c:1.118 --- src/usr.bin/make/arch.c:1.117 Tue Sep 22 04:05:41 2020 +++ src/usr.bin/make/arch.c Tue Sep 22 20:19:46 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: arch.c,v 1.117 2020/09/22 04:05:41 rillig Exp $ */ +/* $NetBSD: arch.c,v 1.118 2020/09/22 20:19:46 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -133,7 +133,7 @@ #include "config.h" /* "@(#)arch.c 8.2 (Berkeley) 1/2/94" */ -MAKE_RCSID("$NetBSD: arch.c,v 1.117 2020/09/22 04:05:41 rillig Exp $"); +MAKE_RCSID("$NetBSD: arch.c,v 1.118 2020/09/22 20:19:46 rillig Exp $"); #ifdef TARGET_MACHINE #undef MAKE_MACHINE @@ -247,7 +247,8 @@ Arch_ParseArchive(char **linePtr, GNodeL *cp++ = '\0'; if (subLibName) { - libName = Var_Subst(libName, ctxt, VARE_UNDEFERR|VARE_WANTRES); + (void)Var_Subst(libName, ctxt, VARE_UNDEFERR|VARE_WANTRES, &libName); + /* TODO: handle errors */ } @@ -327,7 +328,9 @@ Arch_ParseArchive(char **linePtr, GNodeL char *sacrifice; char *oldMemName = memName; - memName = Var_Subst(memName, ctxt, VARE_UNDEFERR | VARE_WANTRES); + (void)Var_Subst(memName, ctxt, VARE_UNDEFERR | VARE_WANTRES, + &memName); + /* TODO: handle errors */ /* * Now form an archive spec and recurse to deal with nested Index: src/usr.bin/make/compat.c diff -u src/usr.bin/make/compat.c:1.147 src/usr.bin/make/compat.c:1.148 --- src/usr.bin/make/compat.c:1.147 Tue Sep 22 04:05:41 2020 +++ src/usr.bin/make/compat.c Tue Sep 22 20:19:46 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: compat.c,v 1.147 2020/09/22 04:05:41 rillig Exp $ */ +/* $NetBSD: compat.c,v 1.148 2020/09/22 20:19:46 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. @@ -99,7 +99,7 @@ #include "pathnames.h" /* "@(#)compat.c 8.2 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: compat.c,v 1.147 2020/09/22 04:05:41 rillig Exp $"); +MAKE_RCSID("$NetBSD: compat.c,v 1.148 2020/09/22 20:19:46 rillig Exp $"); static GNode *curTarg = NULL; static GNode *ENDNode; @@ -209,7 +209,8 @@ Compat_RunCommand(char *cmdp, struct GNo doIt = FALSE; cmdNode = Lst_FindDatum(gn->commands, cmd); - cmdStart = Var_Subst(cmd, gn, VARE_WANTRES); + (void)Var_Subst(cmd, gn, VARE_WANTRES, &cmdStart); + /* TODO: handle errors */ /* * brk_string will return an argv with a NULL in av[0], thus causing Index: src/usr.bin/make/for.c diff -u src/usr.bin/make/for.c:1.84 src/usr.bin/make/for.c:1.85 --- src/usr.bin/make/for.c:1.84 Mon Sep 14 20:43:44 2020 +++ src/usr.bin/make/for.c Tue Sep 22 20:19:46 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: for.c,v 1.84 2020/09/14 20:43:44 rillig Exp $ */ +/* $NetBSD: for.c,v 1.85 2020/09/22 20:19:46 rillig Exp $ */ /* * Copyright (c) 1992, The Regents of the University of California. @@ -60,7 +60,7 @@ #include "strlist.h" /* "@(#)for.c 8.1 (Berkeley) 6/6/93" */ -MAKE_RCSID("$NetBSD: for.c,v 1.84 2020/09/14 20:43:44 rillig Exp $"); +MAKE_RCSID("$NetBSD: for.c,v 1.85 2020/09/22 20:19:46 rillig Exp $"); typedef enum { FOR_SUB_ESCAPE_CHAR = 0x0001, @@ -190,7 +190,9 @@ For_Eval(const char *line) * we will be substituting into ${...} or $(...). */ { - char *items = Var_Subst(ptr, VAR_GLOBAL, VARE_WANTRES); + char *items; + (void)Var_Subst(ptr, VAR_GLOBAL, VARE_WANTRES, &items); + /* TODO: handle errors */ words = Str_Words(items, FALSE); free(items); } Index: src/usr.bin/make/job.c diff -u src/usr.bin/make/job.c:1.233 src/usr.bin/make/job.c:1.234 --- src/usr.bin/make/job.c:1.233 Mon Sep 21 17:44:25 2020 +++ src/usr.bin/make/job.c Tue Sep 22 20:19:46 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: job.c,v 1.233 2020/09/21 17:44:25 rillig Exp $ */ +/* $NetBSD: job.c,v 1.234 2020/09/22 20:19:46 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. @@ -140,7 +140,7 @@ #include "trace.h" /* "@(#)job.c 8.2 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: job.c,v 1.233 2020/09/21 17:44:25 rillig Exp $"); +MAKE_RCSID("$NetBSD: job.c,v 1.234 2020/09/22 20:19:46 rillig Exp $"); # define STATIC static @@ -712,7 +712,9 @@ JobPrintCommand(void *cmdp, void *jobp) numCommands += 1; - cmdStart = cmd = Var_Subst(cmd, job->node, VARE_WANTRES); + Var_Subst(cmd, job->node, VARE_WANTRES, &cmd); + /* TODO: handle errors */ + cmdStart = cmd; cmdTemplate = "%s\n"; @@ -902,8 +904,10 @@ JobPrintCommand(void *cmdp, void *jobp) static int JobSaveCommand(void *cmd, void *gn) { - cmd = Var_Subst((char *)cmd, (GNode *)gn, VARE_WANTRES); - Lst_Append(postCommands->commands, cmd); + char *expanded_cmd; + (void)Var_Subst(cmd, (GNode *)gn, VARE_WANTRES, &expanded_cmd); + /* TODO: handle errors */ + Lst_Append(postCommands->commands, expanded_cmd); return 0; } @@ -2209,8 +2213,9 @@ Job_SetPrefix(void) Var_Set(MAKE_JOB_PREFIX, "---", VAR_GLOBAL); } - targPrefix = Var_Subst("${" MAKE_JOB_PREFIX "}", - VAR_GLOBAL, VARE_WANTRES); + (void)Var_Subst("${" MAKE_JOB_PREFIX "}", + VAR_GLOBAL, VARE_WANTRES, &targPrefix); + /* TODO: handle errors */ } /* Initialize the process module. */ Index: src/usr.bin/make/main.c diff -u src/usr.bin/make/main.c:1.340 src/usr.bin/make/main.c:1.341 --- src/usr.bin/make/main.c:1.340 Tue Sep 22 19:51:19 2020 +++ src/usr.bin/make/main.c Tue Sep 22 20:19:46 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.340 2020/09/22 19:51:19 rillig Exp $ */ +/* $NetBSD: main.c,v 1.341 2020/09/22 20:19:46 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -126,7 +126,7 @@ #endif /* "@(#)main.c 8.3 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: main.c,v 1.340 2020/09/22 19:51:19 rillig Exp $"); +MAKE_RCSID("$NetBSD: main.c,v 1.341 2020/09/22 20:19:46 rillig Exp $"); #if defined(MAKE_NATIVE) && !defined(lint) __COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993\ The Regents of the University of California. All rights reserved."); @@ -761,9 +761,11 @@ Main_SetVarObjdir(const char *var, const /* expand variable substitutions */ xpath = path; xpath_freeIt = NULL; - if (strchr(path, '$') != 0) - xpath = xpath_freeIt = Var_Subst(path, VAR_GLOBAL, - VARE_WANTRES); + if (strchr(path, '$') != 0) { + (void)Var_Subst(path, VAR_GLOBAL, VARE_WANTRES, &xpath_freeIt); + /* TODO: handle errors */ + xpath = xpath_freeIt; + } (void)Main_SetObjdir("%s%s", xpath, suffix); @@ -828,9 +830,12 @@ MakeMode(const char *mode) { char *mode_freeIt = NULL; - if (mode == NULL) - mode = mode_freeIt = Var_Subst("${" MAKE_MODE ":tl}", - VAR_GLOBAL, VARE_WANTRES); + if (mode == NULL) { + (void)Var_Subst("${" MAKE_MODE ":tl}", + VAR_GLOBAL, VARE_WANTRES, &mode_freeIt); + /* TODO: handle errors */ + mode = mode_freeIt; + } if (mode[0] != '\0') { if (strstr(mode, "compat")) { @@ -865,10 +870,14 @@ doPrintVars(void) char *p1; if (strchr(var, '$')) { - value = p1 = Var_Subst(var, VAR_GLOBAL, VARE_WANTRES); + (void)Var_Subst(var, VAR_GLOBAL, VARE_WANTRES, &p1); + /* TODO: handle errors */ + value = p1; } else if (expandVars) { char *expr = str_concat3("${", var, "}"); - value = p1 = Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES); + (void)Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES, &p1); + /* TODO: handle errors */ + value = p1; free(expr); } else { value = Var_Value(var, VAR_GLOBAL, &p1); @@ -1331,8 +1340,9 @@ main(int argc, char **argv) Fatal("%s: cannot open %s.", progname, (char *)LstNode_Datum(ln)); } else { - p1 = Var_Subst("${" MAKEFILE_PREFERENCE "}", - VAR_CMD, VARE_WANTRES); + (void)Var_Subst("${" MAKEFILE_PREFERENCE "}", + VAR_CMD, VARE_WANTRES, &p1); + /* TODO: handle errors */ (void)str2Lst_Append(makefiles, p1, NULL); (void)Lst_Find(makefiles, ReadMakefileSucceeded, NULL); free(p1); @@ -1340,8 +1350,9 @@ main(int argc, char **argv) /* In particular suppress .depend for '-r -V .OBJDIR -f /dev/null' */ if (!noBuiltins || !printVars) { - makeDependfile = Var_Subst("${.MAKE.DEPENDFILE:T}", - VAR_CMD, VARE_WANTRES); + (void)Var_Subst("${.MAKE.DEPENDFILE:T}", + VAR_CMD, VARE_WANTRES, &makeDependfile); + /* TODO: handle errors */ doing_depend = TRUE; (void)ReadMakefile(makeDependfile); doing_depend = FALSE; @@ -1360,7 +1371,8 @@ main(int argc, char **argv) char *value; int n; - value = Var_Subst("${.MAKE.JOBS}", VAR_GLOBAL, VARE_WANTRES); + (void)Var_Subst("${.MAKE.JOBS}", VAR_GLOBAL, VARE_WANTRES, &value); + /* TODO: handle errors */ n = strtol(value, NULL, 0); if (n < 1) { (void)fprintf(stderr, "%s: illegal value for .MAKE.JOBS -- must be positive integer!\n", @@ -1411,7 +1423,8 @@ main(int argc, char **argv) */ static char VPATH[] = "${VPATH}"; - vpath = Var_Subst(VPATH, VAR_CMD, VARE_WANTRES); + (void)Var_Subst(VPATH, VAR_CMD, VARE_WANTRES, &vpath); + /* TODO: handle errors */ path = vpath; do { /* skip to end of directory */ @@ -2005,7 +2018,8 @@ PrintOnError(GNode *gn, const char *s) Lst_ForEach(gn->commands, addErrorCMD, gn); } expr = "${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'\n@}"; - cp = Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES); + (void)Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES, &cp); + /* TODO: handle errors */ printf("%s", cp); free(cp); fflush(stdout); @@ -2032,7 +2046,8 @@ Main_ExportMAKEFLAGS(Boolean first) once = FALSE; expr = "${.MAKEFLAGS} ${.MAKEOVERRIDES:O:u:@v@$v=${$v:Q}@}"; - s = Var_Subst(expr, VAR_CMD, VARE_WANTRES); + (void)Var_Subst(expr, VAR_CMD, VARE_WANTRES, &s); + /* TODO: handle errors */ if (s[0] != '\0') { #ifdef POSIX setenv("MAKEFLAGS", s, 1); @@ -2054,8 +2069,9 @@ getTmpdir(void) * Honor $TMPDIR but only if it is valid. * Ensure it ends with /. */ - tmpdir = Var_Subst("${TMPDIR:tA:U" _PATH_TMP "}/", VAR_GLOBAL, - VARE_WANTRES); + (void)Var_Subst("${TMPDIR:tA:U" _PATH_TMP "}/", VAR_GLOBAL, + VARE_WANTRES, &tmpdir); + /* TODO: handle errors */ if (stat(tmpdir, &st) < 0 || !S_ISDIR(st.st_mode)) { free(tmpdir); tmpdir = bmake_strdup(_PATH_TMP); @@ -2145,8 +2161,12 @@ Boolean getBoolean(const char *name, Boolean fallback) { char *expr = str_concat3("${", name, ":U:tl}"); - char *value = Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES); - Boolean res = s2Boolean(value, fallback); + char *value; + Boolean res; + + (void)Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES, &value); + /* TODO: handle errors */ + res = s2Boolean(value, fallback); free(value); free(expr); return res; Index: src/usr.bin/make/make.c diff -u src/usr.bin/make/make.c:1.137 src/usr.bin/make/make.c:1.138 --- src/usr.bin/make/make.c:1.137 Tue Sep 22 04:05:41 2020 +++ src/usr.bin/make/make.c Tue Sep 22 20:19:46 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: make.c,v 1.137 2020/09/22 04:05:41 rillig Exp $ */ +/* $NetBSD: make.c,v 1.138 2020/09/22 20:19:46 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -107,7 +107,7 @@ #include "job.h" /* "@(#)make.c 8.1 (Berkeley) 6/6/93" */ -MAKE_RCSID("$NetBSD: make.c,v 1.137 2020/09/22 04:05:41 rillig Exp $"); +MAKE_RCSID("$NetBSD: make.c,v 1.138 2020/09/22 20:19:46 rillig Exp $"); static unsigned int checked = 1;/* Sequence # to detect recursion */ static GNodeList *toBeMade; /* The current fringe of the graph. These @@ -486,7 +486,8 @@ Make_HandleUse(GNode *cgn, GNode *pgn) } else { free(gn->name); } - gn->name = Var_Subst(gn->uname, pgn, VARE_WANTRES); + (void)Var_Subst(gn->uname, pgn, VARE_WANTRES, &gn->name); + /* TODO: handle errors */ if (gn->uname && strcmp(gn->name, gn->uname) != 0) { /* See if we have a target for this node. */ GNode *tgn = Targ_FindNode(gn->name, TARG_NOCREATE); Index: src/usr.bin/make/meta.c diff -u src/usr.bin/make/meta.c:1.116 src/usr.bin/make/meta.c:1.117 --- src/usr.bin/make/meta.c:1.116 Tue Sep 22 04:05:41 2020 +++ src/usr.bin/make/meta.c Tue Sep 22 20:19:46 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: meta.c,v 1.116 2020/09/22 04:05:41 rillig Exp $ */ +/* $NetBSD: meta.c,v 1.117 2020/09/22 20:19:46 rillig Exp $ */ /* * Implement 'meta' mode. @@ -330,7 +330,8 @@ is_submake(void *cmdp, void *gnp) } cp = strchr(cmd, '$'); if ((cp)) { - mp = Var_Subst(cmd, gn, VARE_WANTRES); + (void)Var_Subst(cmd, gn, VARE_WANTRES, &mp); + /* TODO: handle errors */ cmd = mp; } cp2 = strstr(cmd, p_make); @@ -372,7 +373,9 @@ printCMD(void *cmdp, void *mfpp) char *cmd_freeIt = NULL; if (strchr(cmd, '$')) { - cmd = cmd_freeIt = Var_Subst(cmd, mfp->gn, VARE_WANTRES); + (void)Var_Subst(cmd, mfp->gn, VARE_WANTRES, &cmd_freeIt); + /* TODO: handle errors */ + cmd = cmd_freeIt; } fprintf(mfp->fp, "CMD %s\n", cmd); free(cmd_freeIt); @@ -485,7 +488,8 @@ meta_create(BuildMon *pbm, GNode *gn) char *mp; /* Describe the target we are building */ - mp = Var_Subst("${" MAKE_META_PREFIX "}", gn, VARE_WANTRES); + (void)Var_Subst("${" MAKE_META_PREFIX "}", gn, VARE_WANTRES, &mp); + /* TODO: handle errors */ if (*mp) fprintf(stdout, "%s\n", mp); free(mp); @@ -627,8 +631,9 @@ meta_mode_init(const char *make_mode) * We consider ourselves master of all within ${.MAKE.META.BAILIWICK} */ metaBailiwick = Lst_Init(); - metaBailiwickStr = Var_Subst("${.MAKE.META.BAILIWICK:O:u:tA}", - VAR_GLOBAL, VARE_WANTRES); + (void)Var_Subst("${.MAKE.META.BAILIWICK:O:u:tA}", + VAR_GLOBAL, VARE_WANTRES, &metaBailiwickStr); + /* TODO: handle errors */ str2Lst_Append(metaBailiwick, metaBailiwickStr, NULL); /* * We ignore any paths that start with ${.MAKE.META.IGNORE_PATHS} @@ -636,8 +641,9 @@ meta_mode_init(const char *make_mode) metaIgnorePaths = Lst_Init(); Var_Append(MAKE_META_IGNORE_PATHS, "/dev /etc /proc /tmp /var/run /var/tmp ${TMPDIR}", VAR_GLOBAL); - metaIgnorePathsStr = Var_Subst("${" MAKE_META_IGNORE_PATHS ":O:u:tA}", - VAR_GLOBAL, VARE_WANTRES); + (void)Var_Subst("${" MAKE_META_IGNORE_PATHS ":O:u:tA}", + VAR_GLOBAL, VARE_WANTRES, &metaIgnorePathsStr); + /* TODO: handle errors */ str2Lst_Append(metaIgnorePaths, metaIgnorePathsStr, NULL); /* @@ -814,8 +820,9 @@ meta_job_output(Job *job, char *cp, cons if (!meta_prefix) { char *cp2; - meta_prefix = Var_Subst("${" MAKE_META_PREFIX "}", - VAR_GLOBAL, VARE_WANTRES); + (void)Var_Subst("${" MAKE_META_PREFIX "}", + VAR_GLOBAL, VARE_WANTRES, &meta_prefix); + /* TODO: handle errors */ if ((cp2 = strchr(meta_prefix, '$'))) meta_prefix_len = cp2 - meta_prefix; else @@ -998,7 +1005,8 @@ meta_ignore(GNode *gn, const char *p) Var_Set(".p.", p, gn); expr = "${" MAKE_META_IGNORE_PATTERNS ":@m@${.p.:M$m}@}"; - pm = Var_Subst(expr, gn, VARE_WANTRES); + (void)Var_Subst(expr, gn, VARE_WANTRES, &pm); + /* TODO: handle errors */ if (*pm) { #ifdef DEBUG_META_MODE if (DEBUG(META)) @@ -1018,7 +1026,8 @@ meta_ignore(GNode *gn, const char *p) snprintf(fname, sizeof(fname), "${%s:L:${%s:ts:}}", p, MAKE_META_IGNORE_FILTER); - fm = Var_Subst(fname, gn, VARE_WANTRES); + (void)Var_Subst(fname, gn, VARE_WANTRES, &fm); + /* TODO: handle errors */ if (*fm == '\0') { #ifdef DEBUG_META_MODE if (DEBUG(META)) @@ -1519,7 +1528,8 @@ meta_oodate(GNode *gn, Boolean oodate) if (DEBUG(META)) fprintf(debug_file, "%s: %d: cannot compare command using .OODATE\n", fname, lineno); } - cmd = Var_Subst(cmd, gn, VARE_WANTRES|VARE_UNDEFERR); + (void)Var_Subst(cmd, gn, VARE_WANTRES|VARE_UNDEFERR, &cmd); + /* TODO: handle errors */ if ((cp = strchr(cmd, '\n'))) { int n; Index: src/usr.bin/make/nonints.h diff -u src/usr.bin/make/nonints.h:1.125 src/usr.bin/make/nonints.h:1.126 --- src/usr.bin/make/nonints.h:1.125 Tue Sep 22 06:06:18 2020 +++ src/usr.bin/make/nonints.h Tue Sep 22 20:19:46 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: nonints.h,v 1.125 2020/09/22 06:06:18 rillig Exp $ */ +/* $NetBSD: nonints.h,v 1.126 2020/09/22 20:19:46 rillig Exp $ */ /*- * Copyright (c) 1988, 1989, 1990, 1993 @@ -267,7 +267,7 @@ Boolean Var_Exists(const char *, GNode * const char *Var_Value(const char *, GNode *, char **); VarParseResult Var_Parse(const char **, GNode *, VarEvalFlags, const char **, void **); -char *Var_Subst(const char *, GNode *, VarEvalFlags); +VarParseResult Var_Subst(const char *, GNode *, VarEvalFlags, char **); void Var_Init(void); void Var_End(void); void Var_Stats(void); Index: src/usr.bin/make/parse.c diff -u src/usr.bin/make/parse.c:1.322 src/usr.bin/make/parse.c:1.323 --- src/usr.bin/make/parse.c:1.322 Tue Sep 22 04:05:41 2020 +++ src/usr.bin/make/parse.c Tue Sep 22 20:19:46 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: parse.c,v 1.322 2020/09/22 04:05:41 rillig Exp $ */ +/* $NetBSD: parse.c,v 1.323 2020/09/22 20:19:46 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -131,7 +131,7 @@ #include "pathnames.h" /* "@(#)parse.c 8.3 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: parse.c,v 1.322 2020/09/22 04:05:41 rillig Exp $"); +MAKE_RCSID("$NetBSD: parse.c,v 1.323 2020/09/22 20:19:46 rillig Exp $"); /* types and constants */ @@ -771,7 +771,8 @@ ParseMessage(char *line) while (ch_isspace(*line)) line++; - line = Var_Subst(line, VAR_CMD, VARE_WANTRES); + (void)Var_Subst(line, VAR_CMD, VARE_WANTRES, &line); + /* TODO: handle errors */ Parse_Error(mtype, "%s", line); free(line); @@ -1924,7 +1925,8 @@ Parse_DoVar(char *line, GNode *ctxt) /* sanity check now */ char *cp2; - cp2 = Var_Subst(cp, ctxt, VARE_ASSIGN); + (void)Var_Subst(cp, ctxt, VARE_ASSIGN, &cp2); + /* TODO: handle errors */ free(cp2); } } @@ -1954,7 +1956,8 @@ Parse_DoVar(char *line, GNode *ctxt) if (!Var_Exists(line, ctxt)) Var_Set(line, "", ctxt); - cp = Var_Subst(cp, ctxt, VARE_WANTRES|VARE_ASSIGN); + (void)Var_Subst(cp, ctxt, VARE_WANTRES|VARE_ASSIGN, &cp); + /* TODO: handle errors */ oldVars = oldOldVars; freeCp = TRUE; @@ -1969,7 +1972,8 @@ Parse_DoVar(char *line, GNode *ctxt) * expansion on the whole thing. The resulting string will need * freeing when we're done. */ - cp = Var_Subst(cp, VAR_CMD, VARE_UNDEFERR|VARE_WANTRES); + (void)Var_Subst(cp, VAR_CMD, VARE_UNDEFERR|VARE_WANTRES, &cp); + /* TODO: handle errors */ freeCp = TRUE; } @@ -2266,7 +2270,8 @@ ParseDoInclude(char *line) * Substitute for any variables in the file name before trying to * find the thing. */ - file = Var_Subst(file, VAR_CMD, VARE_WANTRES); + (void)Var_Subst(file, VAR_CMD, VARE_WANTRES, &file); + /* TODO: handle errors */ Parse_include_file(file, endc == '>', *line == 'd', silent); free(file); @@ -2492,7 +2497,8 @@ ParseTraditionalInclude(char *line) * Substitute for any variables in the file name before trying to * find the thing. */ - all_files = Var_Subst(file, VAR_CMD, VARE_WANTRES); + (void)Var_Subst(file, VAR_CMD, VARE_WANTRES, &all_files); + /* TODO: handle errors */ if (*file == '\0') { Parse_Error(PARSE_FATAL, @@ -2547,7 +2553,9 @@ ParseGmakeExport(char *line) /* * Expand the value before putting it in the environment. */ - value = Var_Subst(value, VAR_CMD, VARE_WANTRES); + (void)Var_Subst(value, VAR_CMD, VARE_WANTRES, &value); + /* TODO: handle errors */ + setenv(variable, value, 1); free(value); } @@ -3100,7 +3108,8 @@ Parse_File(const char *name, int fd) VarEvalFlags eflags = DEBUG(LINT) ? VARE_WANTRES : VARE_UNDEFERR|VARE_WANTRES; - line = Var_Subst(line, VAR_CMD, eflags); + (void)Var_Subst(line, VAR_CMD, eflags, &line); + /* TODO: handle errors */ } /* Index: src/usr.bin/make/suff.c diff -u src/usr.bin/make/suff.c:1.157 src/usr.bin/make/suff.c:1.158 --- src/usr.bin/make/suff.c:1.157 Tue Sep 22 04:05:41 2020 +++ src/usr.bin/make/suff.c Tue Sep 22 20:19:46 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: suff.c,v 1.157 2020/09/22 04:05:41 rillig Exp $ */ +/* $NetBSD: suff.c,v 1.158 2020/09/22 20:19:46 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -126,7 +126,7 @@ #include "dir.h" /* "@(#)suff.c 8.4 (Berkeley) 3/21/94" */ -MAKE_RCSID("$NetBSD: suff.c,v 1.157 2020/09/22 04:05:41 rillig Exp $"); +MAKE_RCSID("$NetBSD: suff.c,v 1.158 2020/09/22 20:19:46 rillig Exp $"); #define SUFF_DEBUG0(fmt) \ if (!DEBUG(SUFF)) (void) 0; else fprintf(debug_file, fmt) @@ -1272,7 +1272,8 @@ SuffExpandChildren(GNodeListNode *cln, G } SUFF_DEBUG1("Expanding \"%s\"...", cgn->name); - cp = Var_Subst(cgn->name, pgn, VARE_UNDEFERR|VARE_WANTRES); + (void)Var_Subst(cgn->name, pgn, VARE_UNDEFERR|VARE_WANTRES, &cp); + /* TODO: handle errors */ { GNodeList *members = Lst_Init(); Index: src/usr.bin/make/var.c diff -u src/usr.bin/make/var.c:1.532 src/usr.bin/make/var.c:1.533 --- src/usr.bin/make/var.c:1.532 Tue Sep 22 19:08:47 2020 +++ src/usr.bin/make/var.c Tue Sep 22 20:19:46 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.532 2020/09/22 19:08:47 rillig Exp $ */ +/* $NetBSD: var.c,v 1.533 2020/09/22 20:19:46 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -121,7 +121,7 @@ #include "metachar.h" /* "@(#)var.c 8.3 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: var.c,v 1.532 2020/09/22 19:08:47 rillig Exp $"); +MAKE_RCSID("$NetBSD: var.c,v 1.533 2020/09/22 20:19:46 rillig Exp $"); #define VAR_DEBUG_IF(cond, fmt, ...) \ if (!(DEBUG(VAR) && (cond))) \ @@ -437,8 +437,11 @@ Var_Delete(const char *name, GNode *ctxt char *name_freeIt = NULL; Hash_Entry *he; - if (strchr(name, '$') != NULL) - name = name_freeIt = Var_Subst(name, VAR_GLOBAL, VARE_WANTRES); + if (strchr(name, '$') != NULL) { + (void)Var_Subst(name, VAR_GLOBAL, VARE_WANTRES, &name_freeIt); + /* TODO: handle errors */ + name = name_freeIt; + } he = Hash_FindEntry(&ctxt->context, name); VAR_DEBUG("%s:delete %s%s\n", ctxt->name, name, he != NULL ? "" : " (not found)"); @@ -520,7 +523,8 @@ Var_Export1(const char *name, VarExportF } expr = str_concat3("${", name, "}"); - val = Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES); + (void)Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES, &val); + /* TODO: handle errors */ setenv(name, val, 1); free(val); free(expr); @@ -573,7 +577,8 @@ Var_ExportVars(void) return; } - val = Var_Subst("${" MAKE_EXPORTED ":O:u}", VAR_GLOBAL, VARE_WANTRES); + (void)Var_Subst("${" MAKE_EXPORTED ":O:u}", VAR_GLOBAL, VARE_WANTRES, &val); + /* TODO: handle errors */ if (*val) { Words words = Str_Words(val, FALSE); size_t i; @@ -614,7 +619,8 @@ Var_Export(const char *str, Boolean isEx flags |= VAR_EXPORT_PARENT; } - val = Var_Subst(str, VAR_GLOBAL, VARE_WANTRES); + (void)Var_Subst(str, VAR_GLOBAL, VARE_WANTRES, &val); + /* TODO: handle errors */ if (val[0] != '\0') { Words words = Str_Words(val, FALSE); @@ -685,8 +691,10 @@ Var_UnExport(const char *str) if (varnames == NULL) { /* Using .MAKE.EXPORTED */ - varnames = varnames_freeIt = Var_Subst("${" MAKE_EXPORTED ":O:u}", - VAR_GLOBAL, VARE_WANTRES); + (void)Var_Subst("${" MAKE_EXPORTED ":O:u}", VAR_GLOBAL, VARE_WANTRES, + &varnames_freeIt); + /* TODO: handle errors */ + varnames = varnames_freeIt; } { @@ -716,7 +724,9 @@ Var_UnExport(const char *str) */ if (varnames == str) { char *expr = str_concat3("${" MAKE_EXPORTED ":N", v->name, "}"); - char *cp = Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES); + char *cp; + (void)Var_Subst(expr, VAR_GLOBAL, VARE_WANTRES, &cp); + /* TODO: handle errors */ Var_Set(MAKE_EXPORTED, cp, VAR_GLOBAL); free(cp); free(expr); @@ -746,8 +756,11 @@ Var_Set_with_flags(const char *name, con * here will override anything in a lower context, so there's not much * point in searching them all just to save a bit of memory... */ - if (strchr(name, '$') != NULL) - name = name_freeIt = Var_Subst(name, ctxt, VARE_WANTRES); + if (strchr(name, '$') != NULL) { + (void)Var_Subst(name, ctxt, VARE_WANTRES, &name_freeIt); + /* TODO: handle errors */ + name = name_freeIt; + } if (name[0] == '\0') { VAR_DEBUG("Var_Set(\"%s\", \"%s\", ...) " @@ -889,7 +902,9 @@ Var_Append(const char *name, const char if (strchr(name, '$') != NULL) { const char *unexpanded_name = name; - name = name_freeIt = Var_Subst(name, ctxt, VARE_WANTRES); + (void)Var_Subst(name, ctxt, VARE_WANTRES, &name_freeIt); + /* TODO: handle errors */ + name = name_freeIt; if (name[0] == '\0') { VAR_DEBUG("Var_Append(\"%s\", \"%s\", ...) " "name expands to empty string - ignored\n", @@ -940,8 +955,11 @@ Var_Exists(const char *name, GNode *ctxt char *name_freeIt = NULL; Var *v; - if (strchr(name, '$') != NULL) - name = name_freeIt = Var_Subst(name, ctxt, VARE_WANTRES); + if (strchr(name, '$') != NULL) { + (void)Var_Subst(name, ctxt, VARE_WANTRES, &name_freeIt); + /* TODO: handle errors */ + name = name_freeIt; + } v = VarFind(name, ctxt, FIND_CMD | FIND_GLOBAL | FIND_ENV); free(name_freeIt); @@ -1199,7 +1217,8 @@ ModifyWord_SYSVSubst(const char *word, S /* Append rhs to the buffer, substituting the first '%' with the * match, but only if the lhs had a '%' as well. */ - rhs_expanded = Var_Subst(args->rhs, args->ctx, VARE_WANTRES); + (void)Var_Subst(args->rhs, args->ctx, VARE_WANTRES, &rhs_expanded); + /* TODO: handle errors */ rhs = rhs_expanded; percent = strchr(rhs, '%'); @@ -1413,7 +1432,8 @@ ModifyWord_Loop(const char *word, SepBuf args = data; Var_Set_with_flags(args->tvar, word, args->ctx, VAR_NO_EXPORT); - s = Var_Subst(args->str, args->ctx, args->eflags); + (void)Var_Subst(args->str, args->ctx, args->eflags, &s); + /* TODO: handle errors */ VAR_DEBUG("ModifyWord_Loop: in \"%s\", replace \"%s\" with \"%s\" " "to \"%s\"\n", @@ -2268,7 +2288,8 @@ ApplyModifier_Match(const char **pp, App if (needSubst) { /* pattern contains embedded '$', so use Var_Subst to expand it. */ char *old_pattern = pattern; - pattern = Var_Subst(pattern, st->ctxt, st->eflags); + (void)Var_Subst(pattern, st->ctxt, st->eflags, &pattern); + /* TODO: handle errors */ free(old_pattern); } @@ -3622,7 +3643,8 @@ Var_Parse(const char **pp, GNode *ctxt, VarEvalFlags nested_eflags = eflags; if (DEBUG(LINT)) nested_eflags &= ~(unsigned)VARE_UNDEFERR; - nstr = Var_Subst(nstr, ctxt, nested_eflags); + (void)Var_Subst(nstr, ctxt, nested_eflags, &nstr); + /* TODO: handle errors */ *freePtr = nstr; } @@ -3705,8 +3727,8 @@ Var_Parse(const char **pp, GNode *ctxt, * Results: * The resulting string. */ -char * -Var_Subst(const char *str, GNode *ctxt, VarEvalFlags eflags) +VarParseResult +Var_Subst(const char *str, GNode *ctxt, VarEvalFlags eflags, char **out_res) { Buffer buf; /* Buffer for forming things */ @@ -3783,7 +3805,8 @@ Var_Subst(const char *str, GNode *ctxt, } } - return Buf_DestroyCompact(&buf); + *out_res = Buf_DestroyCompact(&buf); + return VPR_OK; } /* Initialize the module. */