=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/make/varmodifiers.c,v retrieving revision 1.45 retrieving revision 1.46 diff -c -r1.45 -r1.46 *** src/usr.bin/make/varmodifiers.c 2017/01/25 14:17:45 1.45 --- src/usr.bin/make/varmodifiers.c 2017/02/24 23:38:47 1.46 *************** *** 1,4 **** ! /* $OpenBSD: varmodifiers.c,v 1.45 2017/01/25 14:17:45 espie Exp $ */ /* $NetBSD: var.c,v 1.18 1997/03/18 19:24:46 christos Exp $ */ /* --- 1,4 ---- ! /* $OpenBSD: varmodifiers.c,v 1.46 2017/02/24 23:38:47 espie Exp $ */ /* $NetBSD: var.c,v 1.18 1997/03/18 19:24:46 christos Exp $ */ /* *************** *** 603,631 **** { VarPattern *pattern; const char *cp, *cp2; ! BUFFER buf; int cnt = 0; char startc = endc == ')' ? '(' : '{'; for (cp = *p;; cp++) { if (*cp == '=' && cnt == 0) break; ! if (*cp == '\0') return NULL; if (*cp == startc) cnt++; else if (*cp == endc) { cnt--; ! if (cnt < 0) return NULL; } } ! Buf_Init(&buf, 0); for (cp2 = cp+1;; cp2++) { if (((*cp2 == ':' && cp2[1] != endc) || *cp2 == endc) && cnt == 0) break; if (*cp2 == '\0') { Buf_Destroy(&buf); return NULL; } if (*cp2 == startc) --- 603,650 ---- { VarPattern *pattern; const char *cp, *cp2; ! BUFFER buf, buf2; int cnt = 0; char startc = endc == ')' ? '(' : '{'; + + Buf_Init(&buf, 0); for (cp = *p;; cp++) { if (*cp == '=' && cnt == 0) break; ! if (*cp == '\0') { ! Buf_Destroy(&buf); return NULL; + } if (*cp == startc) cnt++; else if (*cp == endc) { cnt--; ! if (cnt < 0) { ! Buf_Destroy(&buf); return NULL; + } + } else if (*cp == '$') { + if (cp[1] == '$') + cp++; + else { + size_t len; + (void)Var_ParseBuffer(&buf, cp, ctxt, err, + &len); + cp += len - 1; + continue; + } } + Buf_AddChar(&buf, *cp); } ! ! Buf_Init(&buf2, 0); for (cp2 = cp+1;; cp2++) { if (((*cp2 == ':' && cp2[1] != endc) || *cp2 == endc) && cnt == 0) break; if (*cp2 == '\0') { Buf_Destroy(&buf); + Buf_Destroy(&buf2); return NULL; } if (*cp2 == startc) *************** *** 634,639 **** --- 653,659 ---- cnt--; if (cnt < 0) { Buf_Destroy(&buf); + Buf_Destroy(&buf2); return NULL; } } else if (*cp2 == '$') { *************** *** 641,660 **** cp2++; else { size_t len; ! (void)Var_ParseBuffer(&buf, cp2, ctxt, err, &len); cp2 += len - 1; continue; } } ! Buf_AddChar(&buf, *cp2); } pattern = emalloc(sizeof(VarPattern)); ! pattern->lbuffer = pattern->lhs = Str_dupi(*p, cp); ! pattern->leftLen = cp - *p; ! pattern->rhs = Buf_Retrieve(&buf); ! pattern->rightLen = Buf_Size(&buf); pattern->flags = 0; *p = cp2; return pattern; --- 661,680 ---- cp2++; else { size_t len; ! (void)Var_ParseBuffer(&buf2, cp2, ctxt, err, &len); cp2 += len - 1; continue; } } ! Buf_AddChar(&buf2, *cp2); } pattern = emalloc(sizeof(VarPattern)); ! pattern->lbuffer = pattern->lhs = Buf_Retrieve(&buf); ! pattern->leftLen = Buf_Size(&buf); ! pattern->rhs = Buf_Retrieve(&buf2); ! pattern->rightLen = Buf_Size(&buf2); pattern->flags = 0; *p = cp2; return pattern;