work
[pspp] / src / output / ascii.c
index c0218e6626232fbfced7122e8d65d2af0e163528..7833ed0ac5e34907f90ff8b0d6a630ccc61905b7 100644 (file)
@@ -44,8 +44,8 @@
 #include "output/driver-provider.h"
 #include "output/message-item.h"
 #include "output/options.h"
+#include "output/pivot-table.h"
 #include "output/render.h"
-#include "output/tab.h"
 #include "output/table-item.h"
 #include "output/text-item.h"
 
@@ -240,6 +240,19 @@ opt (struct output_driver *d, struct string_map *options, const char *key,
   return driver_option_get (d, options, key, default_value);
 }
 
+/* Return true iff the terminal appears to be an xterm with
+   UTF-8 capabilities */
+static bool
+term_is_utf8_xterm (void)
+{
+  const char *term = getenv ("TERM");
+  const char *xterm_locale = getenv ("XTERM_LOCAL");
+  return (term && xterm_locale
+          && !strcmp (term, "xterm")
+          && (strcasestr (xterm_locale, "utf8")
+              || strcasestr (xterm_locale, "utf-8")));
+}
+
 static struct output_driver *
 ascii_create (struct  file_handle *fh, enum settings_output_devices device_type,
               struct string_map *o)
@@ -267,7 +280,13 @@ ascii_create (struct  file_handle *fh, enum settings_output_devices device_type,
   parse_color (d, o, "background-color", "#FFFFFFFFFFFF", &a->bg);
   parse_color (d, o, "foreground-color", "#000000000000", &a->fg);
 #endif
-  box = parse_enum (opt (d, o, "box", "ascii"),
+
+  const char *default_box = (!strcmp (fh_get_file_name (fh), "-")
+                             && isatty (STDOUT_FILENO)
+                             && (!strcmp (locale_charset (), "UTF-8")
+                                 || term_is_utf8_xterm ())
+                             ? "unicode" : "ascii");
+  box = parse_enum (opt (d, o, "box", default_box),
                     "ascii", BOX_ASCII,
                     "unicode", BOX_UNICODE,
                     NULL_SENTINEL);
@@ -432,16 +451,21 @@ ascii_output_table_item (struct ascii_driver *a,
 }
 
 static void
-ascii_output_text (struct ascii_driver *a, const char *text)
+ascii_output_table_item_unref (struct ascii_driver *a,
+                               struct table_item *table_item)
 {
-  struct table_item *table_item;
-
-  table_item = table_item_create (table_from_string (TABLE_HALIGN_LEFT, text),
-                                  NULL, NULL);
   ascii_output_table_item (a, table_item);
   table_item_unref (table_item);
 }
 
+static void
+ascii_output_text (struct ascii_driver *a, const char *text)
+{
+  struct pivot_table *pt = pivot_table_create_for_text (
+    NULL, pivot_value_new_user_text (text, -1));
+  ascii_output_table_item_unref (a, table_item_create (pt));
+}
+
 static void
 ascii_submit (struct output_driver *driver,
               const struct output_item *output_item)
@@ -491,7 +515,8 @@ ascii_submit (struct output_driver *driver,
           break;
 
         default:
-          ascii_output_table_item (a, text_item_to_table_item (text_item_ref (text_item)));
+          ascii_output_table_item_unref (
+            a, text_item_to_table_item (text_item_ref (text_item)));
           break;
         }
     }
@@ -909,11 +934,11 @@ ascii_test_write (struct output_driver *driver,
     return;
 
   struct area_style style = {
+    .cell_style.halign = TABLE_HALIGN_LEFT,
     .font_style.bold = bold,
     .font_style.underline = underline,
   };
   struct table_cell cell = {
-    .options = TAB_LEFT,
     .text = CONST_CAST (char *, s),
     .style = &style,
   };