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