Return to BSD News archive
Received: by minnie.vk1xwt.ampr.org with NNTP
id AA1455 ; Tue, 23 Feb 93 14:42:29 EST
Newsgroups: comp.unix.bsd
Path: sserve!manuel.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!elroy.jpl.nasa.gov!sdd.hp.com!caen!batcomputer!cornell!uw-beaver!fluke!gtisqr!rick
From: rick@mav.com (Hendrik Groeneveld)
Subject: [386bsd] patch for /usr/src/lib/libc/gen/fnmatch.c (cvs import broken)
Message-ID: <1993Feb17.170113.10863@mav.com>
Keywords: libc bug
Reply-To: rick@mav.com
Organization: Maverick International, Inc.
Date: Wed, 17 Feb 93 17:01:13 GMT
Lines: 124
While trying to get "cvs import" to work, I found that fnmatch() returned
exactly the opposite of what the man page said it did (and cvs expected).
The patch follows.
*** fnmatch.BOGUS Tue Apr 30 17:35:47 1991
--- fnmatch.c Sat Feb 13 22:56:27 1993
***************
*** 87,97 ****
for (;;)
switch (c = *pattern++) {
case EOS:
! return(*string == EOS);
case '?':
! if ((test = *string++) == EOS ||
! test == '/' && flags & FNM_PATHNAME)
! return(0);
break;
case '*':
c = *pattern;
--- 87,97 ----
for (;;)
switch (c = *pattern++) {
case EOS:
! return(!(*string == EOS));
case '?':
! if (((test = *string++) == EOS) ||
! ((test == '/') && (flags & FNM_PATHNAME)))
! return(1);
break;
case '*':
c = *pattern;
***************
*** 102,131 ****
/* optimize for pattern with * at end or before / */
if (c == EOS)
if (flags & FNM_PATHNAME)
! return(!index(string, '/'));
else
- return(1);
- else if (c == '/' && flags & FNM_PATHNAME) {
- if ((string = index(string, '/')) == NULL)
return(0);
break;
}
/* general case, use recursion */
while ((test = *string) != EOS) {
! if (fnmatch(pattern, string, flags))
! return(1);
if (test == '/' && flags & FNM_PATHNAME)
break;
++string;
}
! return(0);
case '[':
if ((test = *string++) == EOS ||
test == '/' && flags & FNM_PATHNAME)
! return(0);
if ((pattern = rangematch(pattern, test)) == NULL)
! return(0);
break;
case '\\':
if (flags & FNM_QUOTE) {
--- 102,131 ----
/* optimize for pattern with * at end or before / */
if (c == EOS)
if (flags & FNM_PATHNAME)
! return(index(string, '/') != NULL);
else
return(0);
+ else if ((c == '/') && (flags & FNM_PATHNAME)) {
+ if ((string = index(string, '/')) == NULL)
+ return(1);
break;
}
/* general case, use recursion */
while ((test = *string) != EOS) {
! if (!fnmatch(pattern, string, flags))
! return(0);
if (test == '/' && flags & FNM_PATHNAME)
break;
++string;
}
! return(1);
case '[':
if ((test = *string++) == EOS ||
test == '/' && flags & FNM_PATHNAME)
! return(1);
if ((pattern = rangematch(pattern, test)) == NULL)
! return(1);
break;
case '\\':
if (flags & FNM_QUOTE) {
***************
*** 134,146 ****
--pattern;
}
if (c != *string++)
! return(0);
break;
}
/* FALLTHROUGH */
default:
if (c != *string++)
! return(0);
break;
}
}
--- 134,146 ----
--pattern;
}
if (c != *string++)
! return(1);
break;
}
/* FALLTHROUGH */
default:
if (c != *string++)
! return(1);
break;
}
}