Partial revert "work on getting better output into documentation"
[pspp] / utilities / pspp-output.c
index 8362ac57ff252ef78392c2c29fd33b809f52fbdd..b3b4b57fa0fe42d2f9c88cebd462d8773a8bc85b 100644 (file)
@@ -77,7 +77,7 @@ static bool raw;
 static bool force;
 
 /* --table-look: TableLook to replace table style for conversion. */
 static bool force;
 
 /* --table-look: TableLook to replace table style for conversion. */
-static struct spv_table_look *table_look;
+static struct pivot_table_look *table_look;
 
 /* Number of warnings issued. */
 static size_t n_warnings;
 
 /* Number of warnings issued. */
 static size_t n_warnings;
@@ -325,6 +325,59 @@ run_convert (int argc UNUSED, char **argv)
     }
 }
 
     }
 }
 
+static const struct pivot_table *
+get_first_table (const struct spv_reader *spv)
+{
+  struct spv_item **items;
+  size_t n_items;
+  spv_select (spv, criteria, n_criteria, &items, &n_items);
+
+  for (size_t i = 0; i < n_items; i++)
+    if (spv_item_is_table (items[i]))
+      {
+        free (items);
+        return spv_item_get_table (items[i]);
+      }
+
+  free (items);
+  return NULL;
+}
+
+static void
+run_get_table_look (int argc UNUSED, char **argv)
+{
+  struct spv_reader *spv;
+  char *err = spv_open (argv[1], &spv);
+  if (err)
+    error (1, 0, "%s", err);
+
+  const struct pivot_table *table = get_first_table (spv);
+  if (!table)
+    error (1, 0, "%s: no tables found", argv[1]);
+
+  err = spv_table_look_write (argv[2], pivot_table_get_look (table));
+  if (err)
+    error (1, 0, "%s", err);
+
+  spv_close (spv);
+}
+
+static void
+run_convert_table_look (int argc UNUSED, char **argv)
+{
+  struct pivot_table_look *look;
+  char *err = spv_table_look_read (argv[1], &look);
+  if (err)
+    error (1, 0, "%s", err);
+
+  err = spv_table_look_write (argv[2], look);
+  if (err)
+    error (1, 0, "%s", err);
+
+  pivot_table_look_uninit (look);
+  free (look);
+}
+
 static void
 run_dump (int argc UNUSED, char **argv)
 {
 static void
 run_dump (int argc UNUSED, char **argv)
 {
@@ -672,6 +725,8 @@ static const struct command commands[] =
     { "detect", 1, 1, run_detect },
     { "dir", 1, 1, run_directory },
     { "convert", 2, 2, run_convert },
     { "detect", 1, 1, run_detect },
     { "dir", 1, 1, run_directory },
     { "convert", 2, 2, run_convert },
+    { "get-table-look", 2, 2, run_get_table_look },
+    { "convert-table-look", 2, 2, run_convert_table_look },
 
     /* Undocumented commands. */
     { "dump", 1, 1, run_dump },
 
     /* Undocumented commands. */
     { "dump", 1, 1, run_dump },
@@ -753,7 +808,11 @@ main (int argc, char **argv)
 
   c->run (argc, argv);
 
 
   c->run (argc, argv);
 
-  spv_table_look_destroy (table_look);
+  if (table_look)
+    {
+      pivot_table_look_uninit (table_look);
+      free (table_look);
+    }
   i18n_done ();
 
   return n_warnings ? EXIT_FAILURE : EXIT_SUCCESS;
   i18n_done ();
 
   return n_warnings ? EXIT_FAILURE : EXIT_SUCCESS;
@@ -883,7 +942,12 @@ parse_members (const char *arg)
 static void
 parse_table_look (const char *arg)
 {
 static void
 parse_table_look (const char *arg)
 {
-  spv_table_look_destroy (table_look);
+  if (table_look)
+    {
+      pivot_table_look_uninit (table_look);
+      free (table_look);
+    }
+
   char *error_s = spv_table_look_read (arg, &table_look);
   if (error_s)
     error (1, 0, "%s", error_s);
   char *error_s = spv_table_look_read (arg, &table_look);
   if (error_s)
     error (1, 0, "%s", error_s);
@@ -1053,6 +1117,8 @@ The following commands are available:\n\
   detect FILE            Detect whether FILE is an SPV file.\n\
   dir FILE               List tables and other items in FILE.\n\
   convert SOURCE DEST    Convert .spv SOURCE to DEST.\n\
   detect FILE            Detect whether FILE is an SPV file.\n\
   dir FILE               List tables and other items in FILE.\n\
   convert SOURCE DEST    Convert .spv SOURCE to DEST.\n\
+  get-table-look SOURCE DEST  Copies first selected TableLook into DEST\n\
+  convert-table-look SOURCE DEST  Copies .tlo or .stt SOURCE into DEST\n\
 \n\
 Input selection options for \"dir\" and \"convert\":\n\
   --select=CLASS...   include only some kinds of objects\n\
 \n\
 Input selection options for \"dir\" and \"convert\":\n\
   --select=CLASS...   include only some kinds of objects\n\