table: Simplify interface for number of rows and columns.
[pspp] / src / output / tab.h
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 1997, 1998, 1999, 2000, 2009, 2011, 2014 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 #ifndef OUTPUT_TAB_H
18 #define OUTPUT_TAB_H
19
20 /* Simple table class.
21
22    This is a type of table (see output/table.h) whose content is composed
23    manually by the code that generates it, by filling in cells one by one.
24 */
25
26 #include "libpspp/compiler.h"
27 #include "output/table.h"
28 #include "data/format.h"
29
30 #define TAB_STYLE_MASK (7u << (TAB_FIRST_AVAILABLE + 1))
31 #define TAB_STYLE_SHIFT (TAB_FIRST_AVAILABLE + 1)
32
33 enum
34   {
35     /* Horizontal alignment of cell contents. */
36     TAB_RIGHT      = 0 << (TAB_FIRST_AVAILABLE + 4),
37     TAB_LEFT       = 1 << (TAB_FIRST_AVAILABLE + 4),
38     TAB_CENTER     = 2 << (TAB_FIRST_AVAILABLE + 4),
39     TAB_HALIGN     = 3 << (TAB_FIRST_AVAILABLE + 4), /* Alignment mask. */
40
41     /* Vertical alignment of cell contents. */
42     TAB_TOP        = 0 << (TAB_FIRST_AVAILABLE + 6),
43     TAB_MIDDLE     = 1 << (TAB_FIRST_AVAILABLE + 6),
44     TAB_BOTTOM     = 2 << (TAB_FIRST_AVAILABLE + 6),
45     TAB_VALIGN     = 3 << (TAB_FIRST_AVAILABLE + 6), /* Alignment mask. */
46   };
47
48 /* Rule masks. */
49 #define TAB_RULE_TYPE_MASK   7
50 #define TAB_RULE_TYPE_SHIFT  0
51 #define TAB_RULE_STYLE_MASK  (31 << TAB_RULE_STYLE_SHIFT)
52 #define TAB_RULE_STYLE_SHIFT 3
53
54 /* A table. */
55 struct tab_table
56   {
57     struct table table;
58     struct pool *container;
59
60     /* Table contents.
61
62        Each array element in cc[] is ordinarily a "char *" pointer to a
63        string.  If TAB_JOIN (defined in tab.c) is set in ct[] for the element,
64        however, it is a joined cell and the corresponding element of cc[]
65        points to a struct tab_joined_cell. */
66     void **cc;                  /* Cell contents; void *[nr][nc]. */
67     unsigned short *ct;         /* Cell types; unsigned short[nr][nc]. */
68     struct area_style *styles[8];
69
70     /* Rules. */
71     unsigned char *rh;          /* Horiz rules; unsigned char[nr+1][nc]. */
72     unsigned char *rv;          /* Vert rules; unsigned char[nr][nc+1]. */
73     struct cell_color *rule_colors[32];
74   };
75
76 struct tab_table *tab_cast (const struct table *);
77
78 /* Number of rows or columns in TABLE. */
79 static inline int tab_nr (const struct tab_table *table)
80         { return table_nr (&table->table); }
81 static inline int tab_nc (const struct tab_table *table)
82         { return table_nc (&table->table); }
83
84 /* Number of left/right/top/bottom header columns/rows in TABLE. */
85 static inline int tab_l (const struct tab_table *table)
86         { return table_hl (&table->table); }
87 static inline int tab_r (const struct tab_table *table)
88         { return table_hr (&table->table); }
89 static inline int tab_t (const struct tab_table *table)
90         { return table_ht (&table->table); }
91 static inline int tab_b (const struct tab_table *table)
92         { return table_hb (&table->table); }
93
94 /* Tables. */
95 struct tab_table *tab_create (int nc, int nr);
96 void tab_headers (struct tab_table *, int l, int r, int t, int b);
97
98 /* Rules. */
99 void tab_hline (struct tab_table *, int style, int x1, int x2, int y);
100 void tab_vline (struct tab_table *, int style, int x, int y1, int y2);
101 void tab_box (struct tab_table *, int f_h, int f_v, int i_h, int i_v,
102               int x1, int y1, int x2, int y2);
103
104 /* Cells. */
105 void tab_text (struct tab_table *, int c, int r, unsigned opt, const char *);
106 void tab_text_format (struct tab_table *, int c, int r, unsigned opt,
107                       const char *, ...)
108      PRINTF_FORMAT (5, 6);
109
110 void tab_joint_text (struct tab_table *, int x1, int y1, int x2, int y2,
111                      unsigned opt, const char *);
112
113 struct footnote *tab_create_footnote (struct tab_table *, size_t idx,
114                                       const char *content, const char *marker,
115                                       struct area_style *);
116 void tab_add_footnote (struct tab_table *, int x, int y,
117                        const struct footnote *);
118
119 void tab_add_style (struct tab_table *, int x, int y,
120                     const struct area_style *);
121
122 bool tab_cell_is_empty (const struct tab_table *, int c, int r);
123
124 /* Simple output. */
125 void tab_output_text (int options, const char *string);
126 void tab_output_text_format (int options, const char *, ...)
127      PRINTF_FORMAT (2, 3);
128
129 #endif /* output/tab.h */
130