| version 1.10, 1993/11/24 19:43:51 |
version 1.11, 1995/02/27 03:43:06 |
|
|
| |
/* $NetBSD$ */ |
| |
|
| /* |
/* |
| * Copyright (c) 1989, 1993 |
* Copyright (c) 1989, 1993, 1994 |
| * The Regents of the University of California. All rights reserved. |
* The Regents of the University of California. All rights reserved. |
| * |
* |
| * This code is derived from software contributed to Berkeley by |
* This code is derived from software contributed to Berkeley by |
|
|
| */ |
*/ |
| |
|
| #if defined(LIBC_SCCS) && !defined(lint) |
#if defined(LIBC_SCCS) && !defined(lint) |
| /* from: static char sccsid[] = "@(#)fnmatch.c 8.1 (Berkeley) 6/4/93"; */ |
#if 0 |
| static char *rcsid = "$Id$"; |
static char sccsid[] = "@(#)fnmatch.c 8.2 (Berkeley) 4/16/94"; |
| |
#else |
| |
static char rcsid[] = "$NetBSD$"; |
| |
#endif |
| #endif /* LIBC_SCCS and not lint */ |
#endif /* LIBC_SCCS and not lint */ |
| |
|
| /* |
/* |
| Line 53 static const char *rangematch __P((const |
|
| Line 58 static const char *rangematch __P((const |
|
| |
|
| int |
int |
| fnmatch(pattern, string, flags) |
fnmatch(pattern, string, flags) |
| register const char *pattern, *string; |
const char *pattern, *string; |
| int flags; |
int flags; |
| { |
{ |
| const char *stringstart = string; |
const char *stringstart; |
| register char c; |
char c, test; |
| char test; |
|
| |
|
| for (;;) |
for (stringstart = string;;) |
| switch (c = *pattern++) { |
switch (c = *pattern++) { |
| case EOS: |
case EOS: |
| return (*string == EOS ? 0 : FNM_NOMATCH); |
return (*string == EOS ? 0 : FNM_NOMATCH); |
| Line 70 fnmatch(pattern, string, flags) |
|
| Line 74 fnmatch(pattern, string, flags) |
|
| if (*string == '/' && (flags & FNM_PATHNAME)) |
if (*string == '/' && (flags & FNM_PATHNAME)) |
| return (FNM_NOMATCH); |
return (FNM_NOMATCH); |
| if (*string == '.' && (flags & FNM_PERIOD) && |
if (*string == '.' && (flags & FNM_PERIOD) && |
| (string == stringstart || ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) |
(string == stringstart || |
| |
((flags & FNM_PATHNAME) && *(string - 1) == '/'))) |
| return (FNM_NOMATCH); |
return (FNM_NOMATCH); |
| ++string; |
++string; |
| break; |
break; |
| Line 81 fnmatch(pattern, string, flags) |
|
| Line 86 fnmatch(pattern, string, flags) |
|
| c = *++pattern; |
c = *++pattern; |
| |
|
| if (*string == '.' && (flags & FNM_PERIOD) && |
if (*string == '.' && (flags & FNM_PERIOD) && |
| (string == stringstart || ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) |
(string == stringstart || |
| |
((flags & FNM_PATHNAME) && *(string - 1) == '/'))) |
| return (FNM_NOMATCH); |
return (FNM_NOMATCH); |
| |
|
| /* Optimize for pattern with * at end or before /. */ |
/* Optimize for pattern with * at end or before /. */ |
| Line 111 fnmatch(pattern, string, flags) |
|
| Line 117 fnmatch(pattern, string, flags) |
|
| return (FNM_NOMATCH); |
return (FNM_NOMATCH); |
| if (*string == '/' && flags & FNM_PATHNAME) |
if (*string == '/' && flags & FNM_PATHNAME) |
| return (FNM_NOMATCH); |
return (FNM_NOMATCH); |
| if ((pattern = rangematch(pattern, *string, flags)) == NULL) |
if ((pattern = |
| |
rangematch(pattern, *string, flags)) == NULL) |
| return (FNM_NOMATCH); |
return (FNM_NOMATCH); |
| ++string; |
++string; |
| break; |
break; |
| Line 133 fnmatch(pattern, string, flags) |
|
| Line 140 fnmatch(pattern, string, flags) |
|
| |
|
| static const char * |
static const char * |
| rangematch(pattern, test, flags) |
rangematch(pattern, test, flags) |
| register const char *pattern; |
const char *pattern; |
| register int test; |
int test, flags; |
| int flags; |
|
| { |
{ |
| register char c, c2; |
|
| int negate, ok; |
int negate, ok; |
| |
char c, c2; |
| |
|
| /* A bracket expression starting with an unquoted circumflex |
/* |
| |
* A bracket expression starting with an unquoted circumflex |
| * character produces unspecified results (IEEE 1003.2-1992, |
* character produces unspecified results (IEEE 1003.2-1992, |
| * 3.13.2). I have chosen to treat it like '!', for |
* 3.13.2). This implementation treats it like '!', for |
| * consistancy with regular expression syntax. |
* consistency with the regular expression syntax. |
| |
* J.T. Conklin (conklin@ngai.kaleida.com) |
| */ |
*/ |
| if (negate = (*pattern == '!' || *pattern == '^')) { |
if (negate = (*pattern == '!' || *pattern == '^')) |
| pattern++; |
++pattern; |
| } |
|
| |
|
| for (ok = 0; (c = *pattern++) != ']';) { |
for (ok = 0; (c = *pattern++) != ']';) { |
| if (c == '\\' && !(flags & FNM_NOESCAPE)) { |
if (c == '\\' && !(flags & FNM_NOESCAPE)) |
| c = *pattern++; |
c = *pattern++; |
| } |
if (c == EOS) |
| if (c == EOS) { |
|
| return (NULL); |
return (NULL); |
| } |
|
| |
|
| if (*pattern == '-' |
if (*pattern == '-' |
| && (c2 = *(pattern+1)) != EOS && c2 != ']') { |
&& (c2 = *(pattern+1)) != EOS && c2 != ']') { |
| pattern += 2; |
pattern += 2; |
| if (c2 == '\\' && !(flags & FNM_NOESCAPE)) { |
if (c2 == '\\' && !(flags & FNM_NOESCAPE)) |
| c2 = *pattern++; |
c2 = *pattern++; |
| } |
if (c2 == EOS) |
| if (c2 == EOS) { |
|
| return (NULL); |
return (NULL); |
| } |
if (c <= test && test <= c2) |
| |
|
| if (c <= test && test <= c2) { |
|
| ok = 1; |
ok = 1; |
| } |
} else if (c == test) |
| } else if (c == test) { |
|
| ok = 1; |
ok = 1; |
| } |
|
| } |
} |
| |
|
| return (ok == negate ? NULL : pattern); |
return (ok == negate ? NULL : pattern); |
| } |
} |