message-item: Fix reference counting in message_item_to_text_item().
[pspp] / src / output / table.h
index ea3594b33d7aac1c8c1ea2db1a7091f408072f27..ed8e70123bb74b0894c32c1b6569b98c2d5d884f 100644 (file)
    broken across more than one page, those rows or columns are repeated on each
    page.
 
    broken across more than one page, those rows or columns are repeated on each
    page.
 
-   Every table is an instance of a particular table class that is responsible
-   for keeping track of cell data.  By far the most common table class is
-   struct table (see output/tab.h).  This header also declares some other
-   kinds of table classes, near the end of the file.
-
    A table is not itself an output_item, and thus a table cannot by itself be
    used for output, but they can be embedded inside struct table_item (see
    table-item.h) for that purpose. */
    A table is not itself an output_item, and thus a table cannot by itself be
    used for output, but they can be embedded inside struct table_item (see
    table-item.h) for that purpose. */
@@ -38,6 +33,7 @@
 #include <stdbool.h>
 #include <stdint.h>
 #include <stddef.h>
 #include <stdbool.h>
 #include <stdint.h>
 #include <stddef.h>
+#include "libpspp/compiler.h"
 
 struct casereader;
 struct fmt_spec;
 
 struct casereader;
 struct fmt_spec;
@@ -90,6 +86,15 @@ enum table_stroke
 
 const char *table_stroke_to_string (enum table_stroke);
 
 
 const char *table_stroke_to_string (enum table_stroke);
 
+/* Given strokes A and B, returns a stroke that "combines" them, that is, that
+   gives a reasonable stroke choice for a rule for different reasons should
+   have both styles A and B. */
+static inline int
+table_stroke_combine (enum table_stroke a, enum table_stroke b)
+{
+  return a > b ? a : b;
+}
+
 struct table_border_style
   {
     enum table_stroke stroke;
 struct table_border_style
   {
     enum table_stroke stroke;
@@ -147,25 +152,28 @@ struct font_style
         .fg = { [0] = CELL_COLOR_BLACK, [1] = CELL_COLOR_BLACK},        \
         .bg = { [0] = CELL_COLOR_WHITE, [1] = CELL_COLOR_WHITE},
 
         .fg = { [0] = CELL_COLOR_BLACK, [1] = CELL_COLOR_BLACK},        \
         .bg = { [0] = CELL_COLOR_WHITE, [1] = CELL_COLOR_WHITE},
 
-void font_style_copy (struct font_style *, const struct font_style *);
+void font_style_copy (struct pool *,
+                      struct font_style *, const struct font_style *);
 void font_style_uninit (struct font_style *);
 void font_style_dump (const struct font_style *);
 
 void font_style_uninit (struct font_style *);
 void font_style_dump (const struct font_style *);
 
-struct area_style
+struct table_area_style
   {
     struct cell_style cell_style;
     struct font_style font_style;
   };
 
   {
     struct cell_style cell_style;
     struct font_style font_style;
   };
 
-#define AREA_STYLE_INITIALIZER { AREA_STYLE_INITIALIZER__ }
-#define AREA_STYLE_INITIALIZER__                \
+#define TABLE_AREA_STYLE_INITIALIZER { TABLE_AREA_STYLE_INITIALIZER__ }
+#define TABLE_AREA_STYLE_INITIALIZER__          \
        .cell_style = CELL_STYLE_INITIALIZER,    \
        .font_style = FONT_STYLE_INITIALIZER
 
        .cell_style = CELL_STYLE_INITIALIZER,    \
        .font_style = FONT_STYLE_INITIALIZER
 
-struct area_style *area_style_clone (struct pool *, const struct area_style *);
-void area_style_copy (struct area_style *, const struct area_style *);
-void area_style_uninit (struct area_style *);
-void area_style_free (struct area_style *);
+struct table_area_style *table_area_style_clone (
+  struct pool *, const struct table_area_style *);
+void table_area_style_copy (struct pool *, struct table_area_style *,
+                            const struct table_area_style *);
+void table_area_style_uninit (struct table_area_style *);
+void table_area_style_free (struct table_area_style *);
 
 /* Properties of a table cell. */
 enum
 
 /* Properties of a table cell. */
 enum
@@ -179,45 +187,10 @@ enum
     TAB_STYLE_SHIFT = 5,
     TAB_STYLE_MASK = 7 << TAB_STYLE_SHIFT,
 
     TAB_STYLE_SHIFT = 5,
     TAB_STYLE_MASK = 7 << TAB_STYLE_SHIFT,
 
-    /* Horizontal alignment of cell contents. */
-    TAB_RIGHT      = 0 << 10,
-    TAB_LEFT       = 1 << 10,
-    TAB_CENTER     = 2 << 10,
-    TAB_HALIGN     = 3 << 10, /* Alignment mask. */
-
-    /* Vertical alignment of cell contents. */
-    TAB_TOP        = 0 << 12,
-    TAB_MIDDLE     = 1 << 12,
-    TAB_BOTTOM     = 2 << 12,
-    TAB_VALIGN     = 3 << 12, /* Alignment mask. */
-
     /* Internal use by tab.c only. */
     TAB_JOIN = 1 << 14,
   };
 
     /* Internal use by tab.c only. */
     TAB_JOIN = 1 << 14,
   };
 
