Module Name:    src
Committed By:   rillig
Date:           Sun Dec 20 14:32:14 UTC 2020

Modified Files:
        src/usr.bin/make: cond.c main.c meta.c nonints.h parse.c trace.c var.c

Log Message:
make(1): change return type of Var_Value to FStr


To generate a diff of this commit:
cvs rdiff -u -r1.229 -r1.230 src/usr.bin/make/cond.c
cvs rdiff -u -r1.498 -r1.499 src/usr.bin/make/main.c
cvs rdiff -u -r1.160 -r1.161 src/usr.bin/make/meta.c
cvs rdiff -u -r1.177 -r1.178 src/usr.bin/make/nonints.h
cvs rdiff -u -r1.504 -r1.505 src/usr.bin/make/parse.c
cvs rdiff -u -r1.24 -r1.25 src/usr.bin/make/trace.c
cvs rdiff -u -r1.744 -r1.745 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/cond.c
diff -u src/usr.bin/make/cond.c:1.229 src/usr.bin/make/cond.c:1.230
--- src/usr.bin/make/cond.c:1.229	Sun Dec 20 13:38:43 2020
+++ src/usr.bin/make/cond.c	Sun Dec 20 14:32:13 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: cond.c,v 1.229 2020/12/20 13:38:43 rillig Exp $	*/
+/*	$NetBSD: cond.c,v 1.230 2020/12/20 14:32:13 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -94,7 +94,7 @@
 #include "dir.h"
 
 /*	"@(#)cond.c	8.2 (Berkeley) 1/2/94"	*/
-MAKE_RCSID("$NetBSD: cond.c,v 1.229 2020/12/20 13:38:43 rillig Exp $");
+MAKE_RCSID("$NetBSD: cond.c,v 1.230 2020/12/20 14:32:13 rillig Exp $");
 
 /*
  * The parsing of conditional expressions is based on this grammar:
@@ -286,9 +286,9 @@ ParseFuncArg(const char **pp, Boolean do
 static Boolean
 FuncDefined(size_t argLen MAKE_ATTR_UNUSED, const char *arg)
 {
-	void *freeIt;
-	Boolean result = Var_Value(arg, VAR_CMDLINE, &freeIt) != NULL;
-	bmake_free(freeIt);
+	FStr value = Var_Value(arg, VAR_CMDLINE);
+	Boolean result = value.str != NULL;
+	FStr_Done(&value);
 	return result;
 }
 

Index: src/usr.bin/make/main.c
diff -u src/usr.bin/make/main.c:1.498 src/usr.bin/make/main.c:1.499
--- src/usr.bin/make/main.c:1.498	Sun Dec 13 20:14:48 2020
+++ src/usr.bin/make/main.c	Sun Dec 20 14:32:13 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: main.c,v 1.498 2020/12/13 20:14:48 rillig Exp $	*/
+/*	$NetBSD: main.c,v 1.499 2020/12/20 14:32:13 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -109,7 +109,7 @@
 #include "trace.h"
 
 /*	"@(#)main.c	8.3 (Berkeley) 3/19/94"	*/
-MAKE_RCSID("$NetBSD: main.c,v 1.498 2020/12/13 20:14:48 rillig Exp $");
+MAKE_RCSID("$NetBSD: main.c,v 1.499 2020/12/20 14:32:13 rillig Exp $");
 #if defined(MAKE_NATIVE) && !defined(lint)
 __COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993 "
 	    "The Regents of the University of California.  "
@@ -690,10 +690,9 @@ Main_ParseArgLine(const char *line)
 		return;
 
 	{
-		void *freeIt;
-		const char *argv0 = Var_Value(".MAKE", VAR_GLOBAL, &freeIt);
-		buf = str_concat3(argv0, " ", line);
-		free(freeIt);
+		FStr argv0 = Var_Value(".MAKE", VAR_GLOBAL);
+		buf = str_concat3(argv0.str, " ", line);
+		FStr_Done(&argv0);
 	}
 
 	words = Str_Words(buf, TRUE);
