output: Replace OUTPUT_ITEM_PAGE_SETUP by a new driver function.
authorBen Pfaff <blp@cs.stanford.edu>
Mon, 25 Jan 2021 05:09:08 +0000 (21:09 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 25 Jan 2021 05:09:08 +0000 (21:09 -0800)
OUTPUT_ITEM_PAGE_SETUP was a special case that only the Cairo and SPV
drivers could implement, and it could only come first in the output stream
anyway, so it didn't make much sense.  This commit gets rid of it in favor
of adding a new driver class function for setting the page setup.

18 files changed:
src/output/ascii.c
src/output/cairo-fsm.c
src/output/cairo.c
src/output/csv.c
src/output/driver-provider.h
src/output/driver.c
src/output/driver.h
src/output/html.c
src/output/journal.c
src/output/odt.c
src/output/output-item.c
src/output/output-item.h
src/output/select.c
src/output/spv-driver.c
src/output/spv/spv-writer.c
src/output/spv/spv-writer.h
src/output/tex.c
utilities/pspp-output.c

index cf649b0aecdffc2e7c07d0f2da24ccfa944c0c72..ee87fa22e37c3341071239ef1e3c90899ef6036d 100644 (file)
@@ -651,7 +651,6 @@ ascii_submit (struct output_driver *driver, const struct output_item *item)
       NOT_REACHED ();
 
     case OUTPUT_ITEM_PAGE_BREAK:
-    case OUTPUT_ITEM_PAGE_SETUP:
       break;
     }
 }
index 5377c28b1c1bcd847b665bfa706aa6bc5b287e85..d71f4d0b02f5dc76ded9d5343d0462f06cea299c 100644 (file)
@@ -991,7 +991,6 @@ xr_fsm_create (const struct output_item *item_,
       break;
 
     case OUTPUT_ITEM_GROUP:
-    case OUTPUT_ITEM_PAGE_SETUP:
       return NULL;
 
     case OUTPUT_ITEM_MESSAGE:
@@ -1150,7 +1149,6 @@ xr_fsm_measure (struct xr_fsm *fsm, cairo_t *cr, int *wp, int *hp)
     case OUTPUT_ITEM_GROUP:
     case OUTPUT_ITEM_MESSAGE:
     case OUTPUT_ITEM_PAGE_BREAK:
-    case OUTPUT_ITEM_PAGE_SETUP:
     case OUTPUT_ITEM_TEXT:
     default:
       NOT_REACHED ();
@@ -1214,7 +1212,6 @@ xr_fsm_draw_region (struct xr_fsm *fsm, cairo_t *cr,
     case OUTPUT_ITEM_GROUP:
     case OUTPUT_ITEM_MESSAGE:
     case OUTPUT_ITEM_PAGE_BREAK:
-    case OUTPUT_ITEM_PAGE_SETUP:
     case OUTPUT_ITEM_TEXT:
       NOT_REACHED ();
     }
@@ -1345,7 +1342,6 @@ xr_fsm_draw_slice (struct xr_fsm *fsm, cairo_t *cr, int space)
 
     case OUTPUT_ITEM_GROUP:
     case OUTPUT_ITEM_MESSAGE:
-    case OUTPUT_ITEM_PAGE_SETUP:
     case OUTPUT_ITEM_TEXT:
     default:
       NOT_REACHED ();
index 81aeddc15f4094b4ed88511605323b3007f1bd54..dc5cf94ca3cbf1115835b68d19bcd4993c4cce78 100644 (file)
@@ -607,13 +607,6 @@ xr_submit (struct output_driver *driver, const struct output_item *item)
 {
   struct xr_driver *xr = xr_driver_cast (driver);
 
-  if (item->type == OUTPUT_ITEM_PAGE_SETUP)
-    {
-      if (!xr->pager)
-        xr_update_page_setup (driver, item->page_setup);
-      return;
-    }
-
   if (!xr->pager)
     {
       xr->pager = xr_pager_create (xr->page_style, xr->fsm_style);
@@ -627,6 +620,15 @@ xr_submit (struct output_driver *driver, const struct output_item *item)
       xr_pager_add_page (xr->pager, cairo_create (xr->drawing_surface));
     }
 }
+
+static void
+xr_setup (struct output_driver *driver, const struct page_setup *ps)
+{
+  struct xr_driver *xr = xr_driver_cast (driver);
+
+  if (!xr->pager)
+    xr_update_page_setup (driver, ps);
+}
 \f
 struct output_driver_factory pdf_driver_factory =
   { "pdf", "pspp.pdf", xr_pdf_create };
@@ -642,5 +644,6 @@ static const struct output_driver_class cairo_driver_class =
   .name = "cairo",
   .destroy = xr_destroy,
   .submit = xr_submit,
+  .setup = xr_setup,
   .handles_groups = true,
 };
