Module Name: src
Committed By: rillig
Date: Sun Dec 20 13:38:43 UTC 2020
Modified Files:
src/usr.bin/make: arch.c cond.c nonints.h parse.c suff.c var.c
Log Message:
make(1): return FStr from Var_Parse
This reduces the number of variable declarations at the call sites.
To generate a diff of this commit:
cvs rdiff -u -r1.189 -r1.190 src/usr.bin/make/arch.c
cvs rdiff -u -r1.228 -r1.229 src/usr.bin/make/cond.c
cvs rdiff -u -r1.176 -r1.177 src/usr.bin/make/nonints.h
cvs rdiff -u -r1.503 -r1.504 src/usr.bin/make/parse.c
cvs rdiff -u -r1.331 -r1.332 src/usr.bin/make/suff.c
cvs rdiff -u -r1.742 -r1.743 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.189 src/usr.bin/make/arch.c:1.190
--- src/usr.bin/make/arch.c:1.189 Fri Dec 18 15:47:34 2020
+++ src/usr.bin/make/arch.c Sun Dec 20 13:38:43 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: arch.c,v 1.189 2020/12/18 15:47:34 rillig Exp $ */
+/* $NetBSD: arch.c,v 1.190 2020/12/20 13:38:43 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -125,7 +125,7 @@
#include "config.h"
/* "@(#)arch.c 8.2 (Berkeley) 1/2/94" */
-MAKE_RCSID("$NetBSD: arch.c,v 1.189 2020/12/18 15:47:34 rillig Exp $");
+MAKE_RCSID("$NetBSD: arch.c,v 1.190 2020/12/20 13:38:43 rillig Exp $");
typedef struct List ArchList;
typedef struct ListNode ArchListNode;
@@ -202,17 +202,15 @@ Arch_ParseArchive(char **pp, GNodeList *
/* Expand nested variable expressions. */
/* XXX: This code can probably be shortened. */
const char *nested_p = cp;
- void *result_freeIt;
- const char *result;
+ FStr result;
Boolean isError;
/* XXX: is expanded twice: once here and once below */
(void)Var_Parse(&nested_p, ctxt,
- VARE_WANTRES | VARE_UNDEFERR,
- &result, &result_freeIt);
+ VARE_WANTRES | VARE_UNDEFERR, &result);
/* TODO: handle errors */
- isError = result == var_Error;
- free(result_freeIt);
+ isError = result.str == var_Error;
+ FStr_Done(&result);
if (isError)
return FALSE;
@@ -246,17 +244,16 @@ Arch_ParseArchive(char **pp, GNodeList *
if (*cp == '$') {
/* Expand nested variable expressions. */
/* XXX: This code can probably be shortened. */
- void *freeIt;
- const char *result;
+ FStr result;
Boolean isError;
const char *nested_p = cp;
(void)Var_Parse(&nested_p, ctxt,
VARE_WANTRES | VARE_UNDEFERR,
- &result, &freeIt);
+ &result);
/* TODO: handle errors */
- isError = result == var_Error;
- free(freeIt);
+ isError = result.str == var_Error;
+ FStr_Done(&result);
if (isError)
return FALSE;
Index: src/usr.bin/make/cond.c
diff -u src/usr.bin/make/cond.c:1.228 src/usr.bin/make/cond.c:1.229
--- src/usr.bin/make/cond.c:1.228 Sun Dec 20 13:03:48 2020
+++ src/usr.bin/make/cond.c Sun Dec 20 13:38:43 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: cond.c,v 1.228 2020/12/20 13:03:48 rillig Exp $ */
+/* $NetBSD: cond.c,v 1.229 2020/12/20 13:38:43 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.228 2020/12/20 13:03:48 rillig Exp $");
+MAKE_RCSID("$NetBSD: cond.c,v 1.229 2020/12/20 13:38:43 rillig Exp $");
/*
* The parsing of conditional expressions is based on this grammar:
@@ -247,16 +247,14 @@ ParseFuncArg(const char **pp, Boolean do
* so we don't need to do it. Nor do we return an
* error, though perhaps we should.
*/
- void *nestedVal_freeIt;
VarEvalFlags eflags = doEval
? VARE_WANTRES | VARE_UNDEFERR
: VARE_NONE;
- const char *nestedVal;
- (void)Var_Parse(&p, VAR_CMDLINE, eflags,
- &nestedVal, &nestedVal_freeIt);
+ FStr nestedVal;
+ (void)Var_Parse(&p, VAR_CMDLINE, eflags, &nestedVal);
/* TODO: handle errors */
- Buf_AddStr(&argBuf, nestedVal);
- free(nestedVal_freeIt);
+ Buf_AddStr(&argBuf, nestedVal.str);
+ FStr_Done(&nestedVal);
continue;
}
if (ch == '(')
@@ -451,7 +449,7 @@ CondParser_String(CondParser *par, Boole
nested_p = par->p;
atStart = nested_p == start;
parseResult = Var_Parse(&nested_p, VAR_CMDLINE, eflags,
- &str.str, &str.freeIt);
+ &str);
/* TODO: handle errors */
if (str.str == var_Error) {
if (parseResult & VPR_ANY_MSG)
@@ -693,8 +691,7 @@ static size_t
ParseEmptyArg(const char **pp, Boolean doEval,
const char *func MAKE_ATTR_UNUSED, char **out_arg)
{
- void *val_freeIt;
- const char *val;
+ FStr val;
size_t magic_res;
/* We do all the work here and return the result as the length */
@@ -702,12 +699,12 @@ ParseEmptyArg(const char **pp, Boolean d
(*pp)--; /* Make (*pp)[1] point to the '('. */
(void)Var_Parse(pp, VAR_CMDLINE, doEval ? VARE_WANTRES : VARE_NONE,
- &val, &val_freeIt);
+ &val);
/* TODO: handle errors */
/* If successful, *pp points beyond the closing ')' now. */
- if (val == var_Error) {
- free(val_freeIt);
+ if (val.str == var_Error) {
+ FStr_Done(&val);
return (size_t)-1;
}
@@ -715,14 +712,14 @@ ParseEmptyArg(const char **pp, Boolean d
* A variable is empty when it just contains spaces...
* 4/15/92, christos
*/
- cpp_skip_whitespace(&val);
+ cpp_skip_whitespace(&val.str);
/*
* For consistency with the other functions we can't generate the
* true/false here.
*/
- magic_res = *val != '\0' ? 2 : 1;
- free(val_freeIt);
+ magic_res = val.str[0] != '\0' ? 2 : 1;
+ FStr_Done(&val);
return magic_res;
}
Index: src/usr.bin/make/nonints.h
diff -u src/usr.bin/make/nonints.h:1.176 src/usr.bin/make/nonints.h:1.177
--- src/usr.bin/make/nonints.h:1.176 Sun Dec 20 12:53:34 2020
+++ src/usr.bin/make/nonints.h Sun Dec 20 13:38:43 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: nonints.h,v 1.176 2020/12/20 12:53:34 rillig Exp $ */
+/* $NetBSD: nonints.h,v 1.177 2020/12/20 13:38:43 rillig Exp $ */
/*-
* Copyright (c) 1988, 1989, 1990, 1993
@@ -404,8 +404,7 @@ void Var_Append(const char *, const char
Boolean Var_Exists(const char *, GNode *);
const char *Var_Value(const char *, GNode *, void **);
const char *Var_ValueDirect(const char *, GNode *);
-VarParseResult Var_Parse(const char **, GNode *, VarEvalFlags,
- const char **, void **);
+VarParseResult Var_Parse(const char **, GNode *, VarEvalFlags, FStr *);
VarParseResult Var_Subst(const char *, GNode *, VarEvalFlags, char **);
void Var_Stats(void);
void Var_Dump(GNode *);
Index: src/usr.bin/make/parse.c
diff -u src/usr.bin/make/parse.c:1.503 src/usr.bin/make/parse.c:1.504
--- src/usr.bin/make/parse.c:1.503 Sat Dec 19 22:33:11 2020
+++ src/usr.bin/make/parse.c Sun Dec 20 13:38:43 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: parse.c,v 1.503 2020/12/19 22:33:11 rillig Exp $ */
+/* $NetBSD: parse.c,v 1.504 2020/12/20 13:38:43 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.503 2020/12/19 22:33:11 rillig Exp $");
+MAKE_RCSID("$NetBSD: parse.c,v 1.504 2020/12/20 13:38:43 rillig Exp $");
/* types and constants */
@@ -1080,14 +1080,13 @@ ParseDependencyTargetWord(const char **p
* we wouldn't be here.
*/
const char *nested_p = cp;
- const char *nested_val;
- void *freeIt;
+ FStr nested_val;
/* XXX: Why VARE_WANTRES? */
(void)Var_Parse(&nested_p, VAR_CMDLINE,
- VARE_WANTRES | VARE_UNDEFERR, &nested_val, &freeIt);
+ VARE_WANTRES | VARE_UNDEFERR, &nested_val);
/* TODO: handle errors */
- free(freeIt);
+ FStr_Done(&nested_val);
cp += nested_p - cp;
} else
cp++;
Index: src/usr.bin/make/suff.c
diff -u src/usr.bin/make/suff.c:1.331 src/usr.bin/make/suff.c:1.332
--- src/usr.bin/make/suff.c:1.331 Fri Dec 18 15:47:34 2020
+++ src/usr.bin/make/suff.c Sun Dec 20 13:38:43 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: suff.c,v 1.331 2020/12/18 15:47:34 rillig Exp $ */
+/* $NetBSD: suff.c,v 1.332 2020/12/20 13:38:43 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -114,7 +114,7 @@
#include "dir.h"
/* "@(#)suff.c 8.4 (Berkeley) 3/21/94" */
-MAKE_RCSID("$NetBSD: suff.c,v 1.331 2020/12/18 15:47:34 rillig Exp $");
+MAKE_RCSID("$NetBSD: suff.c,v 1.332 2020/12/20 13:38:43 rillig Exp $");
typedef List SuffixList;
typedef ListNode SuffixListNode;
@@ -1300,13 +1300,11 @@ ExpandChildrenRegular(char *cp, GNode *p
} else if (*cp == '$') {
/* Skip over the variable expression. */
const char *nested_p = cp;
- const char *junk;
- void *freeIt;
+ FStr junk;
- (void)Var_Parse(&nested_p, pgn,
- VARE_NONE, &junk, &freeIt);
+ (void)Var_Parse(&nested_p, pgn, VARE_NONE, &junk);
/* TODO: handle errors */
- if (junk == var_Error) {
+ if (junk.str == var_Error) {
Parse_Error(PARSE_FATAL,
"Malformed variable expression at \"%s\"",
cp);
@@ -1315,7 +1313,7 @@ ExpandChildrenRegular(char *cp, GNode *p
cp += nested_p - cp;
}
- free(freeIt);
+ FStr_Done(&junk);
} else if (cp[0] == '\\' && cp[1] != '\0') {
/* Escaped something -- skip over it. */
/*
Index: src/usr.bin/make/var.c
diff -u src/usr.bin/make/var.c:1.742 src/usr.bin/make/var.c:1.743
--- src/usr.bin/make/var.c:1.742 Sun Dec 20 12:53:34 2020
+++ src/usr.bin/make/var.c Sun Dec 20 13:38:43 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: var.c,v 1.742 2020/12/20 12:53:34 rillig Exp $ */
+/* $NetBSD: var.c,v 1.743 2020/12/20 13:38:43 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.742 2020/12/20 12:53:34 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.743 2020/12/20 13:38:43 rillig Exp $");
typedef enum VarFlags {
VAR_NONE = 0,
@@ -2044,16 +2044,15 @@ ParseModifierPart(
if (eflags & VARE_WANTRES) { /* Nested variable, evaluated */
const char *nested_p = p;
- const char *nested_val;
- void *nested_val_freeIt;
+ FStr nested_val;
VarEvalFlags nested_eflags =
eflags & ~(unsigned)VARE_KEEP_DOLLAR;
(void)Var_Parse(&nested_p, st->ctxt, nested_eflags,
- &nested_val, &nested_val_freeIt);
+ &nested_val);
/* TODO: handle errors */
- Buf_AddStr(&buf, nested_val);
- free(nested_val_freeIt);
+ Buf_AddStr(&buf, nested_val.str);
+ FStr_Done(&nested_val);
p += nested_p - p;
continue;
}
@@ -2266,14 +2265,12 @@ ApplyModifier_Defined(const char **pp, A
/* Nested variable expression */
if (*p == '$') {
- const char *nested_val;
- void *nested_val_freeIt;
+ FStr nested_val;
- (void)Var_Parse(&p, st->ctxt, eflags,
- &nested_val, &nested_val_freeIt);
+ (void)Var_Parse(&p, st->ctxt, eflags, &nested_val);
/* TODO: handle errors */
- Buf_AddStr(&buf, nested_val);
- free(nested_val_freeIt);
+ Buf_AddStr(&buf, nested_val.str);
+ FStr_Done(&nested_val);
continue;
}
@@ -3430,10 +3427,9 @@ ApplyModifiersIndirect(ApplyModifiersSta
void **inout_freeIt)
{
const char *p = *pp;
- const char *mods;
- void *mods_freeIt;
+ FStr mods;
- (void)Var_Parse(&p, st->ctxt, st->eflags, &mods, &mods_freeIt);
+ (void)Var_Parse(&p, st->ctxt, st->eflags, &mods);
/* TODO: handle errors */
/*
@@ -3441,14 +3437,14 @@ ApplyModifiersIndirect(ApplyModifiersSta
* interested. This means the expression ${VAR:${M1}${M2}}
* is not accepted, but ${VAR:${M1}:${M2}} is.
*/
- if (mods[0] != '\0' && *p != '\0' && *p != ':' && *p != st->endc) {
+ if (mods.str[0] != '\0' && *p != '\0' && *p != ':' && *p != st->endc) {
if (opts.lint)
Parse_Error(PARSE_FATAL,
"Missing delimiter ':' "
"after indirect modifier \"%.*s\"",
(int)(p - *pp), *pp);
- free(mods_freeIt);
+ FStr_Done(&mods);
/* XXX: apply_mods doesn't sound like "not interested". */
/* XXX: Why is the indirect modifier parsed once more by
* apply_mods? Try *pp = p here. */
@@ -3456,20 +3452,21 @@ ApplyModifiersIndirect(ApplyModifiersSta
}
DEBUG3(VAR, "Indirect modifier \"%s\" from \"%.*s\"\n",
- mods, (int)(p - *pp), *pp);
+ mods.str, (int)(p - *pp), *pp);
- if (mods[0] != '\0') {
- st->val = ApplyModifiers(&mods, st->val, '\0', '\0',
+ if (mods.str[0] != '\0') {
+ const char *modsp = mods.str;
+ st->val = ApplyModifiers(&modsp, st->val, '\0', '\0',
st->var, &st->exprFlags, st->ctxt, st->eflags,
inout_freeIt);
if (st->val == var_Error || st->val == varUndefined ||
- *mods != '\0') {
- free(mods_freeIt);
+ *modsp != '\0') {
+ FStr_Done(&mods);
*pp = p;
return AMIR_OUT; /* error already reported */
}
}
- free(mods_freeIt);
+ FStr_Done(&mods);
if (*p == ':')
p++;
@@ -3694,13 +3691,11 @@ ParseVarname(const char **pp, char start
/* A variable inside a variable, expand. */
if (*p == '$') {
- const char *nested_val;
- void *nested_val_freeIt;
- (void)Var_Parse(&p, ctxt, eflags, &nested_val,
- &nested_val_freeIt);
+ FStr nested_val;
+ (void)Var_Parse(&p, ctxt, eflags, &nested_val);
/* TODO: handle errors */
- Buf_AddStr(&buf, nested_val);
- free(nested_val_freeIt);
+ Buf_AddStr(&buf, nested_val.str);
+ FStr_Done(&nested_val);
} else {
Buf_AddByte(&buf, *p);
p++;
@@ -4005,8 +4000,7 @@ FreeEnvVar(void **out_val_freeIt, Var *v
*/
/* coverity[+alloc : arg-*4] */
VarParseResult
-Var_Parse(const char **pp, GNode *ctxt, VarEvalFlags eflags,
- const char **out_val, void **out_val_freeIt)
+Var_Parse(const char **pp, GNode *ctxt, VarEvalFlags eflags, FStr *out_val)
{
const char *p = *pp;
const char *const start = p;
@@ -4024,7 +4018,7 @@ Var_Parse(const char **pp, GNode *ctxt,
Boolean dynamic;
const char *extramodifiers;
Var *v;
- char *value;
+ MFStr value;
char eflags_str[VarEvalFlags_ToStringSize];
VarExprFlags exprFlags = VEF_NONE;
@@ -4032,7 +4026,7 @@ Var_Parse(const char **pp, GNode *ctxt,
Enum_FlagsToString(eflags_str, sizeof eflags_str, eflags,
VarEvalFlags_ToStringSpecs));
- *out_val_freeIt = NULL;
+ *out_val = FStr_InitRefer(NULL);
extramodifiers = NULL; /* extra modifiers to apply first */
dynamic = FALSE;
@@ -4046,21 +4040,17 @@ Var_Parse(const char **pp, GNode *ctxt,
if (startc != '(' && startc != '{') {
VarParseResult res;
if (!ParseVarnameShort(startc, pp, ctxt, eflags, &res,
- out_val, &v))
+ &out_val->str, &v))
return res;
haveModifier = FALSE;
p++;
} else {
VarParseResult res;
- FStr fval;
if (!ParseVarnameLong(p, startc, ctxt, eflags,
- pp, &res, &fval,
+ pp, &res, out_val,
&endc, &p, &v, &haveModifier, &extramodifiers,
- &dynamic, &exprFlags)) {
- *out_val = fval.str;
- *out_val_freeIt = fval.freeIt;
+ &dynamic, &exprFlags))
return res;
- }
}
if (v->flags & VAR_IN_USE)
@@ -4075,21 +4065,22 @@ Var_Parse(const char **pp, GNode *ctxt,
* the then-current value of the variable. This might also invoke
* undefined behavior.
*/
- value = Buf_GetAll(&v->val, NULL);
+ value = MFStr_InitRefer(Buf_GetAll(&v->val, NULL));
/*
* Before applying any modifiers, expand any nested expressions from
* the variable value.
*/
- if (strchr(value, '$') != NULL && (eflags & VARE_WANTRES)) {
+ if (strchr(value.str, '$') != NULL && (eflags & VARE_WANTRES)) {
+ char *expanded;
VarEvalFlags nested_eflags = eflags;
if (opts.lint)
nested_eflags &= ~(unsigned)VARE_UNDEFERR;
v->flags |= VAR_IN_USE;
- (void)Var_Subst(value, ctxt, nested_eflags, &value);
+ (void)Var_Subst(value.str, ctxt, nested_eflags, &expanded);
v->flags &= ~(unsigned)VAR_IN_USE;
/* TODO: handle errors */
- *out_val_freeIt = value;
+ value = MFStr_InitOwn(expanded);
}
if (haveModifier || extramodifiers != NULL) {
@@ -4098,7 +4089,7 @@ Var_Parse(const char **pp, GNode *ctxt,
extraFree = NULL;
if (extramodifiers != NULL) {
const char *em = extramodifiers;
- value = ApplyModifiers(&em, value, '\0', '\0',
+ value.str = ApplyModifiers(&em, value.str, '\0', '\0',
v, &exprFlags, ctxt, eflags, &extraFree);
}
@@ -4106,11 +4097,11 @@ Var_Parse(const char **pp, GNode *ctxt,
/* Skip initial colon. */
p++;
- value = ApplyModifiers(&p, value, startc, endc,
- v, &exprFlags, ctxt, eflags, out_val_freeIt);
+ value.str = ApplyModifiers(&p, value.str, startc, endc,
+ v, &exprFlags, ctxt, eflags, &value.freeIt);
free(extraFree);
} else {
- *out_val_freeIt = extraFree;
+ value.freeIt = extraFree;
}
}
@@ -4120,38 +4111,29 @@ Var_Parse(const char **pp, GNode *ctxt,
*pp = p;
if (v->flags & VAR_FROM_ENV) {
- FreeEnvVar(out_val_freeIt, v, value);
+ FreeEnvVar(&value.freeIt, v, value.str);
} else if (exprFlags & VEF_UNDEF) {
if (!(exprFlags & VEF_DEF)) {
- /*
- * TODO: Use a local variable instead of
- * out_val_freeIt. Variables named out_* must only
- * be written to.
- */
- if (*out_val_freeIt != NULL) {
- free(*out_val_freeIt);
- *out_val_freeIt = NULL;
- }
+ MFStr_Done(&value);
if (dynamic) {
- value = bmake_strsedup(start, p);
- *out_val_freeIt = value;
+ value = MFStr_InitOwn(bmake_strsedup(start, p));
} else {
/*
* The expression is still undefined,
* therefore discard the actual value and
* return an error marker instead.
*/
- value = eflags & VARE_UNDEFERR
- ? var_Error : varUndefined;
+ value = MFStr_InitRefer(eflags & VARE_UNDEFERR
+ ? var_Error : varUndefined);
}
}
- if (value != Buf_GetAll(&v->val, NULL))
+ if (value.str != Buf_GetAll(&v->val, NULL))
Buf_Destroy(&v->val, TRUE);
FStr_Done(&v->name);
free(v);
}
- *out_val = value;
+ *out_val = (FStr){ value.str, value.freeIt };
return VPR_UNKNOWN;
}
@@ -4161,16 +4143,15 @@ VarSubstNested(const char **pp, Buffer *
{
const char *p = *pp;
const char *nested_p = p;
- const char *val;
- void *val_freeIt;
+ FStr val;
- (void)Var_Parse(&nested_p, ctxt, eflags, &val, &val_freeIt);
+ (void)Var_Parse(&nested_p, ctxt, eflags, &val);
/* TODO: handle errors */
- if (val == var_Error || val == varUndefined) {
+ if (val.str == var_Error || val.str == varUndefined) {
if (!preserveUndefined) {
p = nested_p;
- } else if ((eflags & VARE_UNDEFERR) || val == var_Error) {
+ } else if ((eflags & VARE_UNDEFERR) || val.str == var_Error) {
/*
* XXX: This condition is wrong. If val == var_Error,
@@ -4201,10 +4182,10 @@ VarSubstNested(const char **pp, Buffer *
}
} else {
p = nested_p;
- Buf_AddStr(buf, val);
+ Buf_AddStr(buf, val.str);
}
- free(val_freeIt);
+ FStr_Done(&val);
*pp = p;
}