diff options
author | Guillaume Cottenceau <gc@mandriva.com> | 2001-05-14 13:47:49 +0000 |
---|---|---|
committer | Guillaume Cottenceau <gc@mandriva.com> | 2001-05-14 13:47:49 +0000 |
commit | f15aa3a552022743398a652165d76bf912c715e5 (patch) | |
tree | b58f8b4c47fc571fbb498d83a4bd4fca226ac6c4 /mdk-stage1/dietlibc/libshell/fnmatch.c | |
parent | 189b01c358a1181ddc951adba97a0258d5fc2cf1 (diff) | |
download | drakx-backup-do-not-use-f15aa3a552022743398a652165d76bf912c715e5.tar drakx-backup-do-not-use-f15aa3a552022743398a652165d76bf912c715e5.tar.gz drakx-backup-do-not-use-f15aa3a552022743398a652165d76bf912c715e5.tar.bz2 drakx-backup-do-not-use-f15aa3a552022743398a652165d76bf912c715e5.tar.xz drakx-backup-do-not-use-f15aa3a552022743398a652165d76bf912c715e5.zip |
Initial revision
Diffstat (limited to 'mdk-stage1/dietlibc/libshell/fnmatch.c')
-rw-r--r-- | mdk-stage1/dietlibc/libshell/fnmatch.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/mdk-stage1/dietlibc/libshell/fnmatch.c b/mdk-stage1/dietlibc/libshell/fnmatch.c new file mode 100644 index 000000000..4e7664510 --- /dev/null +++ b/mdk-stage1/dietlibc/libshell/fnmatch.c @@ -0,0 +1,74 @@ +#include <ctype.h> +#include <fnmatch.h> + +#define NOTFIRST 128 + +static int match(char c,char d,int flags) { + if (flags&FNM_CASEFOLD) + return (tolower(c)==tolower(d)); + else + return (c==d); +} + +int fnmatch(const char *pattern, const char *string, int flags) { + if (*string==0) { + while (*pattern=='*') ++pattern; + return (!!*pattern); + } + if (*string=='.' && *pattern!='.' && (flags&FNM_PERIOD)) { + /* don't match if FNM_PERIOD and this is the first char */ + if ((flags&FNM_PERIOD) && (!(flags&NOTFIRST))) + return 1; + /* don't match if FNM_PERIOD and FNM_FILE_NAME and previous was '/' */ + if ((flags&(FNM_FILE_NAME|FNM_PERIOD)) && string[-1]=='/') + return 1; + } + flags|=NOTFIRST; + switch (*pattern) { + case '[': + ++pattern; + while (*pattern && *pattern!=']') { + if (flags&FNM_PATHNAME || *string!='/') { + int res=0; + if (pattern[1]=='-') { + if (*string>=*pattern && *string<=pattern[2]) res=1; + if (flags&FNM_CASEFOLD) { + if (tolower(*string)>=tolower(*pattern) && tolower(*string)<=tolower(pattern[2])) res=1; + } + } else + res=match(*pattern,*string,flags); + if (res) { + while (*pattern && *pattern!=']') ++pattern; + return fnmatch(pattern+1,string+1,flags); + } + } + ++pattern; + } + break; + case '\\': + if (flags&FNM_NOESCAPE) { + if (*string=='\\') + return fnmatch(pattern+1,string+1,flags); + } else { + if (*string==pattern[1]) + return fnmatch(pattern+2,string+1,flags); + } + break; + case '*': + if (!pattern[1] || fnmatch(pattern+1,string,flags)==0) + return 0; + else + if (*string!='/') + return fnmatch(pattern,string+1,flags); + break; + case 0: + if (*string==0 || (*string=='/' && (flags&FNM_LEADING_DIR))) + return 0; + break; + default: + if (match(*pattern,*string,flags)) + return fnmatch(pattern+1,string+1,flags); + break; + } + return 1; +} |