treewide: Replace <name>_cnt by n_<name>s and <name>_cap by allocated_<name>.
[pspp] / src / output / ascii.c
index 0efc523d2acd0f7108d1a4083086c5b66d91f797..6535121d8c0418bcc17686a3985fd00643a7a605 100644 (file)
 #include <uniwidth.h>
 
 #ifdef HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#ifdef GWINSZ_IN_SYS_IOCTL
 # include <sys/ioctl.h>
+# include <termios.h>
 #endif
 
 #include "data/file-name.h"
 #include "libpspp/version.h"
 #include "output/ascii.h"
 #include "output/cairo-chart.h"
-#include "output/chart-item-provider.h"
+#include "output/chart-provider.h"
 #include "output/driver-provider.h"
-#include "output/image-item.h"
-#include "output/message-item.h"
 #include "output/options.h"
 #include "output/pivot-output.h"
 #include "output/pivot-table.h"
 #include "output/render.h"
-#include "output/table-item.h"
-#include "output/text-item.h"
+#include "output/output-item.h"
 
 #include "gl/minmax.h"
 #include "gl/xalloc.h"
@@ -316,8 +310,8 @@ struct ascii_driver
     bool error;                 /* Output error? */
     struct u8_line *lines;      /* Page content. */
     int allocated_lines;        /* Number of lines allocated. */
-    int chart_cnt;              /* Number of charts so far. */
-    int object_cnt;             /* Number of objects so far. */
+    int n_charts;               /* Number of charts so far. */
+    int n_objects;              /* Number of objects so far. */
     const struct pivot_table *pt;
     struct render_params params;
   };
