rem: return ABORT;
add: return ABORT_ALL;
context: static int domatch(const char *p, const char *text){    int matched, special;    char ch, prev;    for ( ; (ch = *p) != '\0'; text++, p++) {	if (*text == '\0' && ch != '*')	    return FALSE;	switch (ch) {	  case '\\':	    /* Literal match with following character.  Note that the test	     * in "default" handles the p[1] == '\0' failure case. */	    ch = *++p;	    /* FALLTHROUGH */	  default:	    if (*text != ch)		return FALSE;	    continue;	  case '?':	    /* Match anything but '/'. */	    if (*text == '/')		return FALSE;	    continue;	  case '*':	    if (*++p == '*') {		while (*++p == '*') {}		special = TRUE;	    }	    else		special = FALSE;	    if (*p == '\0') {		/* Trailing "**" matches everything.  Trailing "*" matches		 * only if there are no more slash characters. */		return special? TRUE : strchr(text, '/') == 0;	    }	    for ( ; *text; text++) {		if ((matched = domatch(p, text)) != FALSE)		    return matched;		if (!special && *text == '/')		    return FALSE;	    }	    return ABORT;	  case '[':	    special = *++p == NEGATE_CLASS ? TRUE : FALSE;	    if (special) {		/* Inverted character class. */		p++;	    }	    prev = 0;	    matched = FALSE;	    ch = *p;	    if (ch == ']' || ch == '-') {		if (*text == ch)		    matched = TRUE;		prev = ch;		ch = *++p;	    }	    for ( ; ch != ']'; prev = ch, ch = *++p) {		if (!ch)		    return FALSE;		if (ch == '-' && prev && p[1] && p[1] != ']') {		    if (*text <= *++p && *text >= prev)			matched = TRUE;		    ch = 0; /* This makes "prev" get set to 0. */		}		else if (*text == ch)		    matched = TRUE;	    }	    if (matched == special)		return FALSE;	    continue;	}    }    return *text == '\0';}