+ const static_str_t *field = query_field_for_id(query, cond->field);
+ debug("running condition: \"%s\" %s %s\"%s\"",
+ field->str, condition_names[cond->condition],
+ cond->case_sensitive ? "" : "(alternative) ",
+ cond->value.str ? cond->value.str : "(none)");
+ switch (cond->condition) {
+ case MATCH_EQUAL:
+ case MATCH_DIFFER:
+ if (field == NULL || field->str == NULL) {
+ return cond->condition != MATCH_DIFFER;
+ }
+ if (cond->case_sensitive) {
+ return !!((strcmp(field->str, cond->value.str) == 0)
+ ^ (cond->condition == MATCH_DIFFER));
+ } else {
+ return !!((ascii_strcasecmp(field->str, cond->value.str) == 0)
+ ^ (cond->condition == MATCH_DIFFER));
+ }
+ break;
+
+ case MATCH_CONTAINS:
+ if (field == NULL || field->str == NULL) {
+ return false;
+ }
+ if (cond->case_sensitive) {
+ return strstr(field->str, cond->value.str);
+ } else {
+ return m_stristrn(field->str, cond->value.str, cond->value.len);
+ }
+ break;
+
+ case MATCH_CONTAINED:
+ if (field == NULL || field->str == NULL) {
+ return false;
+ }
+ if (cond->case_sensitive) {
+ return strstr(cond->value.str, field->str);
+ } else {
+ return m_stristr(cond->value.str, field->str);
+ }
+ break;
+
+ case MATCH_EMPTY:
+ return !!((field == NULL || field->len == 0) ^ (!cond->case_sensitive));
+
+ default:
+ assert(false && "invalid condition type");
+ }