@@ -751,29 +750,27 @@ Main_SetObjdir(Boolean writable, const c
 static Boolean
 SetVarObjdir(Boolean writable, const char *var, const char *suffix)
 {
-	void *path_freeIt;
-	const char *path = Var_Value(var, VAR_CMDLINE, &path_freeIt);
-	const char *xpath;
-	char *xpath_freeIt;
+	FStr path = Var_Value(var, VAR_CMDLINE);
+	FStr xpath;
 
-	if (path == NULL || path[0] == '\0') {
-		bmake_free(path_freeIt);
+	if (path.str == NULL || path.str[0] == '\0') {
+		FStr_Done(&path);
 		return FALSE;
 	}
 
 	/* expand variable substitutions */
-	xpath = path;
-	xpath_freeIt = NULL;
-	if (strchr(path, '$') != 0) {
-		(void)Var_Subst(path, VAR_GLOBAL, VARE_WANTRES, &xpath_freeIt);
+	xpath = FStr_InitRefer(path.str);
+	if (strchr(path.str, '$') != 0) {
+		char *expanded;
+		(void)Var_Subst(path.str, VAR_GLOBAL, VARE_WANTRES, &expanded);
 		/* TODO: handle errors */
-		xpath = xpath_freeIt;
+		xpath = FStr_InitOwn(expanded);
 	}
 
-	(void)Main_SetObjdir(writable, "%s%s", xpath, suffix);
+	(void)Main_SetObjdir(writable, "%s%s", xpath.str, suffix);
 
-	bmake_free(xpath_freeIt);
-	bmake_free(path_freeIt);
+	FStr_Done(&xpath);
+	FStr_Done(&path);
 	return TRUE;
 }
 
@@ -859,10 +856,9 @@ PrintVar(const char *varname, Boolean ex
 		bmake_free(evalue);
 
 	} else {
-		void *freeIt;
-		const char *value = Var_Value(varname, VAR_GLOBAL, &freeIt);
-		printf("%s\n", value ? value : "");
-		bmake_free(freeIt);
+		FStr value = Var_Value(varname, VAR_GLOBAL);
+		printf("%s\n", value.str != NULL ? value.str : "");
+		FStr_Done(&value);
 	}
 }
 
@@ -1047,21 +1043,20 @@ static void
 HandlePWD(const struct stat *curdir_st)
 {
 	char *pwd;
-	void *prefix_freeIt, *makeobjdir_freeIt;
-	const char *makeobjdir;
+	FStr prefix, makeobjdir;
 	struct stat pwd_st;
 
 	if (ignorePWD || (pwd = getenv("PWD")) == NULL)
 		return;
 
-	if (Var_Value("MAKEOBJDIRPREFIX", VAR_CMDLINE, &prefix_freeIt) !=
-	    NULL) {
-		bmake_free(prefix_freeIt);
+	prefix = Var_Value("MAKEOBJDIRPREFIX", VAR_CMDLINE);
+	if (prefix.str != NULL) {
+		FStr_Done(&prefix);
 		return;
 	}
 
-	makeobjdir = Var_Value("MAKEOBJDIR", VAR_CMDLINE, &makeobjdir_freeIt);
-	if (makeobjdir != NULL && strchr(makeobjdir, '$') != NULL)
+	makeobjdir = Var_Value("MAKEOBJDIR", VAR_CMDLINE);
+	if (makeobjdir.str != NULL && strchr(makeobjdir.str, '$') != NULL)
 		goto ignore_pwd;
 
 	if (stat(pwd, &pwd_st) == 0 &&
@@ -1070,7 +1065,7 @@ HandlePWD(const struct stat *curdir_st)
 		(void)strncpy(curdir, pwd, MAXPATHLEN);
 
 ignore_pwd:
-	bmake_free(makeobjdir_freeIt);
+	FStr_Done(&makeobjdir);
 }
 #endif
 
@@ -1554,10 +1549,9 @@ main_PrepareMaking(void)
 	MakeMode(NULL);
 
 	{
-		void *freeIt;
-		Var_Append("MFLAGS", Var_Value(MAKEFLAGS, VAR_GLOBAL, &freeIt),
-		    VAR_GLOBAL);
-		bmake_free(freeIt);
+		FStr makeflags = Var_Value(MAKEFLAGS, VAR_GLOBAL);
+		Var_Append("MFLAGS", makeflags.str, VAR_GLOBAL);
+		FStr_Done(&makeflags);
 	}
 
 	InitMaxJobs();

Index: src/usr.bin/make/meta.c
diff -u src/usr.bin/make/meta.c:1.160 src/usr.bin/make/meta.c:1.161
--- src/usr.bin/make/meta.c:1.160	Sun Dec 13 21:27:45 2020
+++ src/usr.bin/make/meta.c	Sun Dec 20 14:32:13 2020
@@ -1,4 +1,4 @@
-/*      $NetBSD: meta.c,v 1.160 2020/12/13 21:27:45 rillig Exp $ */
+/*      $NetBSD: meta.c,v 1.161 2020/12/20 14:32:13 rillig Exp $ */
 
 /*
  * Implement 'meta' mode.
@@ -323,8 +323,7 @@ is_submake(const char *cmd, GNode *gn)
     Boolean rc = FALSE;
 
     if (p_make == NULL) {
-	void *dontFreeIt;
-	p_make = Var_Value(".MAKE", gn, &dontFreeIt);
+	p_make = Var_Value(".MAKE", gn).str;
 	p_len = strlen(p_make);
     }
     cp = strchr(cmd, '$');
@@ -473,21 +472,20 @@ meta_create(BuildMon *pbm, GNode *gn)
     char buf[MAXPATHLEN];
     char objdir_realpath[MAXPATHLEN];
     char **ptr;
-    const char *dname;
+    FStr dname;
     const char *tname;
     char *fname;
     const char *cp;
-    void *dname_freeIt;
 
     fp = NULL;
 
-    dname = Var_Value(".OBJDIR", gn, &dname_freeIt);
+    dname = Var_Value(".OBJDIR", gn);
     tname = GNode_VarTarget(gn);
 
     /* if this succeeds objdir_realpath is realpath of dname */
-    if (!meta_needed(gn, dname, objdir_realpath, TRUE))
+    if (!meta_needed(gn, dname.str, objdir_realpath, TRUE))
 	goto out;
-    dname = objdir_realpath;
+    dname.str = objdir_realpath;
 
     if (metaVerbose) {
 	char *mp;
@@ -509,7 +507,7 @@ meta_create(BuildMon *pbm, GNode *gn)
 	goto out;
 
     fname = meta_name(pbm->meta_fname, sizeof pbm->meta_fname,
-		      dname, tname, objdir_realpath);
+		      dname.str, tname, objdir_realpath);
 
 #ifdef DEBUG_META_MODE
     DEBUG1(META, "meta_create: %s\n", fname);
@@ -544,7 +542,7 @@ meta_create(BuildMon *pbm, GNode *gn)
 	    gn->type |= OP_SILENT;
     }
  out:
-    bmake_free(dname_freeIt);
+    FStr_Done(&dname);
 
     return fp;
 }
@@ -588,7 +586,7 @@ meta_mode_init(const char *make_mode)
 {
     static Boolean once = FALSE;
     char *cp;
-    void *freeIt;
+    FStr value;
 
     useMeta = TRUE;
     useFilemon = TRUE;
@@ -644,15 +642,15 @@ meta_mode_init(const char *make_mode)
     /*
      * We ignore any paths that match ${.MAKE.META.IGNORE_PATTERNS}
      */
-    freeIt = NULL;
-    if (Var_Value(MAKE_META_IGNORE_PATTERNS, VAR_GLOBAL, &freeIt)) {
+    value = Var_Value(MAKE_META_IGNORE_PATTERNS, VAR_GLOBAL);
+    if (value.str != NULL) {
 	metaIgnorePatterns = TRUE;
-	bmake_free(freeIt);
+	FStr_Done(&value);
     }
-    freeIt = NULL;
-    if (Var_Value(MAKE_META_IGNORE_FILTER, VAR_GLOBAL, &freeIt)) {
+    value = Var_Value(MAKE_META_IGNORE_FILTER, VAR_GLOBAL);
+    if (value.str != NULL) {
 	metaIgnoreFilter = TRUE;
-	bmake_free(freeIt);
+	FStr_Done(&value);
     }
 }
 
@@ -1075,7 +1073,7 @@ meta_oodate(GNode *gn, Boolean oodate)
     char fname1[MAXPATHLEN];
     char fname2[MAXPATHLEN];
     char fname3[MAXPATHLEN];
-    const char *dname;
+    FStr dname;
     const char *tname;
     char *p;
     char *cp;
@@ -1087,18 +1085,17 @@ meta_oodate(GNode *gn, Boolean oodate)
     Boolean needOODATE = FALSE;
     StringList missingFiles;
     Boolean have_filemon = FALSE;
-    void *objdir_freeIt;
 
     if (oodate)
 	return oodate;		/* we're done */
 
-    dname = Var_Value(".OBJDIR", gn, &objdir_freeIt);
+    dname = Var_Value(".OBJDIR", gn);
     tname = GNode_VarTarget(gn);
 
     /* if this succeeds fname3 is realpath of dname */
-    if (!meta_needed(gn, dname, fname3, FALSE))
+    if (!meta_needed(gn, dname.str, fname3, FALSE))
 	goto oodate_out;
-    dname = fname3;
+    dname.str = fname3;
 
     Lst_Init(&missingFiles);
 
@@ -1110,7 +1107,7 @@ meta_oodate(GNode *gn, Boolean oodate)
      */
     Make_DoAllVar(gn);
 
-    meta_name(fname, sizeof fname, dname, tname, dname);
+    meta_name(fname, sizeof fname, dname.str, tname, dname.str);
 
 #ifdef DEBUG_META_MODE
     DEBUG1(META, "meta_oodate: %s\n", fname);
@@ -1216,8 +1213,7 @@ meta_oodate(GNode *gn, Boolean oodate)
 		    CHECK_VALID_META(p);
 		    pid = atoi(p);
 		    if (pid > 0 && pid != lastpid) {
-			const char *ldir;
-			void *tp;
+			FStr ldir;
 
 			if (lastpid > 0) {
 			    /* We need to remember these. */
@@ -1227,15 +1223,15 @@ meta_oodate(GNode *gn, Boolean oodate)
 			snprintf(lcwd_vname, sizeof lcwd_vname, LCWD_VNAME_FMT, pid);
 			snprintf(ldir_vname, sizeof ldir_vname, LDIR_VNAME_FMT, pid);
 			lastpid = pid;
-			ldir = Var_Value(ldir_vname, VAR_GLOBAL, &tp);
-			if (ldir != NULL) {
-			    strlcpy(latestdir, ldir, sizeof latestdir);
-			    bmake_free(tp);
+			ldir = Var_Value(ldir_vname, VAR_GLOBAL);
+			if (ldir.str != NULL) {
+			    strlcpy(latestdir, ldir.str, sizeof latestdir);
+			    FStr_Done(&ldir);
 			}
-			ldir = Var_Value(lcwd_vname, VAR_GLOBAL, &tp);
-			if (ldir != NULL) {
-			    strlcpy(lcwd, ldir, sizeof lcwd);
-			    bmake_free(tp);
+			ldir = Var_Value(lcwd_vname, VAR_GLOBAL);
+			if (ldir.str != NULL) {
+			    strlcpy(lcwd, ldir.str, sizeof lcwd);
+			    FStr_Done(&ldir);
 			}
 		    }
 		    /* Skip past the pid. */
@@ -1606,7 +1602,7 @@ meta_oodate(GNode *gn, Boolean oodate)
     }
 
  oodate_out:
-    bmake_free(objdir_freeIt);
+    FStr_Done(&dname);
     return oodate;
 }
 

Index: src/usr.bin/make/nonints.h
diff -u src/usr.bin/make/nonints.h:1.177 src/usr.bin/make/nonints.h:1.178
--- src/usr.bin/make/nonints.h:1.177	Sun Dec 20 13:38:43 2020
+++ src/usr.bin/make/nonints.h	Sun Dec 20 14:32:13 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: nonints.h,v 1.177 2020/12/20 13:38:43 rillig Exp $	*/
+/*	$NetBSD: nonints.h,v 1.178 2020/12/20 14:32:13 rillig Exp $	*/
 
 /*-
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -402,7 +402,7 @@ void Var_Set(const char *, const char *,
 void Var_SetWithFlags(const char *, const char *, GNode *, VarSetFlags);
 void Var_Append(const char *, const char *, GNode *);
 Boolean Var_Exists(const char *, GNode *);
-const char *Var_Value(const char *, GNode *, void **);
+FStr Var_Value(const char *, GNode *);
 const char *Var_ValueDirect(const char *, GNode *);
 VarParseResult Var_Parse(const char **, GNode *, VarEvalFlags, FStr *);
 VarParseResult Var_Subst(const char *, GNode *, VarEvalFlags, char **);

Index: src/usr.bin/make/parse.c
diff -u src/usr.bin/make/parse.c:1.504 src/usr.bin/make/parse.c:1.505
--- src/usr.bin/make/parse.c:1.504	Sun Dec 20 13:38:43 2020
+++ src/usr.bin/make/parse.c	Sun Dec 20 14:32:13 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: parse.c,v 1.504 2020/12/20 13:38:43 rillig Exp $	*/
+/*	$NetBSD: parse.c,v 1.505 2020/12/20 14:32:13 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -117,7 +117,7 @@
 #include "pathnames.h"
 
 /*	"@(#)parse.c	8.3 (Berkeley) 3/19/94"	*/
-MAKE_RCSID("$NetBSD: parse.c,v 1.504 2020/12/20 13:38:43 rillig Exp $");
+MAKE_RCSID("$NetBSD: parse.c,v 1.505 2020/12/20 14:32:13 rillig Exp $");
 
 /* types and constants */
 
@@ -614,8 +614,7 @@ static void
 PrintLocation(FILE *f, const char *fname, size_t lineno)
 {
 	char dirbuf[MAXPATHLEN + 1];
-	const char *dir, *base;
-	void *dir_freeIt, *base_freeIt;
+	FStr dir, base;
 
 	if (*fname == '/' || strcmp(fname, "(stdin)") == 0) {
 		(void)fprintf(f, "\"%s\" line %u: ", fname, (unsigned)lineno);
@@ -625,19 +624,21 @@ PrintLocation(FILE *f, const char *fname
 	/* Find out which makefile is the culprit.
 	 * We try ${.PARSEDIR} and apply realpath(3) if not absolute. */
 
-	dir = Var_Value(".PARSEDIR", VAR_GLOBAL, &dir_freeIt);
-	if (dir == NULL)
-		dir = ".";
-	if (*dir != '/')
-		dir = realpath(dir, dirbuf);
-
-	base = Var_Value(".PARSEFILE", VAR_GLOBAL, &base_freeIt);
-	if (base == NULL)
-		base = str_basename(fname);
-
-	(void)fprintf(f, "\"%s/%s\" line %u: ", dir, base, (unsigned)lineno);
-	bmake_free(base_freeIt);
-	bmake_free(dir_freeIt);
+	dir = Var_Value(".PARSEDIR", VAR_GLOBAL);
+	if (dir.str == NULL)
+		dir.str = ".";
+	if (dir.str[0] != '/')
+		dir.str = realpath(dir.str, dirbuf);
+
+	base = Var_Value(".PARSEFILE", VAR_GLOBAL);
+	if (base.str == NULL)
+		base.str = str_basename(fname);
+
+	(void)fprintf(f, "\"%s/%s\" line %u: ",
+	    dir.str, base.str, (unsigned)lineno);
+
+	FStr_Done(&base);
+	FStr_Done(&dir);
 }
 
 static void
@@ -2404,10 +2405,9 @@ StrContainsWord(const char *str, const c
 static Boolean
 VarContainsWord(const char *varname, const char *word)
 {
-	void *val_freeIt;
-	const char *val = Var_Value(varname, VAR_GLOBAL, &val_freeIt);
-	Boolean found = val != NULL && StrContainsWord(val, word);
-	bmake_free(val_freeIt);
+	FStr val = Var_Value(varname, VAR_GLOBAL);
+	Boolean found = val.str != NULL && StrContainsWord(val.str, word);
+	FStr_Done(&val);
 	return found;
 }
 

Index: src/usr.bin/make/trace.c
diff -u src/usr.bin/make/trace.c:1.24 src/usr.bin/make/trace.c:1.25
--- src/usr.bin/make/trace.c:1.24	Sat Dec 12 10:21:50 2020
+++ src/usr.bin/make/trace.c	Sun Dec 20 14:32:13 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: trace.c,v 1.24 2020/12/12 10:21:50 rillig Exp $	*/
+/*	$NetBSD: trace.c,v 1.25 2020/12/20 14:32:13 rillig Exp $	*/
 
 /*-
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -48,7 +48,7 @@
 #include "job.h"
 #include "trace.h"
 
-MAKE_RCSID("$NetBSD: trace.c,v 1.24 2020/12/12 10:21:50 rillig Exp $");
+MAKE_RCSID("$NetBSD: trace.c,v 1.25 2020/12/20 14:32:13 rillig Exp $");
 
 static FILE *trfile;
 static pid_t trpid;
@@ -67,11 +67,12 @@ void
 Trace_Init(const char *pathname)
 {
 	if (pathname != NULL) {
-		void *dontFreeIt;
+		FStr curDir;
 		trpid = getpid();
 		/* XXX: This variable may get overwritten later, which
 		 * would make trwd point to undefined behavior. */
-		trwd = Var_Value(".CURDIR", VAR_GLOBAL, &dontFreeIt);
+		curDir = Var_Value(".CURDIR", VAR_GLOBAL);
+		trwd = curDir.str;
 
 		trfile = fopen(pathname, "a");
 	}

Index: src/usr.bin/make/var.c
diff -u src/usr.bin/make/var.c:1.744 src/usr.bin/make/var.c:1.745
--- src/usr.bin/make/var.c:1.744	Sun Dec 20 13:50:10 2020
+++ src/usr.bin/make/var.c	Sun Dec 20 14:32:13 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.744 2020/12/20 13:50:10 rillig Exp $	*/
+/*	$NetBSD: var.c,v 1.745 2020/12/20 14:32:13 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -131,7 +131,7 @@
 #include "metachar.h"
 
 /*	"@(#)var.c	8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.744 2020/12/20 13:50:10 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.745 2020/12/20 14:32:13 rillig Exp $");
 
 typedef enum VarFlags {
 	VAR_NONE	= 0,
@@ -1105,20 +1105,19 @@ Var_Exists(const char *name, GNode *ctxt
  *	If the returned value is not NULL, the caller must free
  *	out_freeIt when the returned value is no longer needed.
  */
-const char *
-Var_Value(const char *name, GNode *ctxt, void **out_freeIt)
+FStr
+Var_Value(const char *name, GNode *ctxt)
 {
 	Var *v = VarFind(name, ctxt, TRUE);
 	char *value;
 
-	*out_freeIt = NULL;
 	if (v == NULL)
-		return NULL;
+		return FStr_InitRefer(NULL);
 
 	value = Buf_GetAll(&v->val, NULL);
-	if (VarFreeEnv(v, FALSE))
-		*out_freeIt = value;
-	return value;
+	return VarFreeEnv(v, FALSE)
+	    ? FStr_InitOwn(value)
+	    : FStr_InitRefer(value);
 }
 
 /* Return the unexpanded variable value from this node, without trying to look

Reply via email to