+void init_supported_writers(void)
+{
+ int i;
+
+ FOR_EACH_WRITER(i)
+ writers[i].init(&writers[i]);
+}
+
+int check_writer_arg(const char *arg)
+{
+ int i, ret = -E_PLAY_SYNTAX;
+ char *a = para_strdup(arg), *p = strchr(a, ':');
+ if (p)
+ *p = '\0';
+ p++;
+ FOR_EACH_WRITER(i) {
+ if (strcmp(writer_names[i], a))
+ continue;
+ ret = i;
+ goto out;
+ }
+out:
+ free(a);
+ return ret;
+}
+
+struct writer_node_group *setup_default_wng(void)
+{
+ struct writer_node_group *wng = wng_new(1);
+ enum writer_enum default_writer;
+
+ if (NUM_SUPPORTED_WRITERS == 1)
+ default_writer = FILE_WRITE;
+ else
+ default_writer = 1;
+ wng->writer_nodes[0].writer = &writers[default_writer];
+ PARA_INFO_LOG("using default writer: %s\n",
+ writer_names[default_writer]);
+ return wng;
+}
+
+/* write.c */
+
+struct writer_node_group *check_args(void)
+{
+ int i, ret = -E_PLAY_SYNTAX;
+ static struct timeval tv;
+ struct writer_node_group *wng = NULL;
+
+ if (conf.list_writers_given) {
+ char *msg = NULL;
+ FOR_EACH_WRITER(i) {
+ char *tmp = make_message("%s%s%s",
+ i? msg : "",
+ i? " " : "",
+ writer_names[i]);
+ free(msg);
+ msg = tmp;
+ }
+ fprintf(stderr, "%s\n", msg);
+ free(msg);
+ exit(EXIT_SUCCESS);
+ }
+ if (conf.prebuffer_arg < 0 || conf.prebuffer_arg > 100)
+ goto out;
+ if (conf.start_time_given) {
+ long unsigned sec, usec;
+ if (sscanf(conf.start_time_arg, "%lu:%lu",
+ &sec, &usec) != 2)
+ goto out;
+ tv.tv_sec = sec;
+ tv.tv_usec = usec;
+ start_time = &tv;
+ }
+ if (!conf.writer_given) {
+ wng = setup_default_wng();
+ ret = 1;
+ goto out;
+ }
+ wng = wng_new(conf.writer_given);
+ for (i = 0; i < conf.writer_given; i++) {
+ ret = check_writer_arg(conf.writer_arg[i]);
+ if (ret < 0)
+ goto out;
+ wng->writer_nodes[i].writer = &writers[ret];
+ }
+ ret = 1;
+out:
+ if (ret > 0)
+ return wng;
+ free(wng);
+ return NULL;
+}
+