"touch foo; ls foo**" returned no match; from Christos
authorKeith Bostic <bostic@ucbvax.Berkeley.EDU>
Fri, 2 Oct 1992 05:09:13 +0000 (21:09 -0800)
committerKeith Bostic <bostic@ucbvax.Berkeley.EDU>
Fri, 2 Oct 1992 05:09:13 +0000 (21:09 -0800)
SCCS-vsn: lib/libc/gen/glob.c 5.16

usr/src/lib/libc/gen/glob.c

index 72c0107..26bb146 100644 (file)
@@ -9,7 +9,7 @@
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)glob.c     5.15 (Berkeley) %G%";
+static char sccsid[] = "@(#)glob.c     5.16 (Berkeley) %G%";
 #endif /* LIBC_SCCS and not lint */
 
 /*
 #endif /* LIBC_SCCS and not lint */
 
 /*
@@ -175,7 +175,11 @@ glob(pattern, flags, errfunc, pglob)
                        break;
                case STAR:
                        pglob->gl_flags |= GLOB_MAGCHAR;
                        break;
                case STAR:
                        pglob->gl_flags |= GLOB_MAGCHAR;
-                       *bufnext++ = M_ALL;
+                       /* collapse adjacent stars to one, 
+                        * to avoid exponential behavior
+                        */
+                       if (bufnext == patbuf || bufnext[-1] != M_ALL)
+                           *bufnext++ = M_ALL;
                        break;
                default:
                        *bufnext++ = CHAR(c);
                        break;
                default:
                        *bufnext++ = CHAR(c);
@@ -415,9 +419,10 @@ match(name, pat, patend)
                case M_ALL:
                        if (pat == patend)
                                return(1);
                case M_ALL:
                        if (pat == patend)
                                return(1);
-                       for (; *name != EOS; ++name)
-                               if (match(name, pat, patend))
-                                       return(1);
+                       do 
+                           if (match(name, pat, patend))
+                                   return(1);
+                       while (*name++ != EOS);
                        return(0);
                case M_ONE:
                        if (*name++ == EOS)
                        return(0);
                case M_ONE:
                        if (*name++ == EOS)