table-item: Remove barely used parameters from table_item_create().
[pspp] / tests / output / render-test.c
index 2a874d1c917c7f3948db1cf35811c7e0e0799473..c382ee12c5ef307e51c03deca6fd3cc4f98f5e71 100644 (file)
 #include <stdio.h>
 #include <string.h>
 
+#include "data/file-handle-def.h"
 #include "libpspp/assertion.h"
 #include "libpspp/compiler.h"
+#include "libpspp/i18n.h"
 #include "libpspp/string-map.h"
 #include "output/ascii.h"
 #include "output/driver.h"
-#include "output/tab.h"
+#include "output/table.h"
 #include "output/table-item.h"
 
 #include "gl/error.h"
 #include "gl/xalloc.h"
 #include "gl/xvasprintf.h"
 
-/* --transpose: Transpose the table before outputting? */
-static int transpose;
-
 /* --emphasis: ASCII driver emphasis option. */
-static char *emphasis;
+static bool bold;
+static bool underline;
 
 /* --box: ASCII driver box option. */
 static char *box;
@@ -77,6 +77,7 @@ main (int argc, char **argv)
   FILE *input;
 
   set_program_name (argv[0]);
+  i18n_init ();
   output_engine_push ();
   input_file_name = parse_options (argc, argv);
 
@@ -113,9 +114,7 @@ main (int argc, char **argv)
         }
 
       table = tables[n_tables - 1];
-      if (transpose)
-        table = table_transpose (table);
-      table_item_submit (table_item_create (table, NULL, NULL));
+      table_item_submit (table_item_create (table));
       free (tables);
     }
   else
@@ -125,6 +124,7 @@ main (int argc, char **argv)
     fclose (input);
 
   output_engine_pop ();
+  fh_done ();
 
   return 0;
 }
@@ -143,8 +143,8 @@ configure_drivers (int width, int length, int min_break)
   if (min_break >= 0)
     string_map_insert_nocopy (&options, xstrdup ("min-hbreak"),
                               xasprintf ("%d", min_break));
-  if (emphasis != NULL)
-    string_map_insert (&options, "emphasis", emphasis);
+  if (bold || underline)
+    string_map_insert (&options, "emphasis", "true");
   if (box != NULL)
     string_map_insert (&options, "box", box);
 
@@ -249,7 +249,6 @@ parse_options (int argc, char **argv)
           {"width", required_argument, NULL, OPT_WIDTH},
           {"length", required_argument, NULL, OPT_LENGTH},
           {"min-break", required_argument, NULL, OPT_MIN_BREAK},
-          {"transpose", no_argument, &transpose, 1},
           {"emphasis", required_argument, NULL, OPT_EMPHASIS},
           {"box", required_argument, NULL, OPT_BOX},
           {"draw-mode", no_argument, &draw_mode, 1},
@@ -281,7 +280,23 @@ parse_options (int argc, char **argv)
           break;
 
         case OPT_EMPHASIS:
-          emphasis = optarg;
+          if (!strcmp (optarg, "bold"))
+            {
+              bold = true;
+              underline = false;
+            }
+          else if (!strcmp (optarg, "underline"))
+            {
+              bold = false;
+              underline = true;
+            }
+          else if (!strcmp (optarg, "none"))
+            {
+              bold = underline = false;
+            }
+          else
+            error (1, 0, "argument to --emphasis must be \"bold\" or "
+                   "\"underline\" or \"none\"");
           break;
 
         case OPT_BOX:
