Module Name:    src
Committed By:   rillig
Date:           Sun Dec  6 15:40:46 UTC 2020

Modified Files:
        src/usr.bin/make: var.c

Log Message:
make(1): use FStr in Var_UnExport


To generate a diff of this commit:
cvs rdiff -u -r1.711 -r1.712 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.711 src/usr.bin/make/var.c:1.712
--- src/usr.bin/make/var.c:1.711	Sun Dec  6 14:50:09 2020
+++ src/usr.bin/make/var.c	Sun Dec  6 15:40:46 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.711 2020/12/06 14:50:09 rillig Exp $	*/
+/*	$NetBSD: var.c,v 1.712 2020/12/06 15:40:46 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -130,7 +130,7 @@
 #include "metachar.h"
 
 /*	"@(#)var.c	8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.711 2020/12/06 14:50:09 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.712 2020/12/06 15:40:46 rillig Exp $");
 
 /* A string that may need to be freed after use. */
 typedef struct FStr {
@@ -311,6 +311,16 @@ ENUM_FLAGS_RTTI_6(VarFlags,
 
 static VarExportedMode var_exportedVars = VAR_EXPORTED_NONE;
 
+#define FSTR_INIT { NULL, NULL }
+
+static void
+FStr_Assign(FStr *fstr, const char *str, void *freeIt)
+{
+	free(fstr->freeIt);
+	fstr->str = str;
+	fstr->freeIt = freeIt;
+}
+
 static void
 FStr_Done(FStr *fstr)
 {
@@ -771,13 +781,9 @@ UnexportVar(const char *varname, Boolean
 void
 Var_UnExport(const char *str)
 {
-	const char *varnames;
-	char *varnames_freeIt;
+	FStr varnames = FSTR_INIT;
 	Boolean unexport_env;
 
-	varnames = NULL;
-	varnames_freeIt = NULL;
-
 	str += strlen("unexport");
 	unexport_env = strncmp(str, "-env", 4) == 0;
 	if (unexport_env) {
@@ -785,31 +791,32 @@ Var_UnExport(const char *str)
 	} else {
 		cpp_skip_whitespace(&str);
 		if (str[0] != '\0')
-			varnames = str;
+			FStr_Assign(&varnames, str, NULL);
 	}
 
-	if (varnames == NULL) {
+	if (varnames.str == NULL) {
+		char *expanded;
 		/* Using .MAKE.EXPORTED */
 		(void)Var_Subst("${" MAKE_EXPORTED ":O:u}", VAR_GLOBAL,
-		    VARE_WANTRES, &varnames_freeIt);
+		    VARE_WANTRES, &expanded);
 		/* TODO: handle errors */
-		varnames = varnames_freeIt;
+		FStr_Assign(&varnames, expanded, expanded);
 	}
 
 	{
 		size_t i;
 
-		Words words = Str_Words(varnames, FALSE);
+		Words words = Str_Words(varnames.str, FALSE);
 		for (i = 0; i < words.len; i++) {
 			const char *varname = words.words[i];
-			UnexportVar(varname, unexport_env, varnames == str);
+			UnexportVar(varname, unexport_env, varnames.str == str);
 		}
 		Words_Free(words);
-		if (varnames != str) {
+		if (varnames.str != str)
 			Var_Delete(MAKE_EXPORTED, VAR_GLOBAL);
-			free(varnames_freeIt);
-		}
 	}
+
+	FStr_Done(&varnames);
 }
 
 /* See Var_Set for documentation. */

Reply via email to