diff --git a/src/event.c b/src/event.c index a76d70eb..ad06a950 100644 --- a/src/event.c +++ b/src/event.c @@ -222,7 +222,7 @@ static event_t *event_new(const char *trigger) { /* subsystem functions */ static inline void _try_event(event_registration_t *er, event_t *event) { /* er is already locked */ - if (strcmp(er->trigger, event->trigger) != 0) + if (!util_is_in_list(er->trigger, event->trigger)) return; if (er->emit) diff --git a/src/util_string.c b/src/util_string.c index 7fa4cd09..6e8869db 100644 --- a/src/util_string.c +++ b/src/util_string.c @@ -309,3 +309,36 @@ int util_strtolower(char *str) return 0; } + +bool util_is_in_list(const char *list, const char *needle) +{ + while (*list) { + const char *t = needle; + bool positive = true; + + for (; *list == ','; list++); + + for (; *list == '!'; list++) + positive = !positive; + + for (; *list; list++) { + if (*list == ',') + break; + if (*list == '*') + return positive; + + if (*list == *t) { + t++; + } else { + break; + } + } + if ((*list == 0 || *list == ',') && *t == 0) { + return positive; + } + + for (; *list && *list != ','; list++); + } + + return false; +} diff --git a/src/util_string.h b/src/util_string.h index d4d2d479..695c9a07 100644 --- a/src/util_string.h +++ b/src/util_string.h @@ -34,4 +34,7 @@ int util_replace_string(char **dst, const char *src); bool util_replace_string_url_escape(char **dst, const char *src); /* returns true on success */ int util_strtolower(char *str); +/* Supports wildcards, supports negatives matches. */ +bool util_is_in_list(const char *list, const char *needle); + #endif /* __UTIL_STRING_H__ */