@@ -376,9 +370,7 @@ ascii_create (struct  file_handle *fh, enum settings_output_devices device_type,
 {
   enum { BOX_ASCII, BOX_UNICODE } box;
   struct output_driver *d;
-  struct ascii_driver *a;
-
-  a = xzalloc (sizeof *a);
+  struct ascii_driver *a = XZALLOC (struct ascii_driver);
   d = &a->driver;
   output_driver_init (&a->driver, &ascii_driver_class, fh_get_file_name (fh), device_type);
   a->append = parse_boolean (opt (d, o, "append", "false"));
@@ -411,8 +403,8 @@ ascii_create (struct  file_handle *fh, enum settings_output_devices device_type,
   a->error = false;
   a->lines = NULL;
   a->allocated_lines = 0;
-  a->chart_cnt = 0;
-  a->object_cnt = 0;
+  a->n_charts = 0;
+  a->n_objects = 0;
 
   static const struct render_ops ascii_render_ops = {
     .draw_line = ascii_draw_line,
@@ -555,19 +547,19 @@ ascii_output_lines (struct ascii_driver *a, size_t n_lines)
 
 static void
 ascii_output_table_item (struct ascii_driver *a,
-                         const struct table_item *table_item)
+                         const struct output_item *item)
 {
   update_page_size (a, false);
-  a->pt = table_item->pt;
+  a->pt = item->table;
 
   size_t *layer_indexes;
-  PIVOT_OUTPUT_FOR_EACH_LAYER (layer_indexes, table_item->pt, true)
+  PIVOT_OUTPUT_FOR_EACH_LAYER (layer_indexes, item->table, true)
     {
-      struct render_pager *p = render_pager_create (&a->params, table_item,
+      struct render_pager *p = render_pager_create (&a->params, item->table,
                                                     layer_indexes);
       for (int i = 0; render_pager_has_next (p); i++)
         {
-          if (a->object_cnt++)
+          if (a->n_objects++)
             putc ('\n', a->file);
 
           ascii_output_lines (a, render_pager_draw_next (p, INT_MAX));
@@ -580,80 +572,82 @@ ascii_output_table_item (struct ascii_driver *a,
 
 static void
 ascii_output_table_item_unref (struct ascii_driver *a,
-                               struct table_item *table_item)
+                               struct output_item *table_item)
 {
   ascii_output_table_item (a, table_item);
-  table_item_unref (table_item);
+  output_item_unref (table_item);
 }
 
 static void
-ascii_submit (struct output_driver *driver,
-              const struct output_item *output_item)
+ascii_submit (struct output_driver *driver, const struct output_item *item)
 {
   struct ascii_driver *a = ascii_driver_cast (driver);
-
   if (a->error)
     return;
 
-  if (is_table_item (output_item))
-    ascii_output_table_item (a, to_table_item (output_item));
-  else if (is_image_item (output_item) && a->chart_file_name != NULL)
+  switch (item->type)
     {
-      struct image_item *image_item = to_image_item (output_item);
-      char *file_name = xr_write_png_image (
-        image_item->image, a->chart_file_name, ++a->chart_cnt);
-      if (file_name != NULL)
-        {
-          struct text_item *text_item;
-
-          text_item = text_item_create_nocopy (
-            TEXT_ITEM_LOG,
-            xasprintf (_("See %s for an image."), file_name),
-            NULL);
+    case OUTPUT_ITEM_TABLE:
+      ascii_output_table_item (a, item);
+      break;
 
-          ascii_submit (driver, &text_item->output_item);
-          text_item_unref (text_item);
-          free (file_name);
-        }
-    }
-  else if (is_chart_item (output_item) && a->chart_file_name != NULL)
-    {
-      struct chart_item *chart_item = to_chart_item (output_item);
-      char *file_name;
-
-      file_name = xr_draw_png_chart (chart_item, a->chart_file_name,
-                                     ++a->chart_cnt,
-                                    &a->fg,
-                                    &a->bg);
-      if (file_name != NULL)
+    case OUTPUT_ITEM_IMAGE:
+      if (a->chart_file_name != NULL)
         {
-          struct text_item *text_item;
-
-          text_item = text_item_create_nocopy (
-            TEXT_ITEM_LOG,
-            xasprintf (_("See %s for a chart."), file_name),
-            NULL);
+          char *file_name = xr_write_png_image (
+            item->image, a->chart_file_name, ++a->n_charts);
+          if (file_name != NULL)
+            {
+              struct output_item *text_item = text_item_create_nocopy (
+                TEXT_ITEM_LOG,
+                xasprintf (_("See %s for an image."), file_name),
+                NULL);
+
+              ascii_submit (driver, text_item);
+              output_item_unref (text_item);
+              free (file_name);
+            }
+        }
+      break;
 
-          ascii_submit (driver, &text_item->output_item);
-          text_item_unref (text_item);
-          free (file_name);
+    case OUTPUT_ITEM_CHART:
+      if (a->chart_file_name != NULL)
+        {
+          char *file_name = xr_draw_png_chart (
+            item->chart, a->chart_file_name, ++a->n_charts, &a->fg, &a->bg);
+          if (file_name != NULL)
+            {
+              struct output_item *text_item = text_item_create_nocopy (
+                TEXT_ITEM_LOG,
+                xasprintf (_("See %s for a chart."), file_name),
+                NULL);
+
+              ascii_submit (driver, text_item);
+              output_item_unref (text_item);
+              free (file_name);
+            }
         }
-    }
-  else if (is_text_item (output_item))
-    {
-      const struct text_item *text_item = to_text_item (output_item);
-      enum text_item_type type = text_item_get_type (text_item);
+      break;
 
-      if (type != TEXT_ITEM_PAGE_TITLE)
+    case OUTPUT_ITEM_TEXT:
+      if (item->text.subtype != TEXT_ITEM_PAGE_TITLE)
         ascii_output_table_item_unref (
-          a, text_item_to_table_item (text_item_ref (text_item)));
+          a, text_item_to_table_item (output_item_ref (item)));
+      break;
+
+    case OUTPUT_ITEM_MESSAGE:
+      ascii_output_table_item_unref (
+        a, text_item_to_table_item (
+          message_item_to_text_item (
+            output_item_ref (item))));
+      break;
+
+    case OUTPUT_ITEM_GROUP:
+      break;
+
+    case OUTPUT_ITEM_PAGE_BREAK:
+      break;
     }
-  else if (is_message_item (output_item))
-    ascii_output_table_item_unref (
-      a, text_item_to_table_item (
-        message_item_to_text_item (
-          to_message_item (
-            output_item_ref (output_item)))));
 }
 
 const struct output_driver_factory txt_driver_factory =
@@ -663,10 +657,10 @@ const struct output_driver_factory list_driver_factory =
 
 static const struct output_driver_class ascii_driver_class =
   {
-    "text",
-    ascii_destroy,
-    ascii_submit,
-    ascii_flush,
+    .name = "text",
+    .destroy = ascii_destroy,
+    .submit = ascii_submit,
+    .flush = ascii_flush,
   };
 \f
 static char *ascii_reserve (struct ascii_driver *, int y, int x0, int x1,
@@ -1037,8 +1031,8 @@ ascii_test_write (struct output_driver *driver,
     .underline = underline,
   };
   const struct pivot_value value = {
-    .type = PIVOT_VALUE_TEXT,
     .text = {
+      .type = PIVOT_VALUE_TEXT,
       .local = CONST_CAST (char *, s),
       .c = CONST_CAST (char *, s),
       .id = CONST_CAST (char *, s),