# --- SDE-COPYRIGHT-NOTE-BEGIN --- # This copyright note is auto-generated by ./scripts/Create-CopyPatch. # # Filename: package/.../make/make-3.82-0004-improve-glob-speed.patch # Copyright (C) 2012 The OpenSDE Project # # More information can be found in the files COPYING and README. # # This patch file is dual-licensed. It is available under the license the # patched project is licensed under, as long as it is an OpenSource license # as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms # of the GNU General Public License as published by the Free Software # Foundation; either version 2 of the License, or (at your option) any later # version. # --- SDE-COPYRIGHT-NOTE-END --- From b905f2002daaacc62cc5c083ebc6f7ba787a793e Mon Sep 17 00:00:00 2001 From: Christian Wiese Date: Mon, 22 Oct 2012 17:58:00 +0200 Subject: [PATCH] improve glob speed ChangeLog: 2011-05-07 Paul Smith * read.c (parse_file_seq): Ensure existence checks use glob(). 2011-05-01 Paul Smith * 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 tests/Changelog: 2011-05-07 Paul Smith * scripts/functions/wildcard: Verify wildcard used to test for file existence/non-existence. --- read.c | 58 ++++++++++++++++++++++--------------- tests/scripts/functions/wildcard | 12 ++++++++ 2 files changed, 46 insertions(+), 24 deletions(-) diff --git a/read.c b/read.c index 9dfd4ea..8587e85 100644 --- a/read.c +++ b/read.c @@ -2904,6 +2904,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; @@ -3112,32 +3113,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")); + /* glob() is expensive: don't call it unless we need to. */ + if (!(flags & PARSEFS_EXISTS) && strpbrk (name, "?*[") == NULL) + { + globme = 0; + i = 1; + nlist = &name; + } + 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 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 */ + 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; - } + default: + /* By default keep this name. */ + i = 1; + nlist = &name; + break; + } /* For each matched element, add it to the list. */ while (i-- > 0) @@ -3177,7 +3186,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) diff --git a/tests/scripts/functions/wildcard b/tests/scripts/functions/wildcard index 2841f5d..bcd84ad 100644 --- a/tests/scripts/functions/wildcard +++ b/tests/scripts/functions/wildcard @@ -88,4 +88,16 @@ all: ; @echo $(wildcard xz--y*.7) !, '', "\n"); +# TEST #5: wildcard used to verify file existence + +touch('xxx.yyy'); + +run_make_test(q!exists: ; @echo file=$(wildcard xxx.yyy)!, + '', "file=xxx.yyy\n"); + +unlink('xxx.yyy'); + +run_make_test(q!exists: ; @echo file=$(wildcard xxx.yyy)!, + '', "file=\n"); + 1; -- 1.7.2.3