diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2021-07-27 18:13:11 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2021-07-27 18:13:39 +0200 |
commit | 37460f5daff9b9ed751ce37b912cc61de94adf09 (patch) | |
tree | 6dc76a5d514ab71a2b92c8b4a386c45de46ecc9a | |
parent | 49cc3cac30c504abdbd2c075928f5711da4066e8 (diff) |
hush: tweak ${var/pattern/repl} optimization
function old new delta
expand_one_var 2507 2502 -5
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | shell/hush.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/shell/hush.c b/shell/hush.c index 179155f66..c970d9097 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -6466,17 +6466,16 @@ static arith_t expand_and_evaluate_arith(const char *arg, const char **errmsg_p) /* ${var/[/]pattern[/repl]} helpers */ static char *strstr_pattern(char *val, const char *pattern, int *size) { - if (!strpbrk(pattern, "*?[\\")) { + int sz = strcspn(pattern, "*?[\\"); + if (pattern[sz] == '\0') { /* Optimization for trivial patterns. * Testcase for very slow replace (performs about 22k replaces): * x=:::::::::::::::::::::: * x=$x$x;x=$x$x;x=$x$x;x=$x$x;x=$x$x;x=$x$x;x=$x$x;x=$x$x;x=$x$x;x=$x$x;echo ${#x} * echo "${x//:/|}" */ - char *found = strstr(val, pattern); - if (found) - *size = strlen(pattern); - return found; + *size = sz; + return strstr(val, pattern); } while (1) { |