diff options
author | Denys Vlasenko | 2021-07-25 21:54:14 +0200 |
---|---|---|
committer | Denys Vlasenko | 2021-07-25 21:54:14 +0200 |
commit | 53d45c934f54b7931cc736eba42903cb1f6d4632 (patch) | |
tree | 3d8a0ace7cb92842a91763506ba558d2082337f7 /shell/ash.c | |
parent | 1310d7b1d106d7ab0ec84ce88c12302cca934230 (diff) | |
download | busybox-53d45c934f54b7931cc736eba42903cb1f6d4632.zip busybox-53d45c934f54b7931cc736eba42903cb1f6d4632.tar.gz |
ash: speed up ${v//pattern/repl}
function old new delta
subevalvar 1447 1457 +10
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell/ash.c')
-rw-r--r-- | shell/ash.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/shell/ash.c b/shell/ash.c index 092f3bc..b594714 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -7284,7 +7284,7 @@ subevalvar(char *start, char *str, int strloc, while (idx <= end) { try_to_match: if (no_meta_len == 0) { - /* pattern has meta chars, have to glob; or ENABLE_ASH_OPTIMIZE_FOR_SIZE */ + /* pattern has meta chars, have to glob; or ENABLE_ASH_OPTIMIZE_FOR_SIZE */ loc = scanright(idx, rmesc, rmescend, str, quotes, /*match_at_start:*/ 1); } else { /* Testcase for very slow replace (performs about 22k replaces): @@ -7292,16 +7292,19 @@ subevalvar(char *start, char *str, int strloc, * 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//:/|}" */ - size_t n; if (strncmp(rmesc, str, no_meta_len) != 0) goto no_match; - n = no_meta_len; loc = idx; - do { - if (quotes && (unsigned char)*loc == CTLESC) + if (!quotes) { + loc += no_meta_len; + } else { + size_t n = no_meta_len; + do { + if ((unsigned char)*loc == CTLESC) + loc++; loc++; - loc++; - } while (--n != 0); + } while (--n != 0); + } } //bb_error_msg("scanright('%s'):'%s'", str, loc); if (!loc) { |