static bool strfilter_node__compare(struct strfilter_node *self, const char *str) { if (!self || !self->p) return false; switch (*self->p) { case '|': /* */ return strfilter_node__compare(self->l, str) || strfilter_node__compare(self->r, str); case '&': /* */ return strfilter_node__compare(self->l, str) && strfilter_node__compare(self->r, str); case '!': /* */ return !strfilter_node__compare(self->r, str); default: return strglobmatch(str, self->p); } }
static bool strfilter_node__compare(struct strfilter_node *node, const char *str) { if (!node || !node->p) return false; switch (*node->p) { case '|': /* OR */ return strfilter_node__compare(node->l, str) || strfilter_node__compare(node->r, str); case '&': /* AND */ return strfilter_node__compare(node->l, str) && strfilter_node__compare(node->r, str); case '!': /* NOT */ return !strfilter_node__compare(node->r, str); default: return strglobmatch(str, node->p); } }
bool strfilter__compare(struct strfilter *self, const char *str) { if (!self) return false; return strfilter_node__compare(self->root, str); }
/* Return true if STR matches the filter rules */ bool strfilter__compare(struct strfilter *filter, const char *str) { if (!filter) return false; return strfilter_node__compare(filter->root, str); }