@@ -333,7 +348,7 @@ replace_newlines (char *p)
 {
   char *q;
 
-  for (q = p; *p != '\0'; )
+  for (q = p; *p != '\0';)
     if (*p == '\\' && p[1] == 'n')
       {
         *q++ = '\n';
@@ -347,7 +362,7 @@ replace_newlines (char *p)
 static struct table *
 read_table (FILE *stream)
 {
-  struct tab_table *tab;
+  struct table *tab;
   char buffer[1024];
   int input[6];
   int n_input = 0;
@@ -368,13 +383,11 @@ read_table (FILE *stream)
   ht = n_input >= 5 ? input[4] : 0;
   hb = n_input >= 6 ? input[5] : 0;
 
-  tab = tab_create (nc, nr);
-  tab_headers (tab, hl, hr, ht, hb);
+  tab = table_create (nc, nr, hl, hr, ht, hb);
   for (r = 0; r < nr; r++)
     for (c = 0; c < nc; c++)
-      if (tab_cell_is_empty (tab, c, r))
+      if (table_cell_is_empty (tab, c, r))
         {
-          unsigned int opt;
           char *new_line;
           char *text;
           int rs, cs;
@@ -400,44 +413,49 @@ read_table (FILE *stream)
               cs = 1;
             }
 
-          opt = 0;
+#define S(H) { TABLE_AREA_STYLE_INITIALIZER__, .cell_style.halign = H }
+          static const struct table_area_style left_style
+            = S (TABLE_HALIGN_LEFT);
+          static const struct table_area_style right_style
+            = S (TABLE_HALIGN_RIGHT);
+          static const struct table_area_style center_style
+            = S (TABLE_HALIGN_CENTER);
+
+          const struct table_area_style *style = &right_style;
           while (*text && strchr ("<>^,@()|", *text))
             switch (*text++)
               {
               case '<':
-                tab_vline (tab, TAL_1, c, r, r + rs - 1);
+                table_vline (tab, TABLE_STROKE_SOLID, c, r, r + rs - 1);
                 break;
 
               case '>':
-                tab_vline (tab, TAL_1, c + cs, r, r + rs - 1);
+                table_vline (tab, TABLE_STROKE_SOLID, c + cs, r, r + rs - 1);
                 break;
 
               case '^':
-                tab_hline (tab, TAL_1, c, c + cs - 1, r);
+                table_hline (tab, TABLE_STROKE_SOLID, c, c + cs - 1, r);
                 break;
 
               case ',':
-                tab_hline (tab, TAL_1, c, c + cs - 1, r + rs);
+                table_hline (tab, TABLE_STROKE_SOLID, c, c + cs - 1, r + rs);
                 break;
 
               case '@':
-                tab_box (tab, TAL_1, TAL_1, -1, -1, c, r,
-                         c + cs - 1, r + rs - 1);
+                table_box (tab, TABLE_STROKE_SOLID, TABLE_STROKE_SOLID,
+                           -1, -1, c, r, c + cs - 1, r + rs - 1);
                 break;
 
               case '(':
-                opt &= ~TAB_ALIGNMENT;
-                opt |= TAB_LEFT;
+                style = &left_style;
                 break;
 
               case ')':
-                opt &= ~TAB_ALIGNMENT;
-                opt |= TAB_RIGHT;
+                style = &right_style;
                 break;
 
               case '|':
-                opt &= ~TAB_ALIGNMENT;
-                opt |= TAB_CENTER;
+                style = &center_style;
                 break;
 
               default:
@@ -452,19 +470,25 @@ read_table (FILE *stream)
 
           for (i = 0; (content = strsep (&pos, "#")) != NULL; i++)
             if (!i)
-              tab_joint_text (tab, c, r, c + cs - 1, r + rs - 1, opt,
-                              content);
+              {
+                table_joint_text (tab, c, r, c + cs - 1, r + rs - 1, 0,
+                                  content);
+                table_add_style (tab, c, r,
+                                 CONST_CAST (struct table_area_style *,
+                                             style));
+              }
             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);
+                struct footnote *f = table_create_footnote (
+                  tab, n_footnotes, content, marker,
+                  table_area_style_clone (tab->container, &left_style));
+                table_add_footnote (tab, c, r, f);
                 n_footnotes++;
               }
         }
 
-  return &tab->table;
+  return tab;
 }
 
 static void
@@ -485,7 +509,8 @@ draw (FILE *stream)
         continue;
 
       if (sscanf (buffer, "%d %d %d %[^\n]", &x, &y, &emph, text) == 4)
-        ascii_test_write (ascii_driver, text, x, y, emph ? TAB_EMPH : 0);
+        ascii_test_write (ascii_driver, text, x, y, emph ? bold : false,
+                          emph ? underline : false);
       else if (sscanf (buffer, "set-length %d %d", &y, &length) == 2)
         ascii_test_set_length (ascii_driver, y, length);
       else