From b3f8fb31aef21a46f68af515b7cb1e03cbdde422 Mon Sep 17 00:00:00 2001 From: Max Okumoto Date: Sat, 12 Mar 2005 12:03:17 +0000 Subject: [PATCH] patch-7.121 - Reduce number of parameters passed between functions by creating VarParser type to contain parser state info. --- usr.bin/make/var.c | 114 ++++++++++++++++++++++++++------------------- 1 file changed, 65 insertions(+), 49 deletions(-) diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c index 66755581c9..8e63931168 100644 --- a/usr.bin/make/var.c +++ b/usr.bin/make/var.c @@ -37,7 +37,7 @@ * * @(#)var.c 8.3 (Berkeley) 3/19/94 * $FreeBSD: src/usr.bin/make/var.c,v 1.83 2005/02/11 10:49:01 harti Exp $ - * $DragonFly: src/usr.bin/make/var.c,v 1.145 2005/03/12 12:02:37 okumoto Exp $ + * $DragonFly: src/usr.bin/make/var.c,v 1.146 2005/03/12 12:03:17 okumoto Exp $ */ /*- @@ -99,6 +99,16 @@ #include "util.h" #include "var.h" +/** + * + */ +typedef struct VarParser { + const char *const input; /* pointer to input string */ + GNode *ctxt; + Boolean err; +} VarParser; +static char *VarParse(const char [], VarParser *, size_t *, Boolean *); + /* * This is a harmless return value for Var_Parse that can be used by Var_Subst * to determine if there was an error in parsing -- easier than returning @@ -704,7 +714,7 @@ SortIncreasing(const void *l, const void *r) *----------------------------------------------------------------------- */ static char * -VarGetPattern(GNode *ctxt, int err, const char **tstr, int delim, int *flags, +VarGetPattern(VarParser *vp, const char **tstr, int delim, int *flags, size_t *length, VarPattern *pattern) { const char *cp; @@ -750,7 +760,7 @@ VarGetPattern(GNode *ctxt, int err, const char **tstr, int delim, int *flags, * substitution and recurse. */ len = 0; - cp2 = Var_Parse(cp, ctxt, err, &len, &freeIt); + cp2 = Var_Parse(cp, vp->ctxt, vp->err, &len, &freeIt); Buf_Append(buf, cp2); if (freeIt) free(cp2); @@ -864,11 +874,11 @@ VarREError(int err, regex_t *pat, const char *str) free(errbuf); } -/* +/** * Make sure this variable is fully expanded. */ static char * -VarExpand(Var *v, GNode *ctxt, Boolean err) +VarExpand(Var *v, VarParser *vp) { char *value; char *result; @@ -896,7 +906,7 @@ VarExpand(Var *v, GNode *ctxt, Boolean err) } else { Buffer *buf; - buf = Var_Subst(NULL, value, ctxt, err); + buf = Var_Subst(NULL, value, vp->ctxt, vp->err); result = Buf_GetAll(buf, NULL); Buf_Destroy(buf, FALSE); } @@ -954,7 +964,7 @@ modifier_M(const char mod[], const char value[], char endc, size_t *consumed) } static char * -modifier_S(const char mod[], const char value[], Var *v, GNode *ctxt, Boolean err, size_t *consumed) +modifier_S(const char mod[], const char value[], Var *v, VarParser *vp, size_t *consumed) { VarPattern pattern; Buffer *buf; /* Buffer for patterns */ @@ -1019,7 +1029,7 @@ modifier_S(const char mod[], const char value[], Var *v, GNode *ctxt, Boolean er Boolean freeIt; len = 0; - cp2 = Var_Parse(cur, ctxt, err, &len, &freeIt); + cp2 = Var_Parse(cur, vp->ctxt, vp->err, &len, &freeIt); cur += len; Buf_Append(buf, cp2); if (freeIt) { @@ -1076,7 +1086,7 @@ modifier_S(const char mod[], const char value[], Var *v, GNode *ctxt, Boolean er Boolean freeIt; len = 0; - cp2 = Var_Parse(cur, ctxt, err, &len, &freeIt); + cp2 = Var_Parse(cur, vp->ctxt, vp->err, &len, &freeIt); cur += len; Buf_Append(buf, cp2); if (freeIt) { @@ -1160,13 +1170,13 @@ modifier_S(const char mod[], const char value[], Var *v, GNode *ctxt, Boolean er static char * ParseModifier(const char input[], const char tstr[], char startc, char endc, Boolean dynamic, Var *v, - GNode *ctxt, Boolean err, size_t *lengthPtr, Boolean *freePtr) + VarParser *vp, size_t *lengthPtr, Boolean *freePtr) { char *value; const char *cp; size_t used; - value = VarExpand(v, ctxt, err); + value = VarExpand(v, vp); *freePtr = TRUE; tstr++; @@ -1189,7 +1199,7 @@ ParseModifier(const char input[], const char tstr[], readonly = TRUE; /* tstr isn't modified here */ - newStr = modifier_S(tstr, value, v, ctxt, err, &consumed); + newStr = modifier_S(tstr, value, v, vp, &consumed); tstr += consumed; break; case 'C': @@ -1205,7 +1215,7 @@ ParseModifier(const char input[], const char tstr[], cp = tstr; - if ((re = VarGetPattern(ctxt, err, &cp, delim, NULL, + if ((re = VarGetPattern(vp, &cp, delim, NULL, NULL, NULL)) == NULL) { *lengthPtr = cp - input + 1; if (*freePtr) @@ -1216,7 +1226,7 @@ ParseModifier(const char input[], const char tstr[], return (var_Error); } - if ((pattern.replace = VarGetPattern(ctxt, err, &cp, + if ((pattern.replace = VarGetPattern(vp, &cp, delim, NULL, NULL, NULL)) == NULL){ free(re); @@ -1408,8 +1418,8 @@ ParseModifier(const char input[], const char tstr[], cp = tstr; delim = '='; - if ((pattern.lhs = VarGetPattern(ctxt, - err, &cp, delim, &pattern.flags, &pattern.leftLen, + if ((pattern.lhs = VarGetPattern(vp, + &cp, delim, &pattern.flags, &pattern.leftLen, NULL)) == NULL) { /* was: goto cleanup */ *lengthPtr = cp - input + 1; @@ -1422,8 +1432,8 @@ ParseModifier(const char input[], const char tstr[], } delim = endc; - if ((pattern.rhs = VarGetPattern(ctxt, - err, &cp, delim, NULL, &pattern.rightLen, + if ((pattern.rhs = VarGetPattern(vp, + &cp, delim, NULL, &pattern.rightLen, &pattern)) == NULL) { /* was: goto cleanup */ *lengthPtr = cp - input + 1; @@ -1519,7 +1529,7 @@ ParseModifier(const char input[], const char tstr[], VarDestroy(v, TRUE); *freePtr = FALSE; - return (err ? var_Error : varNoError); + return (vp->err ? var_Error : varNoError); } } else { return (value); @@ -1527,7 +1537,7 @@ ParseModifier(const char input[], const char tstr[], } static char * -ParseRestModifier(const char input[], const char ptr[], char startc, char endc, Buffer *buf, GNode *ctxt, Boolean err, size_t *lengthPtr, Boolean *freePtr) +ParseRestModifier(const char input[], const char ptr[], char startc, char endc, Buffer *buf, VarParser *vp, size_t *lengthPtr, Boolean *freePtr) { const char *vname; size_t vlen; @@ -1541,14 +1551,14 @@ ParseRestModifier(const char input[], const char ptr[], char startc, char endc, dynamic = FALSE; - v = VarFind(vname, ctxt, FIND_ENV | FIND_GLOBAL | FIND_CMD); + v = VarFind(vname, vp->ctxt, FIND_ENV | FIND_GLOBAL | FIND_CMD); if (v != NULL) { return (ParseModifier(input, ptr, startc, endc, dynamic, v, - ctxt, err, lengthPtr, freePtr)); + vp, lengthPtr, freePtr)); } - if ((ctxt == VAR_CMD) || (ctxt == VAR_GLOBAL)) { + if ((vp->ctxt == VAR_CMD) || (vp->ctxt == VAR_GLOBAL)) { if ((vlen == 1) || ((vlen == 2) && (vname[1] == 'F' || vname[1] == 'D'))) { /* @@ -1583,7 +1593,7 @@ ParseRestModifier(const char input[], const char ptr[], char startc, char endc, v = VarCreate(vname, NULL, VAR_JUNK); return (ParseModifier(input, ptr, startc, endc, dynamic, v, - ctxt, err, lengthPtr, freePtr)); + vp, lengthPtr, freePtr)); } else { /* * Check for D and F forms of local variables since we're in @@ -1600,11 +1610,11 @@ ParseRestModifier(const char input[], const char ptr[], char startc, char endc, name[0] = vname[0]; name[1] = '\0'; - v = VarFind(name, ctxt, 0); + v = VarFind(name, vp->ctxt, 0); if (v != NULL) { return (ParseModifier(input, ptr, startc, endc, dynamic, v, - ctxt, err, lengthPtr, freePtr)); + vp, lengthPtr, freePtr)); } } @@ -1616,13 +1626,13 @@ ParseRestModifier(const char input[], const char ptr[], char startc, char endc, v = VarCreate(vname, NULL, VAR_JUNK); return (ParseModifier(input, ptr, startc, endc, dynamic, v, - ctxt, err, lengthPtr, freePtr)); + vp, lengthPtr, freePtr)); } } static char * ParseRestEnd(const char input[], Buffer *buf, - GNode *ctxt, Boolean err, size_t *consumed, Boolean *freePtr) + VarParser *vp, size_t *consumed, Boolean *freePtr) { const char *vname; size_t vlen; @@ -1631,9 +1641,9 @@ ParseRestEnd(const char input[], Buffer *buf, vname = Buf_GetAll(buf, &vlen); - v = VarFind(vname, ctxt, FIND_ENV | FIND_GLOBAL | FIND_CMD); + v = VarFind(vname, vp->ctxt, FIND_ENV | FIND_GLOBAL | FIND_CMD); if (v != NULL) { - value = VarExpand(v, ctxt, err); + value = VarExpand(v, vp); if (v->flags & VAR_FROM_ENV) { VarDestroy(v, TRUE); @@ -1643,7 +1653,7 @@ ParseRestEnd(const char input[], Buffer *buf, return (value); } - if ((ctxt == VAR_CMD) || (ctxt == VAR_GLOBAL)) { + if ((vp->ctxt == VAR_CMD) || (vp->ctxt == VAR_GLOBAL)) { /* * If substituting a local variable in a non-local * context, assume it's for dynamic source stuff. We @@ -1682,7 +1692,7 @@ ParseRestEnd(const char input[], Buffer *buf, } *freePtr = FALSE; - return (err ? var_Error : varNoError); + return (vp->err ? var_Error : varNoError); } else { /* * Check for D and F forms of local variables since we're in @@ -1696,7 +1706,7 @@ ParseRestEnd(const char input[], Buffer *buf, name[0] = vname[0]; name[1] = '\0'; - v = VarFind(name, ctxt, 0); + v = VarFind(name, vp->ctxt, 0); if (v != NULL) { char *val; /* @@ -1720,7 +1730,7 @@ ParseRestEnd(const char input[], Buffer *buf, } *freePtr = FALSE; - return (err ? var_Error : varNoError); + return (vp->err ? var_Error : varNoError); } } @@ -1728,7 +1738,7 @@ ParseRestEnd(const char input[], Buffer *buf, * Parse a multi letter variable name, and return it's value. */ static char * -VarParseLong(const char input[], GNode *ctxt, Boolean err, +VarParseLong(const char input[], VarParser *vp, size_t *consumed, Boolean *freePtr) { Buffer *buf; @@ -1765,7 +1775,7 @@ VarParseLong(const char input[], GNode *ctxt, Boolean err, } else if (*ptr == ':') { result = ParseRestModifier(input - 2, ptr, startc, endc, buf, - ctxt, err, consumed, freePtr); + vp, consumed, freePtr); Buf_Destroy(buf, TRUE); return (result); @@ -1775,7 +1785,7 @@ VarParseLong(const char input[], GNode *ctxt, Boolean err, char *rval; rlen = 0; - rval = Var_Parse(ptr, ctxt, err, &rlen, &rfree); + rval = Var_Parse(ptr, vp->ctxt, vp->err, &rlen, &rfree); if (rval == var_Error) { Fatal("Error expanding embedded variable."); } @@ -1794,7 +1804,7 @@ VarParseLong(const char input[], GNode *ctxt, Boolean err, *consumed += 1; /* consume closing paren or brace */ - result = ParseRestEnd(input - 2, buf, ctxt, err, consumed, freePtr); + result = ParseRestEnd(input - 2, buf, vp, consumed, freePtr); Buf_Destroy(buf, TRUE); return (result); @@ -1804,7 +1814,7 @@ VarParseLong(const char input[], GNode *ctxt, Boolean err, * Parse a single letter variable name, and return it's value. */ static char * -VarParseShort(const char input[], GNode *ctxt, Boolean err, +VarParseShort(const char input[], VarParser *vp, size_t *consumed, Boolean *freeResult) { char vname[2]; @@ -1816,9 +1826,9 @@ VarParseShort(const char input[], GNode *ctxt, Boolean err, *consumed += 1; /* consume single letter */ - v = VarFind(vname, ctxt, FIND_ENV | FIND_GLOBAL | FIND_CMD); + v = VarFind(vname, vp->ctxt, FIND_ENV | FIND_GLOBAL | FIND_CMD); if (v != NULL) { - value = VarExpand(v, ctxt, err); + value = VarExpand(v, vp); if (v->flags & VAR_FROM_ENV) { VarDestroy(v, TRUE); @@ -1836,7 +1846,7 @@ VarParseShort(const char input[], GNode *ctxt, Boolean err, * variables are treated specially as they are the only four that * will be set when dynamic sources are expanded. */ - if ((ctxt == VAR_CMD) || (ctxt == VAR_GLOBAL)) { + if ((vp->ctxt == VAR_CMD) || (vp->ctxt == VAR_GLOBAL)) { /* XXX: It looks like $% and $! are reversed here */ switch (vname[0]) { @@ -1854,7 +1864,7 @@ VarParseShort(const char input[], GNode *ctxt, Boolean err, return (estrdup("$(.MEMBER)")); default: *freeResult = FALSE; - return (err ? var_Error : varNoError); + return (vp->err ? var_Error : varNoError); } } @@ -1862,11 +1872,11 @@ VarParseShort(const char input[], GNode *ctxt, Boolean err, * Variable name was not found. */ *freeResult = FALSE; - return (err ? var_Error : varNoError); + return (vp->err ? var_Error : varNoError); } static char * -VarParse(const char input[], GNode *ctxt, Boolean err, size_t *consumed, Boolean *freeResult) +VarParse(const char input[], VarParser *vp, size_t *consumed, Boolean *freeResult) { /* assert(input[0] == '$'); */ @@ -1876,15 +1886,15 @@ VarParse(const char input[], GNode *ctxt, Boolean err, size_t *consumed, Boolean if (input[0] == '\0') { /* Error, there is only a dollar sign in the input string. */ *freeResult = FALSE; - return (err ? var_Error : varNoError); + return (vp->err ? var_Error : varNoError); } else if (input[0] == OPEN_PAREN || input[0] == OPEN_BRACE) { /* multi letter variable name */ - return (VarParseLong(input, ctxt, err, consumed, freeResult)); + return (VarParseLong(input, vp, consumed, freeResult)); } else { /* single letter variable name */ - return (VarParseShort(input, ctxt, err, consumed, freeResult)); + return (VarParseShort(input, vp, consumed, freeResult)); } } @@ -1916,7 +1926,13 @@ char * Var_Parse(const char input[], GNode *ctxt, Boolean err, size_t *consumed, Boolean *freeResult) { - return VarParse(input, ctxt, err, consumed, freeResult); + VarParser vp = { + input, + ctxt, + err + }; + + return VarParse(input, &vp, consumed, freeResult); } /*- -- 2.41.0