|
@@ -6466,6 +6466,19 @@ 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, "*?[\\")) {
|
|
|
+ /* 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;
|
|
|
+ }
|
|
|
+
|
|
|
while (1) {
|
|
|
char *end = scan_and_match(val, pattern, SCAN_MOVE_FROM_RIGHT + SCAN_MATCH_LEFT_HALF);
|
|
|
debug_printf_varexp("val:'%s' pattern:'%s' end:'%s'\n", val, pattern, end);
|