ash: if using libc glob(), skip it if no metachars are in word

This saves making tons of pointless stat() calls

function                                             old     new   delta
expandarg                                            888     921     +33

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2016-10-30 18:41:01 +01:00
parent 474ed06c39
commit d4f3db9427

View File

@ -7047,6 +7047,21 @@ expandmeta(struct strlist *str /*, int flag*/)
if (fflag) if (fflag)
goto nometa; goto nometa;
/* Avoid glob() (and thus, stat() et al) for words like "echo" */
p = str->text;
while (*p) {
if (*p == '*')
goto need_glob;
if (*p == '?')
goto need_glob;
if (*p == '[')
goto need_glob;
p++;
}
goto nometa;
need_glob:
INT_OFF; INT_OFF;
p = preglob(str->text, RMESCAPE_ALLOC | RMESCAPE_HEAP); p = preglob(str->text, RMESCAPE_ALLOC | RMESCAPE_HEAP);
// GLOB_NOMAGIC (GNU): if no *?[ chars in pattern, return it even if no match // GLOB_NOMAGIC (GNU): if no *?[ chars in pattern, return it even if no match