format: Reduce size of struct fmt_spec from 6 bytes to 4.
[pspp] / src / output / driver-provider.h
index 92929b54ac7bf1a29e2a17967fb890443cf36090..1f3f726949575adf2905086f125bf44cac2f6d53 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2007, 2009 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2012, 2014 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 #ifndef OUTPUT_DRIVER_PROVIDER_H
 #define OUTPUT_DRIVER_PROVIDER_H 1
 
-#include <libpspp/compiler.h>
 #include <stdbool.h>
-#include <output/driver.h>
+
+#include "data/settings.h"
+#include "libpspp/compiler.h"
+#include "output/driver.h"
 
 struct output_item;
+struct output_iterator;
 struct string_map;
+struct file_handle;
+struct page_setup;
 
 /* A configured output driver. */
 struct output_driver
   {
     const struct output_driver_class *class; /* Driver class. */
     char *name;                              /* Name of this driver. */
-    enum output_device_type device_type;     /* One of OUTPUT_DEVICE_*. */
+    enum settings_output_devices device_type; /* One of SETTINGS_DEVICE_*. */
   };
 
 void output_driver_init (struct output_driver *,
                          const struct output_driver_class *,
-                         const char *name, enum output_device_type);
+                         const char *, enum settings_output_devices);
+
 void output_driver_destroy (struct output_driver *);
 
 const char *output_driver_get_name (const struct output_driver *);
 
+char *output_driver_substitute_heading_vars (const char *, int page_number);
+
 /* One kind of output driver.
 
    Output driver implementations must not call msg() to report errors.  This
@@ -47,22 +55,8 @@ const char *output_driver_get_name (const struct output_driver *);
    with error(), which will never call into the output drivers.  */
 struct output_driver_class
   {
-    const char *name;          /* Name of this driver class. */
-
-    /* Creates a new output driver of this class.  NAME and TYPE should be
-       passed directly to output_driver_init.  Returns the new output driver if
-       successful, otherwise a null pointer.
-
-       It is up to the driver class to decide how to interpret OPTIONS.  The
-       functions in output/options.h can be useful.  OPTIONS may be modified
-       but the caller is responsible for destroying it.
-
-       The returned driver should not have been registered (with
-       output_driver_register).  The caller will register the driver (if this
-       is desirable). */
-    struct output_driver *(*create) (const char *name,
-                                     enum output_device_type type,
-                                     struct string_map *options);
+    /* Name of this driver class. */
+    const char *name;
 
     /* Closes and frees DRIVER. */
     void (*destroy) (struct output_driver *driver);
@@ -73,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.
 
@@ -81,19 +79,45 @@ struct output_driver_class
        it doesn't make sense for DRIVER to be used this way, then this function
        need not do anything. */
     void (*flush) (struct output_driver *driver);
+
+    /* Ordinarily, the core driver code will skip passing hidden output items
+       to 'submit'.  If this member is true, the core driver hands them to the
+       driver to let it handle them itself. */
+    bool handles_show;
+
+    /* Ordinarily, the core driver code will flatten groups of output items
+       before passing them to 'submit'.  If this member is true, the core
+       driver code leaves them in place for the driver to handle. */
+    bool handles_groups;
   };
 
-void output_driver_register (struct output_driver *);
-void output_driver_unregister (struct output_driver *);
-bool output_driver_is_registered (const struct output_driver *);
-
-/* Common drivers. */
-extern const struct output_driver_class ascii_class;
-extern const struct output_driver_class html_class;
-extern const struct output_driver_class odt_class;
-extern const struct output_driver_class csv_class;
-#ifdef HAVE_CAIRO
-extern const struct output_driver_class cairo_class;
-#endif
+/* An abstract way for the output subsystem to create an output driver. */
+struct output_driver_factory
+  {
+    /* The file extension, without the leading dot, e.g. "pdf". */
+    const char *extension;
+
+    /* The default file name, including extension.
+
+       If this is "-", that implies that by default output will be directed to
+       stdout. */
+    const char *default_file_name;
+
+    /* Creates a new output driver of this class.  NAME and TYPE should be
+       passed directly to output_driver_init.  Returns the new output driver if
+       successful, otherwise a null pointer.
+
+       It is up to the driver class to decide how to interpret OPTIONS.  The
+       create function should delete pairs that it understands from OPTIONS,
+       because the caller may issue errors about unknown options for any pairs
+       that remain.  The functions in output/options.h can be useful.
+
+       The returned driver should not have been registered (with
+       output_driver_register).  The caller will register the driver (if this
+       is desirable). */
+    struct output_driver *(*create) (struct file_handle *,
+                                     enum settings_output_devices type,
+                                     struct string_map *options);
+  };
 
 #endif /* output/driver-provider.h */