Module Name: src Committed By: rillig Date: Sun Aug 2 18:23:00 UTC 2020
Modified Files: src/usr.bin/make: var.c Log Message: make(1): reduce scope of variables This groups the variables by topic and only introduces them when they are actually needed. The compiler doesn't care, but during a debugging session this means fewer uninitialized variables. In VarUniq, the variable i has been split into two. All others remain exactly as before, just with a smaller scope. To generate a diff of this commit: cvs rdiff -u -r1.400 -r1.401 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.400 src/usr.bin/make/var.c:1.401 --- src/usr.bin/make/var.c:1.400 Sun Aug 2 17:10:54 2020 +++ src/usr.bin/make/var.c Sun Aug 2 18:23:00 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.400 2020/08/02 17:10:54 rillig Exp $ */ +/* $NetBSD: var.c,v 1.401 2020/08/02 18:23:00 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -69,14 +69,14 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: var.c,v 1.400 2020/08/02 17:10:54 rillig Exp $"; +static char rcsid[] = "$NetBSD: var.c,v 1.401 2020/08/02 18:23:00 rillig Exp $"; #else #include <sys/cdefs.h> #ifndef lint #if 0 static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94"; #else -__RCSID("$NetBSD: var.c,v 1.400 2020/08/02 17:10:54 rillig Exp $"); +__RCSID("$NetBSD: var.c,v 1.401 2020/08/02 18:23:00 rillig Exp $"); #endif #endif /* not lint */ #endif @@ -468,9 +468,6 @@ static int Var_Export1(const char *name, VarExportFlags flags) { char tmp[BUFSIZ]; - Var *v; - char *val = NULL; - int n; VarExportFlags parent = flags & VAR_EXPORT_PARENT; if (*name == '.') @@ -490,12 +487,15 @@ Var_Export1(const char *name, VarExportF return 0; } } - v = VarFind(name, VAR_GLOBAL, 0); + + Var *v = VarFind(name, VAR_GLOBAL, 0); if (v == NULL) return 0; + if (!parent && (v->flags & VAR_EXPORTED) && !(v->flags & VAR_REEXPORT)) return 0; /* nothing to do */ - val = Buf_GetAllZ(&v->val, NULL); + + char *val = Buf_GetAllZ(&v->val, NULL); if (!(flags & VAR_EXPORT_LITERAL) && strchr(val, '$')) { if (parent) { /* @@ -513,7 +513,7 @@ Var_Export1(const char *name, VarExportF */ return 0; } - n = snprintf(tmp, sizeof(tmp), "${%s}", name); + int n = snprintf(tmp, sizeof(tmp), "${%s}", name); if (n < (int)sizeof(tmp)) { val = Var_Subst(tmp, VAR_GLOBAL, VARE_WANTRES); setenv(name, val, 1); @@ -547,15 +547,13 @@ Var_ExportVars_callback(void *entry, voi void Var_ExportVars(void) { - char tmp[BUFSIZ]; - char *val; - /* * Several make's support this sort of mechanism for tracking * recursion - but each uses a different name. * We allow the makefiles to update MAKELEVEL and ensure * children see a correctly incremented value. */ + char tmp[BUFSIZ]; snprintf(tmp, sizeof(tmp), "%d", makelevel + 1); setenv(MAKE_LEVEL_ENV, tmp, 1); @@ -568,7 +566,7 @@ Var_ExportVars(void) return; } - val = Var_Subst("${" MAKE_EXPORTED ":O:u}", VAR_GLOBAL, VARE_WANTRES); + char *val = Var_Subst("${" MAKE_EXPORTED ":O:u}", VAR_GLOBAL, VARE_WANTRES); if (*val) { char **av; char *as; @@ -591,18 +589,12 @@ Var_ExportVars(void) void Var_Export(char *str, int isExport) { - char **av; - char *as; - VarExportFlags flags; - int ac; - int i; - if (isExport && (!str || !str[0])) { var_exportedVars = VAR_EXPORTED_ALL; /* use with caution! */ return; } - flags = 0; + VarExportFlags flags = 0; if (strncmp(str, "-env", 4) == 0) { str += 4; } else if (strncmp(str, "-literal", 8) == 0) { @@ -614,7 +606,11 @@ Var_Export(char *str, int isExport) char *val = Var_Subst(str, VAR_GLOBAL, VARE_WANTRES); if (*val) { - av = brk_string(val, &ac, FALSE, &as); + char *as; + int ac; + char **av = brk_string(val, &ac, FALSE, &as); + + int i; for (i = 0; i < ac; i++) { const char *name = av[i]; if (!name[1]) { @@ -660,13 +656,12 @@ Var_UnExport(char *str) char tmp[BUFSIZ]; char *vlist; char *cp; - Boolean unexport_env; int n; vlist = NULL; str += strlen("unexport"); - unexport_env = strncmp(str, "-env", 4) == 0; + Boolean unexport_env = strncmp(str, "-env", 4) == 0; if (unexport_env) { char **newenv; @@ -748,7 +743,6 @@ static void Var_Set_with_flags(const char *name, const char *val, GNode *ctxt, VarSet_Flags flags) { - Var *v; char *name_freeIt = NULL; /* @@ -770,6 +764,7 @@ Var_Set_with_flags(const char *name, con } } + Var *v; if (ctxt == VAR_GLOBAL) { v = VarFind(name, VAR_CMD, 0); if (v != NULL) { @@ -895,8 +890,6 @@ Var_Set(const char *name, const char *va void Var_Append(const char *name, const char *val, GNode *ctxt) { - Var *v; - Hash_Entry *h; char *expanded_name = NULL; if (strchr(name, '$') != NULL) { @@ -913,7 +906,7 @@ Var_Append(const char *name, const char name = expanded_name; } - v = VarFind(name, ctxt, ctxt == VAR_GLOBAL ? (FIND_CMD | FIND_ENV) : 0); + Var *v = VarFind(name, ctxt, ctxt == VAR_GLOBAL ? (FIND_CMD | FIND_ENV) : 0); if (v == NULL) { Var_Set(name, val, ctxt); @@ -934,7 +927,7 @@ Var_Append(const char *name, const char * export other variables...) */ v->flags &= ~VAR_FROM_ENV; - h = Hash_CreateEntry(&ctxt->context, name, NULL); + Hash_Entry *h = Hash_CreateEntry(&ctxt->context, name, NULL); Hash_SetValue(h, v); } } @@ -1307,11 +1300,8 @@ nosub: static void VarREError(int reerr, regex_t *pat, const char *str) { - char *errbuf; - int errlen; - - errlen = regerror(reerr, pat, 0, 0); - errbuf = bmake_malloc(errlen); + int errlen = regerror(reerr, pat, 0, 0); + char *errbuf = bmake_malloc(errlen); regerror(reerr, pat, errbuf, errlen); Error("%s: %s", str, errbuf); free(errbuf); @@ -1451,13 +1441,11 @@ VarSelectWords(Byte sep, Boolean oneBigW int last) { SepBuf buf; - char **av; /* word list */ - char *as; /* word list memory */ - int ac, i; - int start, end, step; - SepBuf_Init(&buf, sep); + char **av; /* word list */ + char *as; /* word list memory */ + int ac; if (oneBigWord) { /* fake what brk_string() would do if there were only one word */ ac = 1; @@ -1482,6 +1470,7 @@ VarSelectWords(Byte sep, Boolean oneBigW /* * We avoid scanning more of the list than we need to. */ + int start, end, step; if (first > last) { start = MIN(ac, first) - 1; end = MAX(0, last - 1); @@ -1492,6 +1481,7 @@ VarSelectWords(Byte sep, Boolean oneBigW step = 1; } + int i; for (i = start; (step < 0) == (i >= end); i += step) { SepBuf_AddStr(&buf, av[i]); SepBuf_Sep(&buf); @@ -1544,12 +1534,11 @@ ModifyWords(GNode *ctx, Byte sep, Boolea } SepBuf result; - char **av; /* word list */ - char *as; /* word list memory */ - int ac, i; - SepBuf_Init(&result, sep); + char **av; /* word list */ + char *as; /* word list memory */ + int ac; av = brk_string(str, &ac, FALSE, &as); if (DEBUG(VAR)) { @@ -1557,6 +1546,7 @@ ModifyWords(GNode *ctx, Byte sep, Boolea str, ac); } + int i; for (i = 0; i < ac; i++) { modifyWord(av[i], &result, data); if (result.buf.count > 0) @@ -1573,15 +1563,13 @@ ModifyWords(GNode *ctx, Byte sep, Boolea static int VarWordCompare(const void *a, const void *b) { - int r = strcmp(*(const char * const *)a, *(const char * const *)b); - return r; + return strcmp(*(const char * const *)a, *(const char * const *)b); } static int VarWordCompareReverse(const void *a, const void *b) { - int r = strcmp(*(const char * const *)b, *(const char * const *)a); - return r; + return strcmp(*(const char * const *)b, *(const char * const *)a); } /*- @@ -1601,12 +1589,11 @@ static char * VarOrder(const char *str, const char otype) { Buffer buf; /* Buffer for the new string */ - char **av; /* word list */ - char *as; /* word list memory */ - int ac, i; - Buf_InitZ(&buf, 0); + char **av; /* word list */ + char *as; /* word list memory */ + int ac; av = brk_string(str, &ac, FALSE, &as); if (ac > 0) { @@ -1624,6 +1611,8 @@ VarOrder(const char *str, const char oty * reasonable value for mod factor is 2 (the mod 1 will produce * 0 with probability 1). */ + (void)0; + int i; for (i = ac - 1; i > 0; i--) { int rndidx = random() % (i + 1); char *t = av[i]; @@ -1633,6 +1622,7 @@ VarOrder(const char *str, const char oty } } + int i; for (i = 0; i < ac; i++) { if (i != 0) Buf_AddByte(&buf, ' '); @@ -1650,21 +1640,22 @@ VarOrder(const char *str, const char oty static char * VarUniq(const char *str) { - Buffer buf; /* Buffer for new string */ - char **av; /* List of words to affect */ - char *as; /* Word list memory */ - int ac, i, j; - + Buffer buf; /* Buffer for new string */ Buf_InitZ(&buf, 0); - av = brk_string(str, &ac, FALSE, &as); + + char *as; /* Word list memory */ + int ac; + char **av = brk_string(str, &ac, FALSE, &as); if (ac > 1) { + int i, j; for (j = 0, i = 1; i < ac; i++) if (strcmp(av[i], av[j]) != 0 && (++j != i)) av[j] = av[i]; ac = j + 1; } + int i; for (i = 0; i < ac; i++) { if (i != 0) Buf_AddByte(&buf, ' '); @@ -1850,18 +1841,16 @@ static char * VarHash(const char *str) { static const char hexdigits[16] = "0123456789abcdef"; - Buffer buf; - size_t len, len2; const unsigned char *ustr = (const unsigned char *)str; - uint32_t h, k, c1, c2; - h = 0x971e137bU; - c1 = 0x95543787U; - c2 = 0x2ad7eb25U; - len2 = strlen(str); + uint32_t h = 0x971e137bU; + uint32_t c1 = 0x95543787U; + uint32_t c2 = 0x2ad7eb25U; + size_t len2 = strlen(str); + size_t len; for (len = len2; len; ) { - k = 0; + uint32_t k = 0; switch (len) { default: k = ((uint32_t)ustr[3] << 24) | @@ -1896,6 +1885,7 @@ VarHash(const char *str) h *= 0xc2b2ae35; h ^= h >> 16; + Buffer buf; Buf_InitZ(&buf, 0); for (len = 0; len < 8; ++len) { Buf_AddByte(&buf, hexdigits[h & 15]); @@ -2015,9 +2005,7 @@ ApplyModifier_Loop(const char *mod, Appl static ApplyModifierResult ApplyModifier_Defined(const char *mod, ApplyModifiersState *st) { - Buffer buf; /* Buffer for patterns */ VarEvalFlags neflags; - if (st->eflags & VARE_WANTRES) { Boolean wantres; if (*mod == 'U') @@ -2037,6 +2025,7 @@ ApplyModifier_Defined(const char *mod, A * the delimiter (expand the variable substitution). * The result is left in the Buffer buf. */ + Buffer buf; /* Buffer for patterns */ Buf_InitZ(&buf, 0); const char *p = mod + 1; while (*p != st->endc && *p != ':' && *p != '\0') { @@ -2590,10 +2579,10 @@ ApplyModifier_Words(const char *mod, App */ char *ep; int first = strtol(estr, &ep, 0); - int last; if (ep == estr) /* Found junk instead of a number */ goto bad_modifier; + int last; if (ep[0] == '\0') { /* Found only one integer in :[N] */ last = first; } else if (ep[0] == '.' && ep[1] == '.' && ep[2] != '\0') { @@ -2636,9 +2625,9 @@ bad_modifier: static ApplyModifierResult ApplyModifier_Order(const char *mod, ApplyModifiersState *st) { - char otype; - st->next = mod + 1; /* skip to the rest in any case */ + + char otype; if (mod[1] == st->endc || mod[1] == ':') { otype = 's'; } else if ((mod[1] == 'r' || mod[1] == 'x') && @@ -2735,14 +2724,13 @@ ApplyModifier_Assign(const char *mod, Ap (op[0] == '!' || op[0] == '+' || op[0] == '?')))) return AMR_UNKNOWN; /* "::<unrecognised>" */ - GNode *v_ctxt; /* context where v belongs */ if (st->v->name[0] == 0) { st->next = mod + 1; return AMR_BAD; } - v_ctxt = st->ctxt; + GNode *v_ctxt = st->ctxt; /* context where v belongs */ char *sv_name = NULL; if (st->v->flags & VAR_JUNK) { /* @@ -2989,17 +2977,15 @@ ApplyModifiers( /* * We may have some complex modifiers in a variable. */ - void *freeIt; - const char *rval; int rlen; - int c; - - rval = Var_Parse(p, st.ctxt, st.eflags, &rlen, &freeIt); + void *freeIt; + const char *rval = Var_Parse(p, st.ctxt, st.eflags, &rlen, &freeIt); /* * If we have not parsed up to st.endc or ':', * we are not interested. */ + int c; if (rval != NULL && *rval && (c = p[rlen]) != '\0' && c != ':' && c != st.endc) { free(freeIt); @@ -3162,8 +3148,8 @@ ApplyModifiers( #ifdef SUNSHCMD case 's': if (p[1] == 'h' && (p[2] == st.endc || p[2] == ':')) { - const char *emsg; if (st.eflags & VARE_WANTRES) { + const char *emsg; st.newVal = Cmd_Exec(st.val, &emsg); if (emsg) Error(emsg, st.val); @@ -3313,23 +3299,21 @@ Var_Parse(const char * const str, GNode int *lengthPtr, void **freePtr) { const char *tstr; /* Pointer into str */ - Var *v; /* Variable in invocation */ Boolean haveModifier; /* TRUE if have modifiers for the variable */ - char endc; /* Ending character when variable in parens - * or braces */ char startc; /* Starting character when variable in parens * or braces */ - char *nstr; /* New string, used during expansion */ + char endc; /* Ending character when variable in parens + * or braces */ Boolean dynamic; /* TRUE if the variable is local and we're * expanding it in a non-local context. This * is done to support dynamic sources. The * result is just the invocation, unaltered */ - const char *extramodifiers; /* extra modifiers to apply first */ *freePtr = NULL; - extramodifiers = NULL; + const char *extramodifiers = NULL; /* extra modifiers to apply first */ dynamic = FALSE; + Var *v; /* Variable in invocation */ startc = str[1]; if (startc != PROPEN && startc != BROPEN) { /* @@ -3500,6 +3484,7 @@ Var_Parse(const char * const str, GNode } else { v->flags |= VAR_IN_USE; } + /* * Before doing any modification, we have to make sure the value * has been fully expanded. If it looks like recursion might be @@ -3509,7 +3494,7 @@ Var_Parse(const char * const str, GNode * been dynamically-allocated, so it will need freeing when we * return. */ - nstr = Buf_GetAllZ(&v->val, NULL); + char *nstr = Buf_GetAllZ(&v->val, NULL); if (strchr(nstr, '$') != NULL && (eflags & VARE_WANTRES) != 0) { nstr = Var_Subst(nstr, ctxt, eflags); *freePtr = nstr; @@ -3602,18 +3587,15 @@ Var_Parse(const char * const str, GNode char * Var_Subst(const char *str, GNode *ctxt, VarEvalFlags eflags) { - Buffer buf; /* Buffer for forming things */ - const char *val; /* Value to substitute for a variable */ - int length; /* Length of the variable invocation */ - Boolean trailingBslash; /* variable ends in \ */ - void *freeIt = NULL; /* Set if it should be freed */ - static Boolean errorReported; /* Set true if an error has already - * been reported to prevent a plethora - * of messages when recursing */ - + Buffer buf; /* Buffer for forming things */ Buf_InitZ(&buf, 0); + + /* Set true if an error has already been reported, + * to prevent a plethora of messages when recursing */ + static Boolean errorReported; errorReported = FALSE; - trailingBslash = FALSE; + + Boolean trailingBslash = FALSE; /* variable ends in \ */ while (*str) { if (*str == '\n' && trailingBslash) @@ -3639,7 +3621,9 @@ Var_Subst(const char *str, GNode *ctxt, continue; Buf_AddBytesBetween(&buf, cp, str); } else { - val = Var_Parse(str, ctxt, eflags, &length, &freeIt); + int length; + void *freeIt = NULL; + const char *val = Var_Parse(str, ctxt, eflags, &length, &freeIt); /* * When we come down here, val should either point to the