Module Name: src
Committed By: rillig
Date: Mon Dec 13 03:41:57 UTC 2021
Modified Files:
src/usr.bin/make: var.c
Log Message:
make: reduce memory allocations in modifier ':C'
The memory allocation was in the call to LazyBuf_DoneGet.
No functional change.
To generate a diff of this commit:
cvs rdiff -u -r1.983 -r1.984 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.983 src/usr.bin/make/var.c:1.984
--- src/usr.bin/make/var.c:1.983 Mon Dec 13 03:19:32 2021
+++ src/usr.bin/make/var.c Mon Dec 13 03:41:57 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: var.c,v 1.983 2021/12/13 03:19:32 rillig Exp $ */
+/* $NetBSD: var.c,v 1.984 2021/12/13 03:41:57 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -140,7 +140,7 @@
#include "metachar.h"
/* "@(#)var.c 8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.983 2021/12/13 03:19:32 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.984 2021/12/13 03:41:57 rillig Exp $");
/*
* Variables are defined using one of the VAR=value assignments. Their
@@ -1630,15 +1630,17 @@ RegexReplaceBackref(char ref, SepBuf *bu
* buffer, taking back-references from 'wp'.
*/
static void
-RegexReplace(const char *replace, SepBuf *buf, const char *wp,
+RegexReplace(Substring replace, SepBuf *buf, const char *wp,
const regmatch_t *m, size_t nsub)
{
const char *rp;
- for (rp = replace; *rp != '\0'; rp++) {
- if (*rp == '\\' && (rp[1] == '&' || rp[1] == '\\'))
+ for (rp = replace.start; rp != replace.end; rp++) {
+ if (*rp == '\\' && rp + 1 != replace.end &&
+ (rp[1] == '&' || rp[1] == '\\'))
SepBuf_AddBytes(buf, ++rp, 1);
- else if (*rp == '\\' && ch_isdigit(rp[1]))
+ else if (*rp == '\\' && rp + 1 != replace.end &&
+ ch_isdigit(rp[1]))
RegexReplaceBackref(*++rp, buf, wp, m, nsub);
else if (*rp == '&') {
SepBuf_AddBytesBetween(buf,
@@ -1652,7 +1654,7 @@ RegexReplace(const char *replace, SepBuf
struct ModifyWord_SubstRegexArgs {
regex_t re;
size_t nsub;
- const char *replace;
+ Substring replace;
PatternFlags pflags;
bool matched;
};
@@ -2952,7 +2954,7 @@ ApplyModifier_Regex(const char **pp, Mod
int error;
VarParseResult res;
LazyBuf reBuf, replaceBuf;
- FStr re, replace;
+ FStr re;
char delim = (*pp)[1];
if (delim == '\0') {
@@ -2973,8 +2975,7 @@ ApplyModifier_Regex(const char **pp, Mod
FStr_Done(&re);
return AMR_CLEANUP;
}
- replace = LazyBuf_DoneGet(&replaceBuf);
- args.replace = replace.str;
+ args.replace = LazyBuf_Get(&replaceBuf);
args.pflags = PatternFlags_None();
args.matched = false;
@@ -2982,7 +2983,7 @@ ApplyModifier_Regex(const char **pp, Mod
ParsePatternFlags(pp, &args.pflags, &oneBigWord);
if (!ModChain_ShouldEval(ch)) {
- FStr_Done(&replace);
+ LazyBuf_Done(&replaceBuf);
FStr_Done(&re);
return AMR_OK;
}
@@ -2990,7 +2991,7 @@ ApplyModifier_Regex(const char **pp, Mod
error = regcomp(&args.re, re.str, REG_EXTENDED);
if (error != 0) {
VarREError(error, &args.re, "Regex compilation error");
- FStr_Done(&replace);
+ LazyBuf_Done(&replaceBuf);
FStr_Done(&re);
return AMR_CLEANUP;
}
@@ -3002,7 +3003,7 @@ ApplyModifier_Regex(const char **pp, Mod
ModifyWords(ch, ModifyWord_SubstRegex, &args, oneBigWord);
regfree(&args.re);
- FStr_Done(&replace);
+ LazyBuf_Done(&replaceBuf);
FStr_Done(&re);
return AMR_OK;
}