Implement SET LEADZERO.
[pspp] / src / output / spv / spv-writer.c
index 270f6beb87ff95c63b2757673f0cdc0a43cbce5a..3d56429d6604c5ca6b90426b457fdffa4416b0ae 100644 (file)
@@ -194,8 +194,9 @@ spv_writer_open_file (struct spv_writer *w)
 
   time_t t = time (NULL);
   struct tm *tm = gmtime (&t);
-  char *tm_s = asctime (tm);
-  write_attr (w, "creation-date-time", tm_s);
+  char tm_s[128];
+  if (strftime (tm_s, sizeof tm_s, "%x %X", tm))
+    write_attr (w, "creation-date-time", tm_s);
 
   write_attr (w, "creator", version);
 
@@ -234,6 +235,8 @@ spv_writer_open_heading (struct spv_writer *w, const struct output_item *item)
   start_elem (w, "heading");
   if (item->command_name)
     write_attr (w, "commandName", item->command_name);
+  if (!item->show)
+    write_attr (w, "visibility", "collapsed");
   /* XXX locale */
   /* XXX olang */
 
@@ -280,7 +283,7 @@ open_container (struct spv_writer *w, const struct output_item *item,
                 const char *inner_elem)
 {
   start_elem (w, "container");
-  write_attr (w, "visibility", "visible");
+  write_attr (w, "visibility", item->show ? "visible" : "hidden");
   if (w->need_page_break)
     {
       write_attr (w, "page-break-before", "always");
@@ -555,20 +558,25 @@ static void
 put_value_mod (struct buf *buf, const struct pivot_value *value,
                const char *template)
 {
-  if (value->n_footnotes || value->n_subscripts
-      || template || value->font_style || value->cell_style)
+  if ((value->ex
+       && (value->ex->n_footnotes
+           || value->ex->n_subscripts
+           || value->ex->font_style
+           || value->ex->cell_style))
+      || template)
     {
+      const struct pivot_value_ex *ex = pivot_value_ex (value);
       put_byte (buf, 0x31);
 
       /* Footnotes. */
-      put_u32 (buf, value->n_footnotes);
-      for (size_t i = 0; i < value->n_footnotes; i++)
-        put_u16 (buf, value->footnote_indexes[i]);
+      put_u32 (buf, ex->n_footnotes);
+      for (size_t i = 0; i < ex->n_footnotes; i++)
+        put_u16 (buf, ex->footnote_indexes[i]);
 
       /* Subscripts. */
-      put_u32 (buf, value->n_subscripts);
-      for (size_t i = 0; i < value->n_subscripts; i++)
-        put_string (buf, value->subscripts[i]);
+      put_u32 (buf, ex->n_subscripts);
+      for (size_t i = 0; i < ex->n_subscripts; i++)
+        put_string (buf, ex->subscripts[i]);
 
       /* Template and style. */
       uint32_t v3_start = start_count (buf);
@@ -582,7 +590,7 @@ put_value_mod (struct buf *buf, const struct pivot_value *value,
           put_string (buf, template);
         }
       end_count_u32 (buf, template_string_start);
-      put_style_pair (buf, value->font_style, value->cell_style);
+      put_style_pair (buf, ex->font_style, ex->cell_style);
       end_count_u32 (buf, v3_start);
     }
   else
@@ -641,9 +649,10 @@ put_value (struct buf *buf, const struct pivot_value *value)
       put_value_mod (buf, value, NULL);
       size_t len = strlen (value->string.s);
       if (value->string.hex)
-        put_format (buf, &(struct fmt_spec) { FMT_AHEX, len * 2, 0 }, false);
+        put_format (buf, &(struct fmt_spec) { .type = FMT_AHEX, .w = len * 2 },
+                    false);
       else
-        put_format (buf, &(struct fmt_spec) { FMT_A, len, 0 }, false);
+        put_format (buf, &(struct fmt_spec) { .type = FMT_A, .w = len }, false);
       put_string (buf, value->string.value_label);
       put_string (buf, value->string.var_name);
       put_show_values (buf, value->string.show);
@@ -790,7 +799,10 @@ put_y1 (struct buf *buf, const struct pivot_table *table)
   put_string (buf, table->language);
   put_string (buf, "UTF-8");    /* XXX */
   put_string (buf, table->locale);
-  put_bytes (buf, "\0\0\1\1", 4);
+  put_bool (buf, false);        /* x10 */
+  put_bool (buf, table->settings.include_leading_zero);
+  put_bool (buf, true);         /* x12 */
+  put_bool (buf, true);         /* x13 */
   put_y0 (buf, table);
 }
 
@@ -1104,11 +1116,10 @@ spv_writer_write (struct spv_writer *w, const struct output_item *item)
       }
       break;
 
-    case OUTPUT_ITEM_GROUP_OPEN:
+    case OUTPUT_ITEM_GROUP:
       spv_writer_open_heading (w, item);
-      break;
-
-    case OUTPUT_ITEM_GROUP_CLOSE:
+      for (size_t i = 0; i < item->group.n_children; i++)
+        spv_writer_write (w, item->group.children[i]);
       spv_writer_close_heading (w);
       break;
 
@@ -1125,11 +1136,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;
@@ -1139,3 +1145,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);
+}