]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - filter_common.c
Consolidate decoder code by introducing prepare_filter_node().
[paraslash.git] / filter_common.c
index 2fa774c0b57e614ec2e7493661d0e589e5c44d58..bc5539d0b842a7f81a735a53918c565d4c785d02 100644 (file)
@@ -6,14 +6,17 @@
 
 /** \file filter_common.c Common helper functions for filter input/output. */
 
+#include <regex.h>
 #include <sys/types.h>
 #include <dirent.h>
+#include <stdbool.h>
 
 #include "para.h"
 #include "list.h"
 #include "sched.h"
 #include "fd.h"
 #include "ggo.h"
+#include "buffer_tree.h"
 #include "filter.h"
 #include "error.h"
 #include "string.h"
@@ -43,7 +46,7 @@ void filter_init(void)
  */
 static void close_filter_callback(struct filter_callback *fcb)
 {
-       PARA_NOTICE_LOG("closing filter_callback %p, data: %p\n", fcb, fcb->data);
+       PARA_NOTICE_LOG("closing filter_callback %p\n", fcb);
        list_del(&fcb->node);
        fcb->close(fcb);
 }
@@ -195,15 +198,18 @@ static int parse_filter_args(int filter_num, char *options, void **conf)
        if (!f->parse_config)
                return strlen(options)? -E_BAD_FILTER_OPTIONS : filter_num;
 //     PARA_DEBUG_LOG("options: %s\n", options);
-       argc = split_args(options, &argv, " \t");
-//             PARA_DEBUG_LOG("argc = %d, argv[0]: %s\n", argc, argv[0]);
+       argc = create_argv(options, " \t", &argv);
+       if (argc < 0)
+               return -E_BAD_FILTER_OPTIONS;
+       PARA_DEBUG_LOG("argc = %d, argv[0]: %s\n", argc, argv[0]);
        for (i = argc - 1; i >= 0; i--)
                argv[i + 1] = argv[i];
        argv[0] = para_strdup(f->name);
-       argc += 1;
+       argc++;
        ret = f->parse_config(argc, argv, conf);
-       free(argv[0]);
-       free(argv);
+       free(argv[argc - 1]);
+       argv[argc - 1] = NULL;
+       free_argv(argv);
        return ret < 0? ret : filter_num;
 }
 
@@ -269,3 +275,23 @@ void print_filter_helps(int detailed)
        }
 
 }
+
+/** 640K ought to be enough for everybody ;) */
+#define FILTER_MAX_PENDING (640 * 1024)
+
+int prepare_filter_node(struct btr_node *btrn, size_t min_len)
+{
+       size_t iqs;
+
+       if (btr_eof(btrn))
+               return -E_FC_EOF;
+       if (btr_bytes_pending(btrn) > FILTER_MAX_PENDING)
+               return 0;
+       iqs = btr_get_input_queue_size(btrn);
+       if (iqs < min_len && !btr_no_parent(btrn))
+               return 0;
+       assert(iqs != 0);
+       /* avoid "buffer too small" errors from the decoder */
+       btr_merge_to(btrn, min_len);
+       return 1;
+}