unregister_task(): Set error status to E_TASK_UNREGISTERED
[paraslash.git] / filter.c
index 68c97b45671f64edae5e1b2ef94ed4ddc59fa81e..81d5df1a635044e61ee66aba03eca876c8bee398 100644 (file)
--- a/filter.c
+++ b/filter.c
@@ -41,11 +41,13 @@ INIT_STDERR_LOGGING(conf.loglevel_arg);
 
 static void open_filters(void)
 {
+       int i;
        struct filter_node *fn;
 
-       list_for_each_entry(fn, &fc->filters, node) {
-               fn->filter->open(fn);
-               PARA_INFO_LOG("opened %s filter\n", fn->filter->name);
+       FOR_EACH_FILTER_NODE(fn, fc, i) {
+               struct filter *f = filters + fn->filter_num;
+               f->open(fn);
+               PARA_INFO_LOG("opened %s filter\n", f->name);
                fc->outbuf = fn->buf;
                fc->out_loaded = &fn->loaded;
        }
@@ -53,11 +55,13 @@ static void open_filters(void)
 
 static int init_filter_chain(void)
 {
-       int i, filter_num;
+       int i, ret;
        struct filter_node *fn;
 
-       INIT_LIST_HEAD(&fc->filters);
-
+       if (!conf.filter_given)
+               return -E_NO_FILTERS;
+       fc->num_filters = conf.filter_given;
+       fc->filter_nodes = para_malloc(fc->num_filters * sizeof(struct filter_node));
        fc->inbuf = sit->buf;
        fc->in_loaded = &sit->loaded;
        fc->input_error = &sit->task.error;
@@ -66,22 +70,17 @@ static int init_filter_chain(void)
        fc->task.pre_select = filter_pre_select;
        sprintf(fc->task.status, "filter chain");
 
-       for (i = 0; i < conf.filter_given; i++) {
+       FOR_EACH_FILTER_NODE(fn, fc, i) {
                char *fa = conf.filter_arg[i];
-               fn = para_calloc(sizeof(struct filter_node));
-               filter_num = check_filter_arg(fa, &fn->conf);
-               if (filter_num < 0) {
-                       free(fn);
-                       return filter_num;
-               }
+               fn = fc->filter_nodes + i;
+               ret = check_filter_arg(fa, &fn->conf);
+               if (ret < 0)
+                       return ret;
+               fn->filter_num = ret;
                fn->fc = fc;
                INIT_LIST_HEAD(&fn->callbacks);
-               fn->filter = &filters[filter_num];
-               PARA_DEBUG_LOG("adding %s to filter chain\n", fn->filter->name);
-               list_add_tail(&fn->node, &fc->filters);
+               PARA_DEBUG_LOG("filter #%d: %s\n", i, filters[fn->filter_num].name);
        }
-       if (list_empty(&fc->filters))
-               return -E_NO_FILTERS;
        open_filters();
        return 1;
 }