/* * input: "str" string will attempted to be matched * * "pattern" string with wildcards that will match against "str". * * wild: * '*' = match 0 or more occurances of anything * "[abc]" = match anyof "abc" (ranges supported) * "{xx,yy,zz}" = match anyof "xx", "yy", or "zz" * '?' = match any character */ #define FALSE 0 #define TRUE 1 glob(str,pattern) char *str,*pattern; { char c,*cp; int done=FALSE,ret_code,ok; while ((*pattern != '\0') && (!done) && (((*str=='\0') && ((*pattern=='{') || (*pattern=='*'))) || (*str!='\0'))) { switch (*pattern) { case '*': pattern++; ret_code=FALSE; while ((*str != '\0') && (!(ret_code=glob(str++,pattern)))); if (ret_code) { while (*str != '\0') str++; while (*pattern != '\0') pattern++; } break; case '[': pattern++; repeat: if ((*pattern == '\0') || (*pattern == ']')) { done=TRUE; break; } if (*(pattern+1) == '-') { c = *pattern; pattern+=2; if (*pattern == ']') { done=TRUE; break; } if ((*str < c) || (*str > *pattern)) { pattern++; goto repeat; } } else if (*pattern != *str) { pattern++; goto repeat; } pattern++; while ((*pattern != ']') && (*pattern != '\0')) { pattern++; } if (*pattern != '\0') { pattern++; str++; } break; case '?': pattern++; str++; break; case '{': /*}*/ pattern++; /*{*/ while ((*pattern != '}') && (*pattern!='\0')) { cp = str; ok = TRUE; while (ok && (*cp != '\0') && (*pattern!='\0') && /*{*/ (*pattern!=',') && (*pattern!='}')) { ok=(*pattern == *cp); cp++; pattern++; } if (*pattern=='\0') { ok=FALSE; done=TRUE; break; } else if (ok) { str=cp; /*{*/ while ((*pattern!='}') && (*pattern!='\0')) { pattern++; } } else { /*{*/ while ((*pattern!='}') && (*pattern!=',') && (*pattern!='\0')) { pattern++; } } if (*pattern!='\0') pattern++; } break; default: if (*str == *pattern) { str++; pattern++; } else { done=TRUE; } } } while (*pattern == '*') pattern++; return ((*str == '\0') && (*pattern == '\0')); }