summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authorharti <harti@FreeBSD.org>2005-04-13 11:40:44 +0000
committerharti <harti@FreeBSD.org>2005-04-13 11:40:44 +0000
commit347920afa952cb69a21dfcf0f5ebf0d6f98a3108 (patch)
tree0c485bdac3abd421c59acb2c47d5fc99ded581f7 /usr.bin
parentafab3762a03836a33f6a8bd19afdb3d9559e12ec (diff)
downloadFreeBSD-src-347920afa952cb69a21dfcf0f5ebf0d6f98a3108.zip
FreeBSD-src-347920afa952cb69a21dfcf0f5ebf0d6f98a3108.tar.gz
Split VarFind() into a series of functions tailored for the different sets
of flags originally passed to VarFind(). This eliminates the code by removing a bunch of tests. Patch: 7.173 Submitted by: Max Okumoto <okumoto@ucsd.edu>
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/make/var.c164
1 files changed, 94 insertions, 70 deletions
diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c
index d47971d..892e1da 100644
--- a/usr.bin/make/var.c
+++ b/usr.bin/make/var.c
@@ -144,10 +144,6 @@ static char varNoError[] = "";
GNode *VAR_GLOBAL; /* variables from the makefile */
GNode *VAR_CMD; /* variables defined on the command-line */
-#define FIND_CMD 0x1 /* look in VAR_CMD when searching */
-#define FIND_GLOBAL 0x2 /* look in VAR_GLOBAL as well */
-#define FIND_ENV 0x4 /* look in the environment also */
-
#define OPEN_PAREN '('
#define CLOSE_PAREN ')'
#define OPEN_BRACE '{'
@@ -232,71 +228,106 @@ VarPossiblyExpand(const char *name, GNode *ctxt)
}
}
-/*-
- *-----------------------------------------------------------------------
- * VarFind --
- * Find the given variable in the given context and any other contexts
- * indicated.
- *
- * Flags:
- * FIND_GLOBAL set means look in the VAR_GLOBAL context too
- * FIND_CMD set means to look in the VAR_CMD context too
- * FIND_ENV set means to look in the environment
- *
- * Results:
- * A pointer to the structure describing the desired variable or
- * NULL if the variable does not exist.
- *
- * Side Effects:
- * None
- *-----------------------------------------------------------------------
+/**
+ * If the variable name begins with a '.', it could very well be
+ * one of the local ones. We check the name against all the local
+ * variables and substitute the short version in for 'name' if it
+ * matches one of them.
*/
-static Var *
-VarFind(const char *name, GNode *ctxt, int flags)
+static const char *
+VarLocal(const char name[])
{
- Boolean localCheckEnvFirst;
- LstNode *ln;
- Var *var;
- char *env;
-
- /*
- * If the variable name begins with a '.', it could very well be one of
- * the local ones. We check the name against all the local variables
- * and substitute the short version in for 'name' if it matches one of
- * them.
- */
if (name[0] == '.') {
switch (name[1]) {
case 'A':
if (!strcmp(name, ".ALLSRC"))
- name = ALLSRC;
+ return (ALLSRC);
if (!strcmp(name, ".ARCHIVE"))
- name = ARCHIVE;
+ return (ARCHIVE);
break;
case 'I':
if (!strcmp(name, ".IMPSRC"))
- name = IMPSRC;
+ return (IMPSRC);
break;
case 'M':
if (!strcmp(name, ".MEMBER"))
- name = MEMBER;
+ return (MEMBER);
break;
case 'O':
if (!strcmp(name, ".OODATE"))
- name = OODATE;
+ return (OODATE);
break;
case 'P':
if (!strcmp(name, ".PREFIX"))
- name = PREFIX;
+ return (PREFIX);
break;
case 'T':
if (!strcmp(name, ".TARGET"))
- name = TARGET;
+ return (TARGET);
break;
default:
break;
}
}
+ return (name);
+}
+
+/**
+ * Find the given variable in the given context and the enviornment.
+ *
+ * Results:
+ * A pointer to the structure describing the desired variable or
+ * NULL if the variable does not exist.
+ */
+static Var *
+VarFindEnv(const char name[], GNode *ctxt)
+{
+ Var *var;
+ char *env;
+
+ name = VarLocal(name);
+
+ /* First look for the variable in the given context. */
+ if ((var = VarLookup(&ctxt->context, name)) != NULL)
+ return (var);
+
+ /* Look for the variable in the environment. */
+ if ((env = getenv(name)) != NULL) {
+ /* craft this variable from the environment value */
+ return (VarCreate(name, env, VAR_FROM_ENV));
+ }
+
+ return (NULL);
+}
+
+/**
+ * Look for the variable in the given context.
+ */
+static Var *
+VarFindOnly(const char name[], GNode *ctxt)
+{
+ Var *var;
+
+ name = VarLocal(name);
+
+ if ((var = VarLookup(&ctxt->context, name)) != NULL)
+ return (var);
+
+ return (NULL);
+}
+
+/**
+ * Look for the variable in all contexts.
+ */
+static Var *
+VarFindAny(const char name[], GNode *ctxt)
+{
+ Boolean localCheckEnvFirst;
+ LstNode *ln;
+ Var *var;
+ char *env;
+
+ name = VarLocal(name);
/*
* Note whether this is one of the specific variables we were told
@@ -315,31 +346,21 @@ VarFind(const char *name, GNode *ctxt, int flags)
* look for it in VAR_CMD, VAR_GLOBAL and the environment,
* in that order, depending on the FIND_* flags in 'flags'
*/
- var = VarLookup(&ctxt->context, name);
- if (var != NULL) {
- /* got it */
+ if ((var = VarLookup(&ctxt->context, name)) != NULL)
return (var);
- }
/* not there - try command line context */
- if ((flags & FIND_CMD) && (ctxt != VAR_CMD)) {
- var = VarLookup(&VAR_CMD->context, name);
- if (var != NULL)
+ if (ctxt != VAR_CMD) {
+ if ((var = VarLookup(&VAR_CMD->context, name)) != NULL)
return (var);
}
/* not there - try global context, but only if not -e/-E */
- if ((flags & FIND_GLOBAL) && (ctxt != VAR_GLOBAL) &&
- !checkEnvFirst && !localCheckEnvFirst) {
- var = VarLookup(&VAR_GLOBAL->context, name);
- if (var != NULL)
+ if (ctxt != VAR_GLOBAL && (!checkEnvFirst && !localCheckEnvFirst)) {
+ if ((var = VarLookup(&VAR_GLOBAL->context, name)) != NULL)
return (var);
}
- if (!(flags & FIND_ENV))
- /* we were not told to look into the environment */
- return (NULL);
-
/* look in the environment */
if ((env = getenv(name)) != NULL) {
/* craft this variable from the environment value */
@@ -347,12 +368,11 @@ VarFind(const char *name, GNode *ctxt, int flags)
}
/* deferred check for the environment (in case of -e/-E) */
- if ((checkEnvFirst || localCheckEnvFirst) &&
- (flags & FIND_GLOBAL) && (ctxt != VAR_GLOBAL)) {
- var = VarLookup(&VAR_GLOBAL->context, name);
- if (var != NULL)
+ if ((ctxt != VAR_GLOBAL) && (checkEnvFirst || localCheckEnvFirst)) {
+ if ((var = VarLookup(&VAR_GLOBAL->context, name)) != NULL)
return (var);
}
+
return (NULL);
}
@@ -439,7 +459,7 @@ Var_Set(const char *name, const char *val, GNode *ctxt)
* much point in searching them all just to save a bit of memory...
*/
n = VarPossiblyExpand(name, ctxt);
- v = VarFind(n, ctxt, 0);
+ v = VarFindOnly(n, ctxt);
if (v == NULL) {
VarAdd(n, val, ctxt);
} else {
@@ -487,7 +507,11 @@ Var_Append(const char *name, const char *val, GNode *ctxt)
char *n;
n = VarPossiblyExpand(name, ctxt);
- v = VarFind(n, ctxt, (ctxt == VAR_GLOBAL) ? FIND_ENV : 0);
+ if (ctxt == VAR_GLOBAL) {
+ v = VarFindEnv(n, ctxt);
+ } else {
+ v = VarFindOnly(n, ctxt);
+ }
if (v == NULL) {
VarAdd(n, val, ctxt);
@@ -533,7 +557,7 @@ Var_Exists(const char *name, GNode *ctxt)
char *n;
n = VarPossiblyExpand(name, ctxt);
- v = VarFind(n, ctxt, FIND_CMD | FIND_GLOBAL | FIND_ENV);
+ v = VarFindAny(n, ctxt);
if (v == NULL) {
free(n);
return (FALSE);
@@ -567,7 +591,7 @@ Var_Value(const char *name, GNode *ctxt, char **frp)
char *p;
n = VarPossiblyExpand(name, ctxt);
- v = VarFind(n, ctxt, FIND_ENV | FIND_GLOBAL | FIND_CMD);
+ v = VarFindAny(n, ctxt);
if (v == NULL) {
p = NULL;
*frp = NULL;
@@ -1293,7 +1317,7 @@ ParseRestModifier(VarParser *vp, char startc, Buffer *buf, Boolean *freeResult)
vname = Buf_GetAll(buf, &vlen);
- v = VarFind(vname, vp->ctxt, FIND_ENV | FIND_GLOBAL | FIND_CMD);
+ v = VarFindAny(vname, vp->ctxt);
if (v != NULL) {
value = ParseModifier(vp, startc, v, freeResult);
@@ -1369,7 +1393,7 @@ ParseRestModifier(VarParser *vp, char startc, Buffer *buf, Boolean *freeResult)
name[0] = vname[0];
name[1] = '\0';
- v = VarFind(name, vp->ctxt, 0);
+ v = VarFindOnly(name, vp->ctxt);
if (v != NULL) {
value = ParseModifier(vp, startc, v, freeResult);
return (value);
@@ -1403,7 +1427,7 @@ ParseRestEnd(VarParser *vp, Buffer *buf, Boolean *freeResult)
vname = Buf_GetAll(buf, &vlen);
- v = VarFind(vname, vp->ctxt, FIND_ENV | FIND_GLOBAL | FIND_CMD);
+ v = VarFindAny(vname, vp->ctxt);
if (v != NULL) {
value = VarExpand(v, vp);
@@ -1466,7 +1490,7 @@ ParseRestEnd(VarParser *vp, Buffer *buf, Boolean *freeResult)
name[0] = vname[0];
name[1] = '\0';
- v = VarFind(name, vp->ctxt, 0);
+ v = VarFindOnly(name, vp->ctxt);
if (v != NULL) {
char *val;
/*
@@ -1573,7 +1597,7 @@ VarParseShort(VarParser *vp, Boolean *freeResult)
vp->ptr++; /* consume single letter */
- v = VarFind(vname, vp->ctxt, FIND_ENV | FIND_GLOBAL | FIND_CMD);
+ v = VarFindAny(vname, vp->ctxt);
if (v != NULL) {
value = VarExpand(v, vp);
OpenPOWER on IntegriCloud