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