index 130fe69dfe59293814bf445e50b70bb31302823a..3b719fa5066f834c6f323957deb26b3bf9b5c856 100644 (file)
@@ -264,9 +264,6 @@ csv_submit (struct output_driver *driver,
       csv_output_lines (csv, "");
       break;
 
-    case OUTPUT_ITEM_PAGE_SETUP:
-      break;
-
     case OUTPUT_ITEM_TABLE:
       {
         size_t *layer_indexes;
index 3712663bc5dcc8f95ad7ba2b7598e0767bb82e62..1f3f726949575adf2905086f125bf44cac2f6d53 100644 (file)
@@ -27,6 +27,7 @@ struct output_item;
 struct output_iterator;
 struct string_map;
 struct file_handle;
+struct page_setup;
 
 /* A configured output driver. */
 struct output_driver
@@ -66,6 +67,10 @@ struct output_driver_class
     void (*submit) (struct output_driver *driver,
                     const struct output_item *item);
 
+    /* Changes DRIVER's output page setup to PS, if possible.  This may be NUL
+       if the driver doesn't support page setup. */
+    void (*setup) (struct output_driver *driver, const struct page_setup *ps);
+
     /* Ensures that any output items passed to the 'submit' function for DRIVER
        have actually been displayed.
 
index 61ce6f51aa4e30272c6f6b09917a65c340a5f88c..33473a01424705703d5dd92b44a6e6912edbd00c 100644 (file)
@@ -156,7 +156,6 @@ output_driver_should_show (const struct output_driver *d,
     case OUTPUT_ITEM_GROUP:
     case OUTPUT_ITEM_IMAGE:
     case OUTPUT_ITEM_PAGE_BREAK:
-    case OUTPUT_ITEM_PAGE_SETUP:
     case OUTPUT_ITEM_TABLE:
       break;
     }
@@ -462,6 +461,20 @@ output_driver_is_registered (const struct output_driver *driver)
 {
   return output_driver_get_engine (driver) != NULL;
 }
+
+void
+output_set_page_setup (const struct page_setup *ps)
+{
+  struct output_engine *e = engine_stack_top ();
+
+  struct llx *llx;
+  llx_for_each (llx, &e->drivers)
+    {
+      struct output_driver *d = llx_data (llx);
+      if (d->class->setup)
+        d->class->setup (d, ps);
+    }
+}
 \f
 extern const struct output_driver_factory csv_driver_factory;
 extern const struct output_driver_factory html_driver_factory;
index b3e3a520b25af7053a72500735d981453f135060..ab162a6268979bf551f85992575697ce10857964 100644 (file)
@@ -22,6 +22,7 @@
 #include "libpspp/compiler.h"
 
 struct output_item;
+struct page_setup;
 struct string_set;
 struct string_map;
 
@@ -53,4 +54,6 @@ bool output_driver_is_registered (const struct output_driver *);
 void output_driver_register (struct output_driver *);
 void output_driver_unregister (struct output_driver *);
 
+void output_set_page_setup (const struct page_setup *);
+
 #endif /* output/driver.h */
index e3483b4ebc9318a042cd7baaf9a207b1b6285c62..cbb8e90c6e852d61a760b66d3e9c4605e3bf1036 100644 (file)
@@ -302,9 +302,6 @@ html_submit__ (struct output_driver *driver, const struct output_item *item,
     case OUTPUT_ITEM_PAGE_BREAK:
       break;
 
-    case OUTPUT_ITEM_PAGE_SETUP:
-      break;
-
     case OUTPUT_ITEM_TABLE:
       html_output_table (html, item);
       break;
index 4945db2ee9d831aa1fcbdb78790836a6617f3e5b..a07fd4a094fdc1f213e82c67f965f14eb570973a 100644 (file)
@@ -123,7 +123,6 @@ journal_submit (struct output_driver *driver, const struct output_item *item)
     case OUTPUT_ITEM_CHART:
     case OUTPUT_ITEM_IMAGE:
     case OUTPUT_ITEM_PAGE_BREAK:
-    case OUTPUT_ITEM_PAGE_SETUP:
     case OUTPUT_ITEM_TABLE:
       break;
     }
index a7eeaee9ef279f62c66ad66fd6fc36b766d0ac52..ed70ecbb4cf447dfd4ec8d27d254aaf64e1aad7f 100644 (file)
@@ -614,9 +614,6 @@ odt_submit (struct output_driver *driver, const struct output_item *item)
     case OUTPUT_ITEM_PAGE_BREAK:
       break;
 
-    case OUTPUT_ITEM_PAGE_SETUP:
-      break;
-
     case OUTPUT_ITEM_TABLE:
       write_table (odt, item->table);
       break;
index 5bfd1254134629be3d92bc437cbcffa6623f77c8..a46fdf8020b9c904641c78328e30b3d7f3cef966 100644 (file)
@@ -28,7 +28,6 @@
 #include "libpspp/zip-reader.h"
 #include "output/chart.h"
 #include "output/driver.h"
-#include "output/page-setup.h"
 #include "output/pivot-table.h"
 
 #include "gl/xalloc.h"
@@ -47,7 +46,6 @@ output_item_type_to_string (enum output_item_type type)
     case OUTPUT_ITEM_IMAGE: return "image";
     case OUTPUT_ITEM_MESSAGE: return "message";
     case OUTPUT_ITEM_PAGE_BREAK: return "page break";
-    case OUTPUT_ITEM_PAGE_SETUP: return "page setup";
     case OUTPUT_ITEM_TABLE: return "table";
     case OUTPUT_ITEM_TEXT: return "text";
     }
@@ -101,10 +99,6 @@ output_item_unref (struct output_item *item)
             case OUTPUT_ITEM_PAGE_BREAK:
               break;
 
-            case OUTPUT_ITEM_PAGE_SETUP:
-              page_setup_destroy (item->page_setup);
-              break;
-
             case OUTPUT_ITEM_TABLE:
               pivot_table_unref (item->table);
               break;
@@ -184,10 +178,6 @@ output_item_unshare (struct output_item *old)
     case OUTPUT_ITEM_PAGE_BREAK:
       break;
 
-    case OUTPUT_ITEM_PAGE_SETUP:
-      new->page_setup = page_setup_clone (old->page_setup);
-      break;
-
     case OUTPUT_ITEM_TABLE:
       new->table = pivot_table_ref (old->table);
       break;
@@ -254,10 +244,6 @@ output_item_get_label (const struct output_item *item)
     case OUTPUT_ITEM_PAGE_BREAK:
       return _("Page Break");
 
-    case OUTPUT_ITEM_PAGE_SETUP:
-      /* Not marked for translation: user should never see it. */
-      return "Page Setup";
-
     case OUTPUT_ITEM_TABLE:
       if (!item->cached_label)
         {
@@ -372,10 +358,6 @@ output_item_dump (const struct output_item *item, int indentation)
       printf ("page break\n");
       break;
 
-    case OUTPUT_ITEM_PAGE_SETUP:
-      printf ("page setup\n");
-      break;
-
     case OUTPUT_ITEM_TABLE:
       pivot_table_dump (item->table, indentation + 1);
       break;
@@ -556,17 +538,6 @@ page_break_item_create (void)
   return item;
 }
 \f
-struct output_item *
-page_setup_item_create (const struct page_setup *ps)
-{
-  struct output_item *item = xmalloc (sizeof *item);
-  *item = (struct output_item) {
-    OUTPUT_ITEM_INITIALIZER (OUTPUT_ITEM_PAGE_SETUP),
-    .page_setup = page_setup_clone (ps),
-  };
-  return item;
-}
-\f
 /* Returns a new output_item for rendering TABLE.  Takes ownership of
    TABLE. */
 struct output_item *
index 72d4661510d3993e8cf5ffc95ce5c9d78e1b172d..475504acb51ffcabfb2510ee27464b45af5b7c15 100644 (file)
@@ -34,7 +34,6 @@ enum output_item_type
     OUTPUT_ITEM_IMAGE,
     OUTPUT_ITEM_MESSAGE,
     OUTPUT_ITEM_PAGE_BREAK,
-    OUTPUT_ITEM_PAGE_SETUP,
     OUTPUT_ITEM_TABLE,
     OUTPUT_ITEM_TEXT,
   };
