
/*
 *  NEWWILDCMP.C
 *
 *  (c)Copyright 1987 Matthew Dillon, All Rights Reserved.
 *
 *  Compare a wild card name with a normal name
 *
 *  This function replaces wildcmp() in SUP32.LIB (as not everybody will
 *  have the latest SUP32.LIB).  The only difference is that this call
 *  is case insensitive.  Later releases of SUP32.LIB will fix the
 *  case-sensitive bug.
 */

#define MAXB   8

newwildcmp(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:
	    c1 = *n;
	    c2 = *w;
	    if (c1 >= 'A' && c1 <= 'Z')     /*  to lower case */
		c1 |= 0x20;
	    if (c2 >= 'A' && c2 <= 'Z')
		c2 |= 0x20;
	    if (c1 != c2) {
		if (bi)
		    goto goback;
		return (0);
	    }
	    break;
	}
	if (*n)  ++n;
	if (*w)  ++w;
    }
    return (1);
}


