write: Get rid of gengetopt's string parser.
[paraslash.git] / write_common.c
index e6a5eeb77339694439b11d93123591b935f86dac..602f94d893940aae8db06954f493919113eb4b57 100644 (file)
@@ -50,25 +50,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;
 }
 
 /**