@@ -90,8 +89,6 @@ struct output_item
 
         struct msg *message;
 
-        struct page_setup *page_setup;
-
         struct pivot_table *table;
 
         struct
@@ -194,10 +191,6 @@ struct output_item *message_item_to_text_item (struct output_item *);
 
 struct output_item *page_break_item_create (void);
 \f
-/* OUTPUT_ITEM_PAGE_SETUP. */
-
-struct output_item *page_setup_item_create (const struct page_setup *);
-\f
 /* OUTPUT_ITEM_TABLE. */
 
 struct output_item *table_item_create (struct pivot_table *);
index 52ab7f29bd07a00a110b0d5f349777380f6268ee..7f76b73a85c2b060be68afae786ffa95318a11db 100644 (file)
@@ -76,9 +76,6 @@ output_item_classify (const struct output_item *item)
     case OUTPUT_ITEM_PAGE_BREAK:
       return OUTPUT_CLASS_OTHER;
 
-    case OUTPUT_ITEM_PAGE_SETUP:
-      return OUTPUT_CLASS_OTHER;
-
     case OUTPUT_ITEM_TABLE:
       return (!strcmp (label, "Warnings") ? OUTPUT_CLASS_WARNINGS
               : !strcmp (label, "Notes") ? OUTPUT_CLASS_NOTES
index 36db324ee79db9e1e4c6baa6a0cdf981179094ea..1eb57f7f16001a6befb951e8817c9010a6b21d94 100644 (file)
@@ -49,7 +49,7 @@ 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 string_map *o UNUSED)
 {
   struct output_driver *d;
   struct spv_driver *spv;
@@ -69,7 +69,7 @@ spv_create (struct file_handle *fh, enum settings_output_devices device_type,
 
   return d;
 
- error:
+error:
   output_driver_destroy (d);
   return NULL;
 }
@@ -88,13 +88,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 +112,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,
   };
