Module Name: src Committed By: rillig Date: Sun Jul 26 17:21:28 UTC 2020
Modified Files: src/usr.bin/make: var.c Log Message: make(1): in ParseModifierPart, only update length on success To generate a diff of this commit: cvs rdiff -u -r1.319 -r1.320 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.319 src/usr.bin/make/var.c:1.320 --- src/usr.bin/make/var.c:1.319 Sun Jul 26 17:10:56 2020 +++ src/usr.bin/make/var.c Sun Jul 26 17:21:28 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.319 2020/07/26 17:10:56 rillig Exp $ */ +/* $NetBSD: var.c,v 1.320 2020/07/26 17:21:28 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -69,14 +69,14 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: var.c,v 1.319 2020/07/26 17:10:56 rillig Exp $"; +static char rcsid[] = "$NetBSD: var.c,v 1.320 2020/07/26 17:21:28 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.319 2020/07/26 17:10:56 rillig Exp $"); +__RCSID("$NetBSD: var.c,v 1.320 2020/07/26 17:21:28 rillig Exp $"); #endif #endif /* not lint */ #endif @@ -1793,27 +1793,27 @@ VarRange(const char *str, int ac) * a backslash or a dollar, put a backslash before it. * * Return the expanded string or NULL if the delimiter was missing. + * * If pattern is specified, handle escaped ampersands and replace unescaped - * ampersands with the lhs of the pattern (for the :S and :C modifiers). + * ampersands with the lhs of the pattern (for the :S modifier). + * + * If out_length is specified, return the string length of the buffer + * (except on parse errors). * - * If length is specified, return the string length of the buffer. - * If mpflags is specified and the last character of the pattern is a $, + * If out_pflags is specified and the last character of the pattern is a $, * set the VARP_ANCHOR_END bit of mpflags. */ static char * ParseModifierPart(GNode *ctxt, const char **tstr, int delim, - VarEvalFlags eflags, VarPatternFlags *mpflags, - size_t *length, ModifyWord_SubstArgs *subst) + VarEvalFlags eflags, VarPatternFlags *out_pflags, + size_t *out_length, ModifyWord_SubstArgs *subst) { const char *cp; char *rstr; Buffer buf; - size_t junk; VarEvalFlags errnum = eflags & VARE_UNDEFERR; Buf_Init(&buf, 0); - if (length == NULL) - length = &junk; /* * Skim through until the matching delimiter is found; @@ -1829,10 +1829,10 @@ ParseModifierPart(GNode *ctxt, const cha cp++; } else if (*cp == '$') { if (cp[1] == delim) { /* Unescaped $ at end of pattern */ - if (mpflags == NULL) + if (out_pflags == NULL) Buf_AddByte(&buf, *cp); else - *mpflags |= VARP_ANCHOR_END; + *out_pflags |= VARP_ANCHOR_END; } else { if (!(eflags & VARE_NOSUBST)) { char *cp2; @@ -1884,12 +1884,12 @@ ParseModifierPart(GNode *ctxt, const cha if (*cp != delim) { *tstr = cp; - *length = 0; return NULL; } *tstr = ++cp; - *length = Buf_Size(&buf); + if (out_length != NULL) + *out_length = Buf_Size(&buf); rstr = Buf_Destroy(&buf, FALSE); if (DEBUG(VAR)) fprintf(debug_file, "Modifier part: \"%s\"\n", rstr);