output: Expand footnote support.
[pspp] / tests / output / render-test.c
index a8c912835fa942adf046222c9e0fcc31643cd4a0..2a874d1c917c7f3948db1cf35811c7e0e0799473 100644 (file)
@@ -56,6 +56,9 @@ static int render_stdout = true;
 /* --pdf: Also render PDF output. */
 static int render_pdf;
 
+/* --csv: Also render CSV output. */
+static int render_csv;
+
 /* ASCII driver, for ASCII driver test mode. */
 static struct output_driver *ascii_driver;
 
@@ -64,7 +67,7 @@ static const char *output_base = "render";
 
 static const char *parse_options (int argc, char **argv);
 static void usage (void) NO_RETURN;
-static struct table *read_table (FILE *, struct table **tables, size_t n_tables);
+static struct table *read_table (FILE *);
 static void draw (FILE *);
 
 int
@@ -100,7 +103,7 @@ main (int argc, char **argv)
           if (n_tables >= allocated_tables)
             tables = x2nrealloc (tables, &allocated_tables, sizeof *tables);
 
-          tables[n_tables] = read_table (input, tables, n_tables);
+          tables[n_tables] = read_table (input);
           n_tables++;
 
           ch = getc (input);
@@ -112,7 +115,8 @@ main (int argc, char **argv)
       table = tables[n_tables - 1];
       if (transpose)
         table = table_transpose (table);
-      table_item_submit (table_item_create (table, NULL));
+      table_item_submit (table_item_create (table, NULL, NULL));
+      free (tables);
     }
   else
     draw (input);
@@ -136,15 +140,9 @@ configure_drivers (int width, int length, int min_break)
   string_map_insert (&options, "output-file", "-");
   string_map_insert_nocopy (&options, xstrdup ("width"),
                             xasprintf ("%d", width));
-  string_map_insert_nocopy (&options, xstrdup ("length"),
-                            xasprintf ("%d", length));
   if (min_break >= 0)
-    {
-      string_map_insert_nocopy (&options, xstrdup ("min-hbreak"),
-                                xasprintf ("%d", min_break));
-      string_map_insert_nocopy (&options, xstrdup ("min-vbreak"),
-                                xasprintf ("%d", min_break));
-    }
+    string_map_insert_nocopy (&options, xstrdup ("min-hbreak"),
+                              xasprintf ("%d", min_break));
   if (emphasis != NULL)
     string_map_insert (&options, "emphasis", emphasis);
   if (box != NULL)
@@ -206,6 +204,18 @@ configure_drivers (int width, int length, int min_break)
     }
 #endif
 
+  /* Render to <base>.csv. */
+  if (render_csv)
+    {
+      string_map_clear (&options);
+      string_map_insert_nocopy (&options, xstrdup ("output-file"),
+                                 xasprintf ("%s.csv", output_base));
+      driver = output_driver_create (&options);
+      if (driver == NULL)
+        exit (EXIT_FAILURE);
+      output_driver_register (driver);
+    }
+
   /* Render to <base>.odt. */
   string_map_replace_nocopy (&options, xstrdup ("output-file"),
                              xasprintf ("%s.odt", output_base));
@@ -246,6 +256,7 @@ parse_options (int argc, char **argv)
           {"no-txt", no_argument, &render_txt, 0},
           {"no-stdout", no_argument, &render_stdout, 0},
           {"pdf", no_argument, &render_pdf, 1},
+          {"csv", no_argument, &render_csv, 1},
           {"output", required_argument, NULL, 'o'},
           {"help", no_argument, NULL, OPT_HELP},
           {NULL, 0, NULL, 0},
@@ -334,7 +345,7 @@ replace_newlines (char *p)
 }
 
 static struct table *
-read_table (FILE *stream, struct table **tables, size_t n_tables)
+read_table (FILE *stream)
 {
   struct tab_table *tab;
   char buffer[1024];
@@ -342,6 +353,7 @@ read_table (FILE *stream, struct table **tables, size_t n_tables)
   int n_input = 0;
   int nr, nc, hl, hr, ht, hb;
   int r, c;
+  size_t n_footnotes = 0;
 
   if (fgets (buffer, sizeof buffer, stream) == NULL
       || (n_input = sscanf (buffer, "%d %d %d %d %d %d",
@@ -364,7 +376,6 @@ read_table (FILE *stream, struct table **tables, size_t n_tables)
         {
           unsigned int opt;
           char *new_line;
-          unsigned int i;
           char *text;
           int rs, cs;
 
@@ -435,33 +446,22 @@ read_table (FILE *stream, struct table **tables, size_t n_tables)
 
           replace_newlines (text);
 
-          if (sscanf (text, "{%u}", &i) == 1)
-            {
-              struct table *table;
-
-              if (i >= n_tables)
-                error (1, 0, "bad table number %u", i);
-              table = table_ref (tables[i]);
-
-              text = strchr (text, '}') + 1;
-              while (*text)
-                switch (*text++)
-                  {
-                  case 's':
-                    table = table_stomp (table);
-                    break;
-
-                  case 't':
-                    table = table_transpose (table);
-                    break;
-
-                  default:
-                    error (1, 0, "unexpected subtable modifier \"%c\"", *text);
-                  }
-              tab_subtable (tab, c, r, c + cs - 1, r + rs - 1, opt, table);
-            }
-          else
-            tab_joint_text (tab, c, r, c + cs - 1, r + rs - 1, opt, text);
+          char *pos = text;
+          char *content;
+          int i;
+
+          for (i = 0; (content = strsep (&pos, "#")) != NULL; i++)
+            if (!i)
+              tab_joint_text (tab, c, r, c + cs - 1, r + rs - 1, opt,
+                              content);
+            else
+              {
+                char marker[2] = { 'a' + n_footnotes, '\0' };
+                struct footnote *f = tab_create_footnote (
+                  tab, n_footnotes, content, marker);
+                tab_add_footnote (tab, c, r, f);
+                n_footnotes++;
+              }
         }
 
   return &tab->table;
@@ -491,4 +491,5 @@ draw (FILE *stream)
       else
         error (1, 0, "line %d has invalid format", line);
     }
+  ascii_test_flush (ascii_driver);
 }