Avoid invoking glob() unless the filename has potential globbing

characters in it, for performance improvements.
This commit is contained in:
Paul Smith 2011-05-02 00:18:06 +00:00
parent 15a79d723d
commit a81ee5209b
2 changed files with 41 additions and 25 deletions

View file

@ -1,3 +1,9 @@
2011-05-01 Paul Smith <psmith@gnu.org>
* read.c (parse_file_seq): Don't try to invoke glob() unless there
are potential wildcard characters in the filename. Performance
enhancement suggested by Michael Meeks <michael.meeks@novell.com>
2011-04-29 Boris Kolpackov <boris@codesynthesis.com>
* read.c (eval_makefile): Delay caching of the file name until after

60
read.c
View file

@ -2901,6 +2901,7 @@ parse_file_seq (char **stringp, unsigned int size, int stopchar,
const char *name;
const char **nlist = 0;
char *tildep = 0;
int globme = 1;
#ifndef NO_ARCHIVES
char *arname = 0;
char *memname = 0;
@ -3109,32 +3110,40 @@ parse_file_seq (char **stringp, unsigned int size, int stopchar,
}
#endif /* !NO_ARCHIVES */
switch (glob (name, GLOB_NOSORT|GLOB_ALTDIRFUNC, NULL, &gl))
{
case GLOB_NOSPACE:
fatal (NILF, _("virtual memory exhausted"));
case 0:
/* Success. */
i = gl.gl_pathc;
nlist = (const char **)gl.gl_pathv;
break;
case GLOB_NOMATCH:
/* If we want only existing items, skip this one. */
if (flags & PARSEFS_EXISTS)
{
i = 0;
break;
}
/* FALLTHROUGH */
default:
/* By default keep this name. */
/* glob() is expensive: don't call it unless we need to. */
if (!(flags & PARSEFS_EXISTS) || strpbrk (name, "?*[") == NULL)
{
globme = 0;
i = 1;
nlist = &name;
break;
}
}
else
switch (glob (name, GLOB_NOSORT|GLOB_ALTDIRFUNC, NULL, &gl))
{
case GLOB_NOSPACE:
fatal (NILF, _("virtual memory exhausted"));
case 0:
/* Success. */
i = gl.gl_pathc;
nlist = (const char **)gl.gl_pathv;
break;
case GLOB_NOMATCH:
/* If we want only existing items, skip this one. */
if (flags & PARSEFS_EXISTS)
{
i = 0;
break;
}
/* FALLTHROUGH */
default:
/* By default keep this name. */
i = 1;
nlist = &name;
break;
}
/* For each matched element, add it to the list. */
while (i-- > 0)
@ -3174,7 +3183,8 @@ parse_file_seq (char **stringp, unsigned int size, int stopchar,
#endif /* !NO_ARCHIVES */
NEWELT (concat (2, prefix, nlist[i]));
globfree (&gl);
if (globme)
globfree (&gl);
#ifndef NO_ARCHIVES
if (arname)