static y4m2_output *filter__hook(jd_var *stash, const char *name, y4m2_output *out) { (void)stash; jd_var *fp = jd_get_ks(&filters, name, 0); if (!fp) jd_throw("Unknown filter \"%s\"", name); filter *filt = filter__clone(jd_ptr(fp)); filt->ctx = NULL; filt->out = out; jd_set_object(jd_unshift(stash, 1), filt, filter__free_cb); return y4m2_output_next(filter__callback, filt); }
int jdt_throws(void (*func)(void *), void *ctx, const char *want, const char *msg, ...) { va_list ap; int rc = 0; scope { JD_VAR(caught); JD_SV(vwant, want); try { func(ctx); } catch(e) { jd_assign(caught, e); } va_start(ap, msg); rc = _is(jd_get_ks(caught, "message", 0), vwant, msg, ap); va_end(ap); } return rc; }
void filter_register(const char *name, filter *f) { jd_set_object(jd_get_ks(&filters, name, 1), filter__clone(f), jd_free); }