summaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2025-08-07 02:46:04 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2025-08-07 02:46:04 +0200
commit34948f18587979bee89c13267f45b2333721ca6e (patch)
tree91693a82f03471faa7e950000fd4a7b68d9607f5 /shell
parentabab146b8268288d8b49503cf61b4364a0f82b6b (diff)
hush: smarter optimization for not-globbing [ and [[
function old new delta o_save_ptr 176 167 -9 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell')
-rw-r--r--shell/hush.c60
1 files changed, 23 insertions, 37 deletions
diff --git a/shell/hush.c b/shell/hush.c
index 0b8da5e2d..2cceef25a 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -3386,24 +3386,6 @@ static int o_get_last_ptr(o_string *o, int n)
/* Helper */
static int glob_needed(const char *s)
{
-# if ENABLE_HUSH_NEED_FOR_SPEED
- char c = *s;
- if (c == '[' /*|| c == '{'*/) {
- /* Special-case words consisting entirely of [.
- * Optimization to avoid glob()
- * on "[ COND ]" and "[[ COND ]]":
- * strace hush -c 'i=0; while [ $((++i)) != 50000 ]; do :; done'
- * shouldn't be doing 50000 stat("[").
- * (Can do it for "{" too, but it's not a common case).
- */
- const char *p = s;
- while (*++p == c)
- continue;
- if (*p == '\0')
- return 0;
- }
-# endif
-
while (*s) {
if (*s == '\\') {
if (!s[1])
@@ -3411,7 +3393,19 @@ static int glob_needed(const char *s)
s += 2;
continue;
}
- if (*s == '*' || *s == '[' || *s == '?' || *s == '{')
+ if (*s == '*' || *s == '?')
+ return 1;
+ /* Only force glob if "..[..].." detected.
+ * Not merely "[", "[[", "][" etc.
+ * Optimization to avoid glob()
+ * on "[ COND ]" and "[[ COND ]]":
+ * strace hush -c 'i=0; while [ $((++i)) != 50000 ]; do :; done'
+ * shouldn't be doing 50000 stat("[").
+ * (Can do it for "{" too, but it's not a common case).
+ */
+ if (*s == '[' && strchr(s+1, ']'))
+ return 1;
+ if (*s == '{' /* && strchr(s+1, '}')*/)
return 1;
s++;
}
@@ -3595,23 +3589,6 @@ static int perform_glob(o_string *o, int n)
/* Helper */
static int glob_needed(const char *s)
{
-# if ENABLE_HUSH_NEED_FOR_SPEED
- char c = *s;
- if (c == '[') {
- /* Special-case words consisting entirely of [.
- * Optimization to avoid glob()
- * on "[ COND ]" and "[[ COND ]]":
- * strace hush -c 'i=0; while [ $((++i)) != 50000 ]; do :; done'
- * shouldn't be doing 50000 stat("[").
- */
- const char *p = s;
- while (*++p == c)
- continue;
- if (*p == '\0')
- return 0;
- }
-# endif
-
while (*s) {
if (*s == '\\') {
if (!s[1])
@@ -3619,7 +3596,16 @@ static int glob_needed(const char *s)
s += 2;
continue;
}
- if (*s == '*' || *s == '[' || *s == '?')
+ if (*s == '*' || *s == '?')
+ return 1;
+ /* Only force glob if "..[..].." detected.
+ * Not merely "[", "[[", "][" etc.
+ * Optimization to avoid glob()
+ * on "[ COND ]" and "[[ COND ]]":
+ * strace hush -c 'i=0; while [ $((++i)) != 50000 ]; do :; done'
+ * shouldn't be doing 50000 stat("[").
+ */
+ if (*s == '[' && strchr(s+1, ']'))
return 1;
s++;
}