summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHartmut Brandt <harti@FreeBSD.org>2005-03-02 14:30:36 +0000
committerHartmut Brandt <harti@FreeBSD.org>2005-03-02 14:30:36 +0000
commit09394f007341db24c9919f15fae92e684bebf641 (patch)
tree462431da3213c0aa189d05ab251f15adf831eaa5
parentd19788990f704f17dcb219a13131c71a70215a9d (diff)
Notes
-rw-r--r--usr.bin/make/var.c44
1 files changed, 27 insertions, 17 deletions
diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c
index 32fc0ba0c38d..91c9f7a86fdb 100644
--- a/usr.bin/make/var.c
+++ b/usr.bin/make/var.c
@@ -83,6 +83,7 @@ __FBSDID("$FreeBSD$");
* XXX: There's a lot of duplication in these functions.
*/
+#include <assert.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
@@ -1714,15 +1715,18 @@ VarParseLong(char foo[], GNode *ctxt, Boolean err, size_t *lengthPtr,
* if it exists.
*/
static char *
-VarParseShort(const char input[], GNode *ctxt, Boolean err, size_t *lengthPtr,
- Boolean *freePtr)
+VarParseShort(const char input[], GNode *ctxt, Boolean err,
+ size_t *lengthPtr, Boolean *freePtr)
{
char name[2];
Var *v;
- name[0] = input[1];
+ name[0] = input[0];
name[1] = '\0';
+ /* consume character */
+ *lengthPtr += 1;
+
v = VarFind(name, ctxt, FIND_ENV | FIND_GLOBAL | FIND_CMD);
if (v != NULL) {
char *result;
@@ -1734,7 +1738,6 @@ VarParseShort(const char input[], GNode *ctxt, Boolean err, size_t *lengthPtr,
}
*freePtr = TRUE;
- *lengthPtr = 2;
return (result);
}
@@ -1747,26 +1750,28 @@ VarParseShort(const char input[], GNode *ctxt, Boolean err, size_t *lengthPtr,
* will be set when dynamic sources are expanded.
*/
if ((ctxt == VAR_CMD) || (ctxt == VAR_GLOBAL)) {
- *freePtr = FALSE;
- *lengthPtr = 2;
/* XXX: It looks like $% and $! are reversed here */
- switch (input[1]) {
+ switch (name[0]) {
case '@':
- return ("$(.TARGET)");
+ *freePtr = TRUE;
+ return (estrdup("$(.TARGET)"));
case '%':
- return ("$(.ARCHIVE)");
+ *freePtr = TRUE;
+ return (estrdup("$(.ARCHIVE)"));
case '*':
- return ("$(.PREFIX)");
+ *freePtr = TRUE;
+ return (estrdup("$(.PREFIX)"));
case '!':
- return ("$(.MEMBER)");
+ *freePtr = TRUE;
+ return (estrdup("$(.MEMBER)"));
default:
+ *freePtr = FALSE;
return (err ? var_Error : varNoError);
}
}
*freePtr = FALSE;
- *lengthPtr = 2;
return (err ? var_Error : varNoError);
}
@@ -1795,18 +1800,23 @@ VarParseShort(const char input[], GNode *ctxt, Boolean err, size_t *lengthPtr,
*-----------------------------------------------------------------------
*/
char *
-Var_Parse(char *foo, GNode *ctxt, Boolean err, size_t *lengthPtr,
- Boolean *freePtr)
+Var_Parse(char *foo, GNode *ctxt, Boolean err,
+ size_t *lengthPtr, Boolean *freePtr)
{
const char *input = foo;
- if (input[1] == '\0') {
+ /* assert(input[0] == '$'); */
+
+ /* consume '$' */
+ input += 1;
+ *lengthPtr += 1;
+
+ if (input[0] == '\0') {
/* Error, there is only a dollar sign in the input string. */
*freePtr = FALSE;
- *lengthPtr = 1;
return (err ? var_Error : varNoError);
- } else if (input[1] == OPEN_PAREN || input[1] == OPEN_BRACE) {
+ } else if (input[0] == OPEN_PAREN || input[0] == OPEN_BRACE) {
/* multi letter variable name */
return (VarParseLong(foo, ctxt, err, lengthPtr, freePtr));