pspp: Add --no-output option to allow entirely disabling output.
[pspp] / src / ui / terminal / terminal-opts.c
index 886bcdc2fe86bafcb7b602d0fcef3e0bdbdd4ffc..306ebe1523d5b674e729f44ae8a51acd50eb9b8a 100644 (file)
@@ -38,6 +38,7 @@
 #include "libpspp/version.h"
 #include "output/driver.h"
 #include "output/driver-provider.h"
+#include "output/msglog.h"
 #include "ui/terminal/msg-ui.h"
 #include "ui/terminal/read-line.h"
 
@@ -57,6 +58,7 @@ struct terminal_opts
     struct string_map options;  /* Output driver options. */
     bool has_output_driver;
     bool has_terminal_driver;
+    bool has_error_file;
     bool process_statrc;
   };
 
@@ -66,6 +68,7 @@ enum
     OPT_ERROR_FILE,
     OPT_OUTPUT,
     OPT_OUTPUT_OPTION,
+    OPT_NO_OUTPUT,
     OPT_INTERACTIVE,
     OPT_NO_STATRC,
     OPT_HELP,
@@ -79,6 +82,7 @@ static struct argv_option terminal_argv_options[N_TERMINAL_OPTIONS] =
     {"error-file", 'e', required_argument, OPT_ERROR_FILE},
     {"output", 'o', required_argument, OPT_OUTPUT},
     {NULL, 'O', required_argument, OPT_OUTPUT_OPTION},
+    {"no-output", 0, no_argument, OPT_NO_OUTPUT},
     {"interactive", 'i', no_argument, OPT_INTERACTIVE},
     {"no-statrc", 'r', no_argument, OPT_NO_STATRC},
     {"help", 'h', no_argument, OPT_HELP},
@@ -121,7 +125,7 @@ parse_output_option (struct terminal_opts *to, const char *option)
   key = xmemdup0 (option, equals - option);
   if (string_map_contains (&to->options, key))
     {
-      error (0, 0, _("%s: output option %s specified more than twice"), key);
+      error (0, 0, _("%s: output option specified more than once"), key);
       free (key);
       return;
     }
@@ -193,6 +197,7 @@ Output options:\n\
   -O OPTION=VALUE           set output option to customize previous -o\n\
   -O device={terminal|listing}  override device type for previous -o\n\
   -e, --error-file=FILE     append errors, warnings, and notes to FILE\n\
+  --no-output               disable default output driver\n\
 Supported output formats: %s\n\
 \n\
 Language options:\n\
@@ -234,7 +239,8 @@ terminal_option_callback (int id, void *to_)
       break;
 
     case OPT_ERROR_FILE:
-      msg_ui_set_error_file (optarg);
+      if (!strcmp (optarg, "none") || msglog_create (optarg))
+        to->has_error_file = true;
       break;
 
     case OPT_OUTPUT:
@@ -246,6 +252,12 @@ terminal_option_callback (int id, void *to_)
       parse_output_option (to, optarg);
       break;
 
+    case OPT_NO_OUTPUT:
+      /* Pretend that we already have an output driver, which disables adding
+         one in terminal_opts_done() when we don't already have one. */
+      to->has_output_driver = true;
+      break;
+
     case OPT_INTERACTIVE:
       to->syntax_mode = GETL_INTERACTIVE;
       break;
@@ -279,6 +291,7 @@ terminal_opts_init (struct argv_parser *ap, struct source_stream *ss)
   to->syntax_mode = GETL_BATCH;
   string_map_init (&to->options);
   to->has_output_driver = false;
+  to->has_error_file = false;
   to->process_statrc = true;
 
   argv_parser_add_options (ap, terminal_argv_options, N_TERMINAL_OPTIONS,
@@ -331,6 +344,9 @@ terminal_opts_done (struct terminal_opts *to, int argc, char *argv[])
       register_output_driver (to);
     }
 
+  if (!to->has_terminal_driver && !to->has_error_file)
+    msglog_create ("-");
+
   string_map_destroy (&to->options);
   free (to);
 }