Petr Machata c662835
Index: read.c
Petr Machata c662835
===================================================================
Petr Machata c662835
RCS file: /sources/make/make/read.c,v
Petr Machata c662835
retrieving revision 1.198
Petr Machata c662835
retrieving revision 1.200
Petr Machata c662835
diff -u -r1.198 -r1.200
Petr Machata c662835
--- read.c	29 Apr 2011 15:27:39 -0000	1.198
Petr Machata c662835
+++ read.c	7 May 2011 14:36:12 -0000	1.200
Petr Machata c662835
@@ -2901,6 +2901,7 @@
Petr Machata c662835
       const char *name;
Petr Machata c662835
       const char **nlist = 0;
Petr Machata c662835
       char *tildep = 0;
Petr Machata c662835
+      int globme = 1;
Petr Machata c662835
 #ifndef NO_ARCHIVES
Petr Machata c662835
       char *arname = 0;
Petr Machata c662835
       char *memname = 0;
Petr Machata c662835
@@ -3109,32 +3110,40 @@
Petr Machata c662835
 	}
Petr Machata c662835
 #endif /* !NO_ARCHIVES */
Petr Machata c662835
 
Petr Machata c662835
-      switch (glob (name, GLOB_NOSORT|GLOB_ALTDIRFUNC, NULL, &gl))
Petr Machata c662835
-	{
Petr Machata c662835
-	case GLOB_NOSPACE:
Petr Machata c662835
-	  fatal (NILF, _("virtual memory exhausted"));
Petr Machata c662835
-
Petr Machata c662835
-	case 0:
Petr Machata c662835
-          /* Success.  */
Petr Machata c662835
-          i = gl.gl_pathc;
Petr Machata c662835
-          nlist = (const char **)gl.gl_pathv;
Petr Machata c662835
-          break;
Petr Machata c662835
-
Petr Machata c662835
-        case GLOB_NOMATCH:
Petr Machata c662835
-          /* If we want only existing items, skip this one.  */
Petr Machata c662835
-          if (flags & PARSEFS_EXISTS)
Petr Machata c662835
-            {
Petr Machata c662835
-              i = 0;
Petr Machata c662835
-              break;
Petr Machata c662835
-            }
Petr Machata c662835
-          /* FALLTHROUGH */
Petr Machata c662835
-
Petr Machata c662835
-	default:
Petr Machata c662835
-          /* By default keep this name.  */
Petr Machata c662835
+      /* glob() is expensive: don't call it unless we need to.  */
Petr Machata c662835
+      if (!(flags & PARSEFS_EXISTS) && strpbrk (name, "?*[") == NULL)
Petr Machata c662835
+        {
Petr Machata c662835
+          globme = 0;
Petr Machata c662835
           i = 1;
Petr Machata c662835
           nlist = &nam;;
Petr Machata c662835
-          break;
Petr Machata c662835
-	}
Petr Machata c662835
+        }
Petr Machata c662835
+      else
Petr Machata c662835
+        switch (glob (name, GLOB_NOSORT|GLOB_ALTDIRFUNC, NULL, &gl))
Petr Machata c662835
+          {
Petr Machata c662835
+          case GLOB_NOSPACE:
Petr Machata c662835
+            fatal (NILF, _("virtual memory exhausted"));
Petr Machata c662835
+
Petr Machata c662835
+          case 0:
Petr Machata c662835
+            /* Success.  */
Petr Machata c662835
+            i = gl.gl_pathc;
Petr Machata c662835
+            nlist = (const char **)gl.gl_pathv;
Petr Machata c662835
+            break;
Petr Machata c662835
+
Petr Machata c662835
+          case GLOB_NOMATCH:
Petr Machata c662835
+            /* If we want only existing items, skip this one.  */
Petr Machata c662835
+            if (flags & PARSEFS_EXISTS)
Petr Machata c662835
+              {
Petr Machata c662835
+                i = 0;
Petr Machata c662835
+                break;
Petr Machata c662835
+              }
Petr Machata c662835
+            /* FALLTHROUGH */
Petr Machata c662835
+
Petr Machata c662835
+          default:
Petr Machata c662835
+            /* By default keep this name.  */
Petr Machata c662835
+            i = 1;
Petr Machata c662835
+            nlist = &nam;;
Petr Machata c662835
+            break;
Petr Machata c662835
+          }
Petr Machata c662835
 
Petr Machata c662835
       /* For each matched element, add it to the list.  */
Petr Machata c662835
       while (i-- > 0)
Petr Machata c662835
@@ -3174,7 +3183,8 @@
Petr Machata c662835
 #endif /* !NO_ARCHIVES */
Petr Machata c662835
           NEWELT (concat (2, prefix, nlist[i]));
Petr Machata c662835
 
Petr Machata c662835
-      globfree (&gl);
Petr Machata c662835
+      if (globme)
Petr Machata c662835
+        globfree (&gl);
Petr Machata c662835
 
Petr Machata c662835
 #ifndef NO_ARCHIVES
Petr Machata c662835
       if (arname)
Petr Machata c662835
Index: tests/scripts/functions/wildcard
Petr Machata c662835
===================================================================
Petr Machata c662835
RCS file: /sources/make/make/tests/scripts/functions/wildcard,v
Petr Machata c662835
retrieving revision 1.6
Petr Machata c662835
retrieving revision 1.7
Petr Machata c662835
diff -u -r1.6 -r1.7
Petr Machata c662835
--- tests/scripts/functions/wildcard	13 Jun 2009 21:21:49 -0000	1.6
Petr Machata c662835
+++ tests/scripts/functions/wildcard	7 May 2011 14:36:11 -0000	1.7
Petr Machata c662835
@@ -88,4 +88,16 @@
Petr Machata c662835
 !,
Petr Machata c662835
               '', "\n");
Petr Machata c662835
 
Petr Machata c662835
+# TEST #5: wildcard used to verify file existence
Petr Machata c662835
+
Petr Machata c662835
+touch('xxx.yyy');
Petr Machata c662835
+
Petr Machata c662835
+run_make_test(q!exists: ; @echo file=$(wildcard xxx.yyy)!,
Petr Machata c662835
+              '', "file=xxx.yyy\n");
Petr Machata c662835
+
Petr Machata c662835
+unlink('xxx.yyy');
Petr Machata c662835
+
Petr Machata c662835
+run_make_test(q!exists: ; @echo file=$(wildcard xxx.yyy)!,
Petr Machata c662835
+              '', "file=\n");
Petr Machata c662835
+
Petr Machata c662835
 1;