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; }