void hook_add(char *group, char *event, char *pattern, char *expr, int id) { log_msg("HOOK", "ADD"); log_msg("HOOK", "<%s> %s `%s`", event, pattern, expr); EventHandler *evh = get_event(event_idx(event)); if (!evh) return; expr = strip_quotes(expr); Pattern *pat = NULL; if (pattern) pat = regex_pat_new(pattern); Hook hook = { id, HK_CMD, NULL, NULL, NULL, pat, .data.cmd = expr }; augroup_insert(group, &hook); utarray_push_back(evh->hooks, &hook); } static void hook_delete(EventHandler *evh, Augroup *aug) { for (int i = 0; i < utarray_len(evh->hooks); i++) { Hook *it = (Hook*)utarray_eltptr(evh->hooks, i); if (it->type == HK_CMD && it->aug == aug) { free(it->data.cmd); utarray_erase(evh->hooks, i, 1); } } } void hook_remove(char *group, char *event, char *pattern) { log_msg("HOOK", "REMOVE"); log_msg("HOOK", "<%s> %s `%s`", event, pattern, group); Augroup *aug = NULL; if (group) HASH_FIND_STR(aug_tbl, group, aug); if (event) { EventHandler *evh = get_event(event_idx(event)); if (!evh) return; return hook_delete(evh, aug); } EventHandler *it; for (it = default_events; it != NULL; it = it->hh.next) hook_delete(it, aug); }
static TAG_FREE(Hooks) { hook_delete(tag->any); }