Merge branch 'maint'
[paraslash.git] / write_common.c
index 71b6664..cdb67e5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006-2011 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2006 Andre Noll <maan@tuebingen.mpg.de>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -7,7 +7,6 @@
 /** \file write_common.c common functions of para_audiod and para_write */
 
 #include <regex.h>
-#include <stdbool.h>
 
 #include "para.h"
 #include "string.h"
@@ -17,6 +16,7 @@
 #include "buffer_tree.h"
 #include "write.h"
 #include "error.h"
+#include "write_common.h"
 
 /** the array containing the names of all supported writers */
 const char *writer_names[] ={WRITER_NAMES};
@@ -51,25 +51,46 @@ void writer_init(void)
  */
 void *check_writer_arg_or_die(const char *wa, int *writer_num)
 {
-       int i;
-
+       int i, ret, argc;
+       const char *cmdline;
+       char **argv;
+       void *conf;
+
+       if (!wa || !*wa) {
+               i = DEFAULT_WRITER;
+               cmdline = NULL;
+               goto check;
+       }
        PARA_INFO_LOG("checking %s\n", wa);
        FOR_EACH_WRITER(i) {
                const char *name = writer_names[i];
                size_t len = strlen(name);
                char c;
+
                if (strlen(wa) < len)
                        continue;
                if (strncmp(name, wa, len))
                        continue;
                c = wa[len];
-               if (c && c != ' ')
-                       continue;
-               *writer_num = i;
-               return writers[i].parse_config_or_die(c? wa + len + 1 : "");
+               if (!c || c == ' ') {
+                       cmdline = c? wa + len + 1 : NULL;
+                       goto check;
+               }
        }
        PARA_EMERG_LOG("invalid writer %s\n", wa);
        exit(EXIT_FAILURE);
+check:
+       ret = create_shifted_argv(cmdline, " \t", &argv);
+       if (ret < 0) {
+               PARA_EMERG_LOG("%s: %s\n", wa, para_strerror(-ret));
+               exit(EXIT_FAILURE);
+       }
+       argc = ret;
+       argv[0] = make_message("%s_write", writer_names[i]);
+       *writer_num = i;
+       conf = writers[i].parse_config_or_die(argc, argv);
+       free_argv(argv);
+       return conf;
 }
 
 /**
@@ -86,38 +107,39 @@ void register_writer_node(struct writer_node *wn, struct btr_node *parent,
                struct sched *s)
 {
        struct writer *w = writers + wn->writer_num;
-       char *name = make_message("%s writer", writer_names[wn->writer_num]);
 
        wn->btrn = btr_new_node(&(struct btr_node_description)
-               EMBRACE(.name = name, .parent = parent,
+               EMBRACE(.name = writer_names[wn->writer_num], .parent = parent,
                .handler = w->execute, .context = wn));
-       strcpy(wn->task.status, name);
-       free(name);
-       wn->task.post_select = w->post_select;
-       wn->task.pre_select = w->pre_select;
-       register_task(s, &wn->task);
+       wn->task = task_register(&(struct task_info) {
+               .name = writer_names[wn->writer_num],
+               .pre_select = w->pre_select,
+               .post_select = w->post_select,
+               .context = wn,
+       }, s);
 }
 
 /**
  * Print the help text of all writers to stdout.
  *
- * \param detailed Whether to print the detailed help text.
+ * \param flags Passed to \ref ggo_print_help().
  */
-void print_writer_helps(int detailed)
+void print_writer_helps(unsigned flags)
 {
        int i;
 
-       printf_or_die("\nAvailable writers: \n\t");
+       printf_or_die("\nAvailable writers: ");
        FOR_EACH_WRITER(i)
                printf_or_die("%s%s", i? " " : "", writer_names[i]);
-       printf_or_die("\n\n");
+       printf_or_die("\n");
        FOR_EACH_WRITER(i) {
                struct writer *w = writers + i;
 
                if (!w->help.short_help)
                        continue;
-               printf_or_die("Options for %s:\n", writer_names[i]);
-               ggo_print_help(&w->help, detailed);
+               printf_or_die("\n%s: %s", writer_names[i],
+                       w->help.purpose);
+               ggo_print_help(&w->help, flags);
        }
 }