+/* A table. */
+struct table
+ {
+ struct pool *container;
+
+ /* Table size.
+
+ n[TABLE_HORZ]: Number of columns.
+ n[TABLE_VERT]: Number of rows. */
+ int n[TABLE_N_AXES];
+
+ /* Table headers.
+
+ Rows at the top and bottom of a table and columns at the left and right
+ edges of a table can be designated as headers. If the table must be
+ broken across more than one page for output, headers rows and columns
+ are repeated on each page.
+
+ h[TABLE_HORZ][0]: Left header columns.
+ h[TABLE_HORZ][1]: Right header columns.
+ h[TABLE_VERT][0]: Top header rows.
+ h[TABLE_VERT][1]: Bottom header rows. */
+ int h[TABLE_N_AXES][2];
+
+ /* Reference count. A table may be shared between multiple owners,
+ indicated by a reference count greater than 1. When this is the case,
+ the table must not be modified. */
+ int ref_cnt;
+
+ /* Table contents.
+
+ Each array element in cc[] is ordinarily a "struct pivot_value *". If
+ TABLE_CELL_JOIN is set in cp[] for the element, however, it is a joined
+ cell and the corresponding element of cc[] points to a struct
+ table_cell. */
+ void **cc; /* Cell contents; void *[nr][nc]. */
+ unsigned char *cp; /* Cell properties; unsigned char[nr][nc]. */
+ struct table_area_style *styles[8];
+
+ /* Rules. */
+ unsigned char *rh; /* Horiz rules; unsigned char[nr+1][nc]. */
+ unsigned char *rv; /* Vert rules; unsigned char[nr][nc+1]. */
+ struct table_border_style *borders;
+ size_t n_borders;
+ };
+
+/* Reference counting. */
+struct table *table_ref (const struct table *);
+void table_unref (struct table *);
+bool table_is_shared (const struct table *);
+
+/* 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);
+