diff options
| author | rillig <rillig@NetBSD.org> | 2020-12-20 14:48:35 +0000 |
|---|---|---|
| committer | rillig <rillig@NetBSD.org> | 2020-12-20 14:48:35 +0000 |
| commit | 2cff95deaffa7cf83bb512b74c8bb43b15e85a5d (patch) | |
| tree | 62eacad0b7a5dbc72b78e0d1d4b2914dbb3a3c7c /usr.bin/make/parse.c | |
| parent | 90205e77fb89bfe32a4cb22f19116764f5579e40 (diff) | |
make(1): clean up memory handling in Parse_DoVar
Diffstat (limited to 'usr.bin/make/parse.c')
| -rw-r--r-- | usr.bin/make/parse.c | 42 |
1 files changed, 17 insertions, 25 deletions
diff --git a/usr.bin/make/parse.c b/usr.bin/make/parse.c index 99af1352d8e..38bcc93c1ff 100644 --- a/usr.bin/make/parse.c +++ b/usr.bin/make/parse.c @@ -1,4 +1,4 @@ -/* $NetBSD: parse.c,v 1.505 2020/12/20 14:32:13 rillig Exp $ */ +/* $NetBSD: parse.c,v 1.506 2020/12/20 14:48:35 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.505 2020/12/20 14:32:13 rillig Exp $"); +MAKE_RCSID("$NetBSD: parse.c,v 1.506 2020/12/20 14:48:35 rillig Exp $"); /* types and constants */ @@ -1925,7 +1925,7 @@ VarCheckSyntax(VarAssignOp type, const char *uvalue, GNode *ctxt) static void VarAssign_EvalSubst(const char *name, const char *uvalue, GNode *ctxt, - const char **out_avalue, void **out_avalue_freeIt) + FStr *out_avalue) { const char *avalue; char *evalue; @@ -1955,13 +1955,12 @@ VarAssign_EvalSubst(const char *name, const char *uvalue, GNode *ctxt, avalue = evalue; Var_Set(name, avalue, ctxt); - *out_avalue = avalue; - *out_avalue_freeIt = evalue; + *out_avalue = (FStr){ avalue, evalue }; } static void VarAssign_EvalShell(const char *name, const char *uvalue, GNode *ctxt, - const char **out_avalue, void **out_avalue_freeIt) + FStr *out_avalue) { const char *cmd, *errfmt; char *cmdOut; @@ -1978,7 +1977,7 @@ VarAssign_EvalShell(const char *name, const char *uvalue, GNode *ctxt, cmdOut = Cmd_Exec(cmd, &errfmt); Var_Set(name, cmdOut, ctxt); - *out_avalue = *out_avalue_freeIt = cmdOut; + *out_avalue = FStr_InitOwn(cmdOut); if (errfmt != NULL) Parse_Error(PARSE_WARNING, errfmt, cmd); @@ -1996,31 +1995,25 @@ VarAssign_EvalShell(const char *name, const char *uvalue, GNode *ctxt, * skipped if the operator is '?=' and the variable already exists. */ static Boolean VarAssign_Eval(const char *name, VarAssignOp op, const char *uvalue, - GNode *ctxt, const char **out_avalue, void **out_avalue_freeIt) + GNode *ctxt, FStr *out_TRUE_avalue) { - const char *avalue = uvalue; - void *avalue_freeIt = NULL; + FStr avalue = FStr_InitRefer(uvalue); if (op == VAR_APPEND) Var_Append(name, uvalue, ctxt); else if (op == VAR_SUBST) - VarAssign_EvalSubst(name, uvalue, ctxt, &avalue, - &avalue_freeIt); + VarAssign_EvalSubst(name, uvalue, ctxt, &avalue); else if (op == VAR_SHELL) - VarAssign_EvalShell(name, uvalue, ctxt, &avalue, - &avalue_freeIt); + VarAssign_EvalShell(name, uvalue, ctxt, &avalue); else { - if (op == VAR_DEFAULT && Var_Exists(name, ctxt)) { - *out_avalue_freeIt = NULL; + if (op == VAR_DEFAULT && Var_Exists(name, ctxt)) return FALSE; - } /* Normal assignment -- just do it. */ Var_Set(name, uvalue, ctxt); } - *out_avalue = avalue; - *out_avalue_freeIt = avalue_freeIt; + *out_TRUE_avalue = avalue; return TRUE; } @@ -2047,15 +2040,14 @@ VarAssignSpecial(const char *name, const char *avalue) void Parse_DoVar(VarAssign *var, GNode *ctxt) { - const char *avalue; /* actual value (maybe expanded) */ - void *avalue_freeIt; + FStr avalue; /* actual value (maybe expanded) */ VarCheckSyntax(var->op, var->value, ctxt); - if (VarAssign_Eval(var->varname, var->op, var->value, ctxt, - &avalue, &avalue_freeIt)) - VarAssignSpecial(var->varname, avalue); + if (VarAssign_Eval(var->varname, var->op, var->value, ctxt, &avalue)) { + VarAssignSpecial(var->varname, avalue.str); + FStr_Done(&avalue); + } - free(avalue_freeIt); free(var->varname); } |