-/* Styles for the rules around table cells. */
-enum
-  {
-    TAL_NONE = TABLE_STROKE_NONE,
-#define TAL_0 TAL_NONE
-    TAL_SOLID = TABLE_STROKE_SOLID,
-#define TAL_1 TAL_SOLID
-    TAL_DASHED = TABLE_STROKE_DASHED,
-    TAL_THICK = TABLE_STROKE_THICK,
-    TAL_THIN = TABLE_STROKE_THIN,
-    TAL_DOUBLE = TABLE_STROKE_DOUBLE,
-#define TAL_2 TAL_DOUBLE
-  };
-
-/* Given line styles A and B (each one of the TAL_* enumeration constants
-   above), returns a line style that "combines" them, that is, that gives a
-   reasonable line style choice for a rule for different reasons should have
-   both styles A and B. */
-static inline int table_rule_combine (int a, int b)
-{
-  return a > b ? a : b;
-}
-
 /* A table. */
 struct table
   {
 /* A table. */
 struct table
   {
@@ -249,13 +222,13 @@ struct table
 
     /* Table contents.
 
 
     /* Table contents.
 
-       Each array element in cc[] is ordinarily a "char *" pointer to a
-       string.  If TAB_JOIN (defined in tab.c) is set in ct[] for the element,
+       Each array element in cc[] is ordinarily a "char *" pointer to a string.
+       If TAB_JOIN (defined in table.c) is set in ct[] for the element,
        however, it is a joined cell and the corresponding element of cc[]
        however, it is a joined cell and the corresponding element of cc[]
-       points to a struct tab_joined_cell. */
+       points to a struct table_cell. */
     void **cc;                  /* Cell contents; void *[nr][nc]. */
     unsigned short *ct;                /* Cell types; unsigned short[nr][nc]. */
     void **cc;                  /* Cell contents; void *[nr][nc]. */
     unsigned short *ct;                /* Cell types; unsigned short[nr][nc]. */
-    struct area_style *styles[8];
+    struct table_area_style *styles[8];
 
     /* Rules. */
     unsigned char *rh;         /* Horiz rules; unsigned char[nr+1][nc]. */
 
     /* Rules. */
     unsigned char *rh;         /* Horiz rules; unsigned char[nr+1][nc]. */
@@ -284,10 +257,56 @@ static inline int table_ht (const struct table *t)
         { return t->h[TABLE_VERT][0]; }
 static inline int table_hb (const struct table *t)
         { return t->h[TABLE_VERT][1]; }
         { return t->h[TABLE_VERT][0]; }
 static inline int table_hb (const struct table *t)
         { return t->h[TABLE_VERT][1]; }
-\f
-/* Table classes. */
 
 
-/* Simple kinds of tables. */
+/* Simple kinds of output. */
 struct table *table_from_string (const char *);
 struct table *table_from_string (const char *);
+void table_output_text (int options, const char *string);
+void table_output_text_format (int options, const char *, ...)
+  PRINTF_FORMAT (2, 3);
+
+/* Rule masks. */
+#define TAB_RULE_TYPE_MASK   7
+#define TAB_RULE_TYPE_SHIFT  0
+#define TAB_RULE_STYLE_MASK  (31 << TAB_RULE_STYLE_SHIFT)
+#define TAB_RULE_STYLE_SHIFT 3
+
+/* Tables. */
+struct table *table_create (int nc, int nr, int hl, int hr, int ht, int hb);
+
+/* Rules. */
+void table_hline (struct table *, int style, int x1, int x2, int y);
+void table_vline (struct table *, int style, int x, int y1, int y2);
+void table_box (struct table *, int f_h, int f_v, int i_h, int i_v,
+                int x1, int y1, int x2, int y2);
+
+/* Cells. */
+void table_text (struct table *, int c, int r, unsigned opt, const char *);
+void table_text_format (struct table *, int c, int r, unsigned opt,
+                        const char *, ...)
+  PRINTF_FORMAT (5, 6);
+void table_joint_text (struct table *, int x1, int y1, int x2, int y2,
+                       unsigned opt, const char *);
+
+void table_add_subscripts (struct table *, int x, int y,
+                           char **subscripts, size_t n_subscripts);
+void table_add_superscript (struct table *, int x, int y,
+                            const char *superscript);
+
+/* Footnotes.
+
+   Use table_create_footnote() to create the footnotes themselves, then use
+   table_add_footnote() to create a reference from a table cell to a footnote.
+   There are two steps because a footnote may have multiple references. */
+struct footnote *table_create_footnote (struct table *, size_t idx,
+                                        const char *content,
+                                        const char *marker,
+                                        struct table_area_style *);
+void table_add_footnote (struct table *, int x, int y,
+                         const struct footnote *);
+
+void table_add_style (struct table *, int x, int y,
+                      const struct table_area_style *);
+
+bool table_cell_is_empty (const struct table *, int c, int r);
 
 #endif /* output/table.h */
 
 #endif /* output/table.h */