pivot-table: Reduce size of struct pivot_value from 80 bytes to 40.
[pspp] / src / output / html.c
index dcff0af085bcfe4e5feed0e843923c16b68c922a..60ca95e28dba029683e895dad42e0a7aac91c2a1 100644 (file)
@@ -247,7 +247,8 @@ html_destroy (struct output_driver *driver)
 }
 
 static void
-html_submit (struct output_driver *driver, const struct output_item *item)
+html_submit__ (struct output_driver *driver, const struct output_item *item,
+               int level)
 {
   struct html_driver *html = html_driver_cast (driver);
 
@@ -270,10 +271,9 @@ html_submit (struct output_driver *driver, const struct output_item *item)
         }
       break;
 
-    case OUTPUT_ITEM_GROUP_OPEN:
-      break;
-
-    case OUTPUT_ITEM_GROUP_CLOSE:
+    case OUTPUT_ITEM_GROUP:
+      for (size_t i = 0; i < item->group.n_children; i++)
+        html_submit__ (driver, item->group.children[i], level + 1);
       break;
 
     case OUTPUT_ITEM_IMAGE:
@@ -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;
@@ -320,8 +317,7 @@ html_submit (struct output_driver *driver, const struct output_item *item)
 
           case TEXT_ITEM_TITLE:
             {
-              int level = MIN (5, output_get_group_level ()) + 1;
-              char tag[3] = { 'H', level + '1', '\0' };
+              char tag[3] = { 'H', MIN (5, level) + '0', '\0' };
               print_title_tag (html->file, tag, s);
             }
             break;
@@ -345,6 +341,12 @@ html_submit (struct output_driver *driver, const struct output_item *item)
     }
 }
 
+static void
+html_submit (struct output_driver *driver, const struct output_item *item)
+{
+  html_submit__ (driver, item, 1);
+}
+
 /* Write TEXT to file F, escaping characters as necessary for HTML.  Spaces are
    replaced by SPACE, which should be " " or "&nbsp;" New-lines are replaced by
    NEWLINE, which might be "<BR>" or "\n" or something else appropriate. */
@@ -585,26 +587,26 @@ html_put_table_cell (struct html_driver *html, const struct pivot_table *pt,
   escape_string (html->file, s, " ", "<br>");
   ds_destroy (&body);
 
-  if (cell->value->n_subscripts)
+  const struct pivot_value_ex *ex = pivot_value_ex (cell->value);
+  if (ex->n_subscripts)
     {
       fputs ("<sub>", html->file);
-      for (size_t i = 0; i < cell->value->n_subscripts; i++)
+      for (size_t i = 0; i < ex->n_subscripts; i++)
         {
           if (i)
             putc (',', html->file);
-          escape_string (html->file, cell->value->subscripts[i],
-                         "&nbsp;", "<br>");
+          escape_string (html->file, ex->subscripts[i], "&nbsp;", "<br>");
         }
       fputs ("</sub>", html->file);
     }
-  if (cell->value->n_footnotes > 0)
+  if (ex->n_footnotes > 0)
     {
       fputs ("<sup>", html->file);
       size_t n_footnotes = 0;
-      for (size_t i = 0; i < cell->value->n_footnotes; i++)
+      for (size_t i = 0; i < ex->n_footnotes; i++)
         {
           const struct pivot_footnote *f
-            = pt->footnotes[cell->value->footnote_indexes[i]];
+            = pt->footnotes[ex->footnote_indexes[i]];
           if (f->show)
             {
               if (n_footnotes++ > 0)
@@ -740,8 +742,8 @@ struct output_driver_factory html_driver_factory =
 
 static const struct output_driver_class html_driver_class =
   {
-    "html",
-    html_destroy,
-    html_submit,
-    NULL,
+    .name = "html",
+    .destroy = html_destroy,
+    .submit = html_submit,
+    .handles_groups = true,
   };