1 /* PSPP - a program for statistical analysis.
2 Copyright (C) 1997, 1998, 1999, 2000, 2009, 2011, 2014 Free Software Foundation, Inc.
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.
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.
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/>. */
20 /* Simple table class.
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.
25 Some of the features of this type of table are obsolete but have not yet
26 been removed, because some code still uses them. These features are:
28 - The title and caption. These are properties of the table_item (see
29 output/table-item.h) in which a table is embedded, not properties of
32 - Row and columns offsets (via tab_offset(), tab_next_row()). This
33 feature simply isn't used enough to justify keeping it.
35 - Table resizing. The code that does use this feature is just as well
36 served by creating multiple tables and pasting them together with
37 table_paste(). Eliminating this feature would also slightly simplify
41 #include "libpspp/compiler.h"
42 #include "output/table.h"
43 #include "data/format.h"
54 #define TAB_STYLE_MASK (7u << (TAB_FIRST_AVAILABLE + 3))
55 #define TAB_STYLE_SHIFT (TAB_FIRST_AVAILABLE + 3)
58 #define TAB_RULE_TYPE_MASK 7
59 #define TAB_RULE_TYPE_SHIFT 0
60 #define TAB_RULE_STYLE_MASK (31 << TAB_RULE_STYLE_SHIFT)
61 #define TAB_RULE_STYLE_SHIFT 3
67 struct pool *container;
69 /* Table title and caption, or null. */
70 char *title, *caption;
71 int cf; /* Column factor for indexing purposes. */
75 Each array element in cc[] is ordinarily a "char *" pointer to a
76 string. If TAB_JOIN (defined in tab.c) is set in ct[] for the element,
77 however, it is a joined cell and the corresponding element of cc[]
78 points to a struct tab_joined_cell. */
79 void **cc; /* Cell contents; void *[nr][nc]. */
80 unsigned short *ct; /* Cell types; unsigned short[nr][nc]. */
81 struct cell_style *styles[8];
84 unsigned char *rh; /* Horiz rules; unsigned char[nr+1][nc]. */
85 unsigned char *rv; /* Vert rules; unsigned char[nr][nc+1]. */
86 struct cell_color *rule_colors[32];
88 /* X and Y offsets. */
91 struct fmt_spec fmtmap [n_RC];
94 struct tab_table *tab_cast (const struct table *);
96 /* Number of rows or columns in TABLE. */
97 static inline int tab_nr (const struct tab_table *table)
98 { return table_nr (&table->table); }
99 static inline int tab_nc (const struct tab_table *table)
100 { return table_nc (&table->table); }
102 /* Number of left/right/top/bottom header columns/rows in TABLE. */
103 static inline int tab_l (const struct tab_table *table)
104 { return table_hl (&table->table); }
105 static inline int tab_r (const struct tab_table *table)
106 { return table_hr (&table->table); }
107 static inline int tab_t (const struct tab_table *table)
108 { return table_ht (&table->table); }
109 static inline int tab_b (const struct tab_table *table)
110 { return table_hb (&table->table); }
113 struct tab_table *tab_create (int nc, int nr);
114 void tab_resize (struct tab_table *, int nc, int nr);
115 void tab_realloc (struct tab_table *, int nc, int nr);
116 void tab_headers (struct tab_table *, int l, int r, int t, int b);
117 void tab_title (struct tab_table *, const char *, ...)
118 PRINTF_FORMAT (2, 3);
119 void tab_caption (struct tab_table *, const char *, ...)
120 PRINTF_FORMAT (2, 3);
121 void tab_submit (struct tab_table *);
124 void tab_hline (struct tab_table *, int style, int x1, int x2, int y);
125 void tab_vline (struct tab_table *, int style, int x, int y1, int y2);
126 void tab_box (struct tab_table *, int f_h, int f_v, int i_h, int i_v,
127 int x1, int y1, int x2, int y2);
129 /* Obsolete cell options. */
130 #define TAT_TITLE TAB_EMPH /* Title attributes. */
132 void tab_set_format (struct tab_table *, enum result_class, const struct fmt_spec *);
139 void tab_value (struct tab_table *, int c, int r, unsigned short opt,
140 const union value *, const struct variable *,
141 const struct fmt_spec *);
143 void tab_double (struct tab_table *, int c, int r, unsigned short opt,
144 double v, const struct fmt_spec *, enum result_class );
146 void tab_text (struct tab_table *, int c, int r, unsigned opt, const char *);
147 void tab_text_format (struct tab_table *, int c, int r, unsigned opt,
149 PRINTF_FORMAT (5, 6);
151 void tab_joint_text (struct tab_table *, int x1, int y1, int x2, int y2,
152 unsigned opt, const char *);
153 void tab_joint_text_format (struct tab_table *, int x1, int y1, int x2, int y2,
154 unsigned opt, const char *, ...)
155 PRINTF_FORMAT (7, 8);
157 struct footnote *tab_create_footnote (struct tab_table *, size_t idx,
158 const char *content, const char *marker,
159 struct cell_style *);
160 void tab_add_footnote (struct tab_table *, int x, int y,
161 const struct footnote *);
163 void tab_add_style (struct tab_table *, int x, int y,
164 const struct cell_style *);
166 bool tab_cell_is_empty (const struct tab_table *, int c, int r);
169 void tab_offset (struct tab_table *, int col, int row);
170 void tab_next_row (struct tab_table *);
172 /* Current row/column offset. */
173 #define tab_row(TABLE) ((TABLE)->row_ofs)
174 #define tab_col(TABLE) ((TABLE)->col_ofs)
177 void tab_output_text (int options, const char *string);
178 void tab_output_text_format (int options, const char *, ...)
179 PRINTF_FORMAT (2, 3);
181 #endif /* output/tab.h */