index 64bb365c614f48d1f13f4cffaa949bd7198468f5..f1f9b969563f7fab49cf785ae01b19b621212035 100644 (file)
@@ -1126,11 +1126,6 @@ spv_writer_write (struct spv_writer *w, const struct output_item *item)
       w->need_page_break = true;
       break;
 
-    case OUTPUT_ITEM_PAGE_SETUP:
-      page_setup_destroy (w->page_setup);
-      w->page_setup = page_setup_clone (item->page_setup);
-      break;
-
     case OUTPUT_ITEM_TABLE:
       spv_writer_put_table (w, item);
       break;
@@ -1140,3 +1135,11 @@ spv_writer_write (struct spv_writer *w, const struct output_item *item)
       break;
     }
 }
+
+void
+spv_writer_set_page_setup (struct spv_writer *w,
+                           const struct page_setup *ps)
+{
+  page_setup_destroy (w->page_setup);
+  w->page_setup = page_setup_clone (ps);
+}
index 7641f1c34cb80ec7880cd7c860686f2a0f99f9b6..4ff63acad3c3a9e89c958ff816de6d6982542ede 100644 (file)
@@ -18,6 +18,7 @@
 #define OUTPUT_SPV_WRITER_H 1
 
 struct output_item;
+struct page_setup;
 struct spv_writer;
 
 #include "libpspp/compiler.h"
@@ -27,5 +28,7 @@ char *spv_writer_open (const char *filename, struct spv_writer **)
 char *spv_writer_close (struct spv_writer *) WARN_UNUSED_RESULT;
 
 void spv_writer_write (struct spv_writer *, const struct output_item *);
+void spv_writer_set_page_setup (struct spv_writer *,
+                                const struct page_setup *);
 
 #endif /* output/spv/spv-writer.h */
index 254d6a686183e64b9ebc60b76e301eb1995bc371..800aa726d95f83dd271c365fb3424fedbbb57cd2 100644 (file)
@@ -356,9 +356,6 @@ tex_submit (struct output_driver *driver, const struct output_item *item)
     case OUTPUT_ITEM_PAGE_BREAK:
       break;
 
-    case OUTPUT_ITEM_PAGE_SETUP:
-      break;
-
     case OUTPUT_ITEM_TABLE:
       tex_output_table (tex, item->table);
       break;
index 3f1fcb81d41282e801c3850c3004caa6517f1893..3a695efa299d98dfde590e9f17c3d702cdb03b3c 100644 (file)
@@ -239,7 +239,7 @@ run_convert (int argc UNUSED, char **argv)
 
   if (ps)
     {
-      output_item_submit (page_setup_item_create (ps));
+      output_set_page_setup (ps);
       page_setup_destroy (ps);
     }
   output_item_submit_children (root);