- struct filter_chain *fc = container_of(t, struct filter_chain, task);
- struct filter_node *fn;
- char *ib;
- size_t *loaded;
- int i, conv, conv_total = 0;
-
- if (fc->output_error && *fc->output_error < 0) {
- t->error = *fc->output_error;
- return;
- }
-again:
- ib = *fc->inbufp;
- loaded = fc->in_loaded;
- conv = 0;
- FOR_EACH_FILTER_NODE(fn, fc, i) {
- struct filter *f = filters + fn->filter_num;
- if (fn->loaded < fn->bufsize) {
- size_t size, old_fn_loaded = fn->loaded;
- t->error = f->convert(ib, *loaded, fn);
- if (t->error < 0)
- return;
- size = t->error;
- call_callbacks(fn, ib, size, fn->buf + old_fn_loaded,
- fn->loaded - old_fn_loaded);
- *loaded -= size;
- conv += size + fn->loaded - old_fn_loaded;
- if (*loaded && size)
- memmove(ib, ib + size, *loaded);
- }
- ib = fn->buf;
- loaded = &fn->loaded;
+ int ret, filter_num, argc;
+ char *errctx = NULL, **argv;
+ const struct lls_command *cmd;
+ const struct filter *f;
+
+ ret = create_argv(fa, " \t\n", &argv);
+ if (ret < 0)
+ goto fail;
+ argc = ret;
+ ret = lls(lls_lookup_subcmd(argv[0], filter_cmd_suite, &errctx));
+ if (ret < 0)
+ goto free_argv;
+ filter_num = ret;
+ cmd = FILTER_CMD(filter_num);
+ if (!filter_supported(filter_num)) {
+ ret = -E_UNSUPPORTED_FILTER;
+ errctx = make_message("bad filter name: %s",
+ lls_command_name(cmd));
+ goto free_argv;