driver: New function output_driver_parse_option().
[pspp] / src / ui / terminal / terminal-opts.c
index 95007a0cb406a362d1521526634f66ba10e63719..cd58f81e94d8a123b7ee8c0511e528dc0fc75ba4 100644 (file)
@@ -24,7 +24,6 @@
 
 
 #include "data/settings.h"
-#include "data/file-name.h"
 #include "language/lexer/include-path.h"
 #include "libpspp/argv-parser.h"
 #include "libpspp/assertion.h"
@@ -113,31 +112,6 @@ register_output_driver (struct terminal_opts *to)
     }
 }
 
-static void
-parse_output_option (struct terminal_opts *to, const char *option)
-{
-  const char *equals;
-  char *key, *value;
-
-  equals = strchr (option, '=');
-  if (equals == NULL)
-    {
-      error (0, 0, _("%s: output option missing `='"), option);
-      return;
-    }
-
-  key = xmemdup0 (option, equals - option);
-  if (string_map_contains (&to->options, key))
-    {
-      error (0, 0, _("%s: output option specified more than once"), key);
-      free (key);
-      return;
-    }
-
-  value = xmemdup0 (equals + 1, strlen (equals + 1));
-  string_map_insert_nocopy (&to->options, key, value);
-}
-
 static char *
 get_supported_formats (void)
 {
@@ -146,7 +120,6 @@ get_supported_formats (void)
   struct string_set format_set;
   char *format_string;
   const char *format;
-  size_t i;
 
   /* Get supported formats as unordered set. */
   string_set_init (&format_set);
@@ -172,7 +145,7 @@ usage (void)
   char *inc_path = string_array_join (include_path_default (), " ");
 
   printf (_("\
-PSPP, a program for statistical analysis of sample data.\n\
+PSPP, a program for statistical analysis of sampled data.\n\
 Usage: %s [OPTION]... FILE...\n\
 \n\
 Arguments to long options also apply to equivalent short options.\n\
@@ -237,7 +210,7 @@ terminal_option_callback (int id, void *to_)
       break;
 
     case OPT_OUTPUT_OPTION:
-      parse_output_option (to, optarg);
+      output_driver_parse_option (optarg, &to->options);
       break;
 
     case OPT_NO_OUTPUT:
@@ -302,14 +275,33 @@ terminal_opts_init (struct argv_parser *ap,
   return to;
 }
 
+/* Return true iff the terminal appears to be an xterm with
+   UTF-8 capabilities */
+static bool
+term_is_utf8_xterm (void)
+{
+  char *s = NULL;
+
+  if ( (s = getenv ("TERM")) && (0 == strcmp ("xterm", s)) )
+    if ( (s = getenv ("XTERM_LOCALE")) )
+      return strcasestr (s, "utf8") || strcasestr (s, "utf-8");
+
+  return false;
+}
+
 void
 terminal_opts_done (struct terminal_opts *to, int argc, char *argv[])
 {
-      if (0 == strcmp (locale_charset (), "UTF-8"))
-        string_map_insert (&to->options, "box", "unicode");
   register_output_driver (to);
   if (!to->has_output_driver)
     {
+      if ((0 == strcmp (locale_charset (), "UTF-8"))
+         ||
+         (term_is_utf8_xterm ()) )
+       {
+         string_map_insert (&to->options, "box", "unicode");
+       }
+
       string_map_insert (&to->options, "output-file", "-");
       string_map_insert (&to->options, "format", "txt");
       register_output_driver (to);