From 14e97e0b68cdeff657fd73aab09d4585637d4fd7 Mon Sep 17 00:00:00 2001 From: Max Okumoto Date: Sat, 12 Mar 2005 12:00:02 +0000 Subject: [PATCH] patch-7.115 VarParseLong() - Moved detection of modifier ':' into loop. - add comment about why consumed is updated. --- usr.bin/make/var.c | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c index 98c3f78b4d..2aab8e9189 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.141 2005/03/12 11:59:28 okumoto Exp $ + * $DragonFly: src/usr.bin/make/var.c,v 1.142 2005/03/12 12:00:02 okumoto Exp $ */ /*- @@ -1632,7 +1632,8 @@ ParseRestModifier(const char input[], const char ptr[], char startc, char endc, } static char * -ParseRestEnd(const char input[], Buffer *buf, GNode *ctxt, Boolean err, size_t *lengthPtr, Boolean *freePtr) +ParseRestEnd(const char input[], Buffer *buf, + GNode *ctxt, Boolean err, size_t *consumed, Boolean *freePtr) { const char *vname; size_t vlen; @@ -1667,9 +1668,9 @@ ParseRestEnd(const char input[], Buffer *buf, GNode *ctxt, Boolean err, size_t * if (((vlen == 1)) || ((vlen == 2) && (vname[1] == 'F' || vname[1] == 'D'))) { if (strchr("!%*@", vname[0]) != NULL) { - result = emalloc(*lengthPtr + 1); - strncpy(result, input, *lengthPtr); - result[*lengthPtr] = '\0'; + result = emalloc(*consumed + 1); + strncpy(result, input, *consumed); + result[*consumed] = '\0'; *freePtr = TRUE; return (result); @@ -1682,9 +1683,9 @@ ParseRestEnd(const char input[], Buffer *buf, GNode *ctxt, Boolean err, size_t * (strncmp(vname, ".ARCHIVE", vlen - 1) == 0) || (strncmp(vname, ".PREFIX", vlen - 1) == 0) || (strncmp(vname, ".MEMBER", vlen - 1) == 0)) { - result = emalloc(*lengthPtr + 1); - strncpy(result, input, *lengthPtr); - result[*lengthPtr] = '\0'; + result = emalloc(*consumed + 1); + strncpy(result, input, *consumed); + result[*consumed] = '\0'; *freePtr = TRUE; return (result); @@ -1742,10 +1743,8 @@ VarParseLong(const char input[], GNode *ctxt, Boolean err, size_t *consumed, Boolean *freePtr) { Buffer *buf; - char endc; /* Ending character when variable in parens - * or braces */ - char startc; /* Starting character when variable in parens - * or braces */ + char startc; + char endc; const char *ptr; char *result; @@ -1758,11 +1757,11 @@ VarParseLong(const char input[], GNode *ctxt, Boolean err, startc = input[0]; endc = (startc == OPEN_PAREN) ? CLOSE_PAREN : CLOSE_BRACE; - *consumed += 1; + *consumed += 1; /* consume opening paren or brace */ input++; ptr = input; - while (*ptr != endc && *ptr != ':') { + while (*ptr != endc) { if (*ptr == '\0') { /* * If we did not find the end character, @@ -1774,6 +1773,13 @@ VarParseLong(const char input[], GNode *ctxt, Boolean err, *freePtr = FALSE; return (var_Error); + } else if (*ptr == ':') { + result = ParseRestModifier(input - 2, ptr, + startc, endc, buf, + ctxt, err, consumed, freePtr); + Buf_Destroy(buf, TRUE); + return (result); + } else if (*ptr == '$') { size_t rlen; Boolean rfree; @@ -1789,6 +1795,7 @@ VarParseLong(const char input[], GNode *ctxt, Boolean err, free(rval); *consumed += rlen; ptr += rlen; + } else { Buf_AddByte(buf, (Byte)*ptr); *consumed += 1; @@ -1796,12 +1803,9 @@ VarParseLong(const char input[], GNode *ctxt, Boolean err, } } - if (*ptr == ':') { - result = ParseRestModifier(input - 2, ptr, startc, endc, buf, ctxt, err, consumed, freePtr); - } else { - *consumed = ptr - (input - 2) + 1; - result = ParseRestEnd(input - 2, buf, ctxt, err, consumed, freePtr); - } + *consumed += 1; /* consume closing paren or brace */ + + result = ParseRestEnd(input - 2, buf, ctxt, err, consumed, freePtr); Buf_Destroy(buf, TRUE); return (result); -- 2.41.0