output: Render pivot tables monolithically.
[pspp] / src / output / spv-driver.c
index 36db324ee79db9e1e4c6baa6a0cdf981179094ea..900a047af5f2a3fb921aaf75b191868df5d09460 100644 (file)
@@ -24,6 +24,7 @@
 #include "libpspp/cast.h"
 #include "output/cairo-chart.h"
 #include "output/output-item.h"
+#include "output/page-setup.h"
 #include "output/spv/spv-writer.h"
 
 #include "gl/xalloc.h"
@@ -49,29 +50,32 @@ spv_driver_cast (struct output_driver *driver)
 
 static struct output_driver *
 spv_create (struct file_handle *fh, enum settings_output_devices device_type,
-             struct string_map *o UNUSED)
+            struct driver_options *o)
 {
-  struct output_driver *d;
-  struct spv_driver *spv;
-
-  spv = xzalloc (sizeof *spv);
-  d = &spv->driver;
-  spv->handle = fh;
-  output_driver_init (&spv->driver, &spv_driver_class, fh_get_file_name (fh),
-                      device_type);
-
-  char *error = spv_writer_open (fh_get_file_name (fh), &spv->writer);
-  if (spv->writer == NULL)
+  struct spv_writer *writer;
+  char *error = spv_writer_open (fh_get_file_name (fh), &writer);
+  if (!writer)
     {
       msg (ME, "%s", error);
-      goto error;
+      free (error);
+      return NULL;
     }
 
-  return d;
-
- error:
-  output_driver_destroy (d);
-  return NULL;
+  struct page_setup *ps = page_setup_parse (o);
+  spv_writer_set_page_setup (writer, ps);
+  page_setup_destroy (ps);
+
+  struct spv_driver *spv = xmalloc (sizeof *spv);
+  *spv = (struct spv_driver) {
+    .driver = {
+      .class = &spv_driver_class,
+      .name = xstrdup (fh_get_file_name (fh)),
+      .device_type = device_type,
+    },
+    .handle = fh,
+    .writer = writer,
+  };
+  return &spv->driver;
 }
 
 static void
@@ -88,13 +92,22 @@ spv_destroy (struct output_driver *driver)
 
 static void
 spv_submit (struct output_driver *driver,
-             const struct output_item *output_item)
+            const struct output_item *output_item)
 {
   struct spv_driver *spv = spv_driver_cast (driver);
 
   spv_writer_write (spv->writer, output_item);
 }
 
+static void
+spv_setup (struct output_driver *driver,
+           const struct page_setup *ps)
+{
+  struct spv_driver *spv = spv_driver_cast (driver);
+
+  spv_writer_set_page_setup (spv->writer, ps);
+}
+
 struct output_driver_factory spv_driver_factory =
   { "spv", "pspp.spv", spv_create };
 
@@ -103,6 +116,7 @@ static const struct output_driver_class spv_driver_class =
     .name = "spv",
     .destroy = spv_destroy,
     .submit = spv_submit,
+    .setup = spv_setup,
     .handles_show = true,
     .handles_groups = true,
   };