summaryrefslogtreecommitdiff
path: root/shell/ash.c
diff options
context:
space:
mode:
authorDenys Vlasenko2021-07-25 21:54:14 +0200
committerDenys Vlasenko2021-07-25 21:54:14 +0200
commit53d45c934f54b7931cc736eba42903cb1f6d4632 (patch)
tree3d8a0ace7cb92842a91763506ba558d2082337f7 /shell/ash.c
parent1310d7b1d106d7ab0ec84ce88c12302cca934230 (diff)
downloadbusybox-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.c17
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) {