summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libshell/fnmatch.c
diff options
context:
space:
mode:
authorGuillaume Cottenceau <gc@mandriva.com>2001-05-14 13:47:49 +0000
committerGuillaume Cottenceau <gc@mandriva.com>2001-05-14 13:47:49 +0000
commitf15aa3a552022743398a652165d76bf912c715e5 (patch)
treeb58f8b4c47fc571fbb498d83a4bd4fca226ac6c4 /mdk-stage1/dietlibc/libshell/fnmatch.c
parent189b01c358a1181ddc951adba97a0258d5fc2cf1 (diff)
downloaddrakx-f15aa3a552022743398a652165d76bf912c715e5.tar
drakx-f15aa3a552022743398a652165d76bf912c715e5.tar.gz
drakx-f15aa3a552022743398a652165d76bf912c715e5.tar.bz2
drakx-f15aa3a552022743398a652165d76bf912c715e5.tar.xz
drakx-f15aa3a552022743398a652165d76bf912c715e5.zip
Initial revision
Diffstat (limited to 'mdk-stage1/dietlibc/libshell/fnmatch.c')
-rw-r--r--mdk-stage1/dietlibc/libshell/fnmatch.c74
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;
+}