
/*BREAKUP wildcmp.c */
/*
 * Compare a wild card name with a normal name
 */

#define MAXB   8


wildcmp(wild, name)
char *wild, *name;
{
    register char *w = wild;
    register char *n = name;
    char *back[MAXB][2];
    register short bi = 0;
    register char c1, c2;

    while (*n || *w) {
	switch (*w) {
	case '*':
	    if (bi == MAXB) {
		puts ("Too many levels of '*'");
		return (0);
	    }
	    back[bi][0] = w;
	    back[bi][1] = n;
	    ++bi;
	    ++w;
	    continue;
goback:
	    --bi;
	    while (bi >= 0 && *back[bi][1] == '\0')
		--bi;
	    if (bi < 0)
		return (0);
	    w = back[bi][0] + 1;
	    n = ++back[bi][1];
	    ++bi;
	    continue;
	case '?':
	    if (!*n) {
		if (bi)
		    goto goback;
		return (0);
	    }
	    break;
	default:
	    if ((c1 = *n) >= 'A' && c1 <= 'Z')
		c1 |= 0x20;
	    if ((c2 = *w) >= 'A' && c2 <= 'Z')
		c2 |= 0x20;
	    if (c1 != c2) {
		if (bi)
		    goto goback;
		return (0);
	    }
	    break;
	}
	if (*n)  ++n;
	if (*w)  ++w;
    }
    return (1);
}


