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.
26 #include "libpspp/compiler.h"
27 #include "output/table.h"
28 #include "data/format.h"
30 #define TAB_STYLE_MASK (7u << (TAB_FIRST_AVAILABLE + 1))
31 #define TAB_STYLE_SHIFT (TAB_FIRST_AVAILABLE + 1)
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. */
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. */
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
58 struct pool *container;
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];
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];
76 struct tab_table *tab_cast (const struct table *);
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); }
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); }
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);
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);
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,
108 PRINTF_FORMAT (5, 6);
110 void tab_joint_text (struct tab_table *, int x1, int y1, int x2, int y2,
111 unsigned opt, const char *);
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 *);
119 void tab_add_style (struct tab_table *, int x, int y,
120 const struct area_style *);
122 bool tab_cell_is_empty (const struct tab_table *, int c, int r);
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);
129 #endif /* output/tab.h */