/*
 *  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'));
}
