1 /* PSPP - a program for statistical analysis.
2 Copyright (C) 1997, 1998, 1999, 2000, 2009, 2013, 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/>. */
17 #ifndef OUTPUT_TABLE_H
18 #define OUTPUT_TABLE_H 1
22 . A table is a rectangular grid of cells. Cells can be joined to form larger
23 cells. Rows and columns can be separated by rules of various types. Rows
24 at the top and bottom of a table and columns at the left and right edges of
25 a table can be designated as headers, which means that if the table must be
26 broken across more than one page, those rows or columns are repeated on each
29 Every table is an instance of a particular table class that is responsible
30 for keeping track of cell data. By far the most common table class is
31 struct tab_table (see output/tab.h). This header also declares some other
32 kinds of table classes, near the end of the file.
34 A table is not itself an output_item, and thus a table cannot by itself be
35 used for output, but they can be embedded inside struct table_item (see
36 table-item.h) for that purpose. */
46 /* Properties of a table cell. */
51 /* Alignment of cell contents. */
52 TAB_RIGHT = 0 << 0, /* Right justify. */
53 TAB_LEFT = 1 << 0, /* Left justify. */
54 TAB_CENTER = 2 << 0, /* Centered. */
55 TAB_ALIGNMENT = 3 << 0, /* Alignment mask. */
57 /* These flags may be combined with any alignment. */
58 TAB_EMPH = 1 << 2, /* Emphasize cell contents. */
59 TAB_FIX = 1 << 3, /* Use fixed font. */
61 /* Bits with values (1 << TAB_FIRST_AVAILABLE) and higher are
62 not used, so they are available for subclasses to use as
64 TAB_FIRST_AVAILABLE = 4
67 /* Styles for the rules around table cells. */
71 TAL_GAP, /* Spacing but no line. */
72 TAL_1, /* Single line. */
73 TAL_2, /* Double line. */
77 /* Given line styles A and B (each one of the TAL_* enumeration constants
78 above), returns a line style that "combines" them, that is, that gives a
79 reasonable line style choice for a rule for different reasons should have
82 Used especially for pasting tables together (see table_paste()). */
83 static inline int table_rule_combine (int a, int b)
90 Many table-related declarations use 2-element arrays in place of "x" and "y"
91 variables. This reduces code duplication significantly, because much table
92 code has treat rows and columns the same way.
94 A lot of code that uses these enumerations assumes that the two values are 0
95 and 1, so don't change them to other values. */
106 const struct table_class *klass;
110 n[TABLE_HORZ]: Number of columns.
111 n[TABLE_VERT]: Number of rows. */
116 Rows at the top and bottom of a table and columns at the left and right
117 edges of a table can be designated as headers. If the table must be
118 broken across more than one page for output, headers rows and columns
119 are repeated on each page.
121 h[TABLE_HORZ][0]: Left header columns.
122 h[TABLE_HORZ][1]: Right header columns.
123 h[TABLE_VERT][0]: Top header rows.
124 h[TABLE_VERT][1]: Bottom header rows. */
125 int h[TABLE_N_AXES][2];
127 /* Reference count. A table may be shared between multiple owners,
128 indicated by a reference count greater than 1. When this is the case,
129 the table must not be modified. */
133 /* Reference counting. */
134 struct table *table_ref (const struct table *);
135 void table_unref (struct table *);
136 bool table_is_shared (const struct table *);
137 struct table *table_unshare (struct table *);
139 /* Returns the number of columns or rows, respectively, in T. */
140 static inline int table_nc (const struct table *t)
141 { return t->n[TABLE_HORZ]; }
142 static inline int table_nr (const struct table *t)
143 { return t->n[TABLE_VERT]; }
145 /* Returns the number of left, right, top, or bottom headers, respectively, in
147 static inline int table_hl (const struct table *t)
148 { return t->h[TABLE_HORZ][0]; }
149 static inline int table_hr (const struct table *t)
150 { return t->h[TABLE_HORZ][1]; }
151 static inline int table_ht (const struct table *t)
152 { return t->h[TABLE_VERT][0]; }
153 static inline int table_hb (const struct table *t)
154 { return t->h[TABLE_VERT][1]; }
157 void table_set_hl (struct table *, int hl);
158 void table_set_hr (struct table *, int hr);
159 void table_set_ht (struct table *, int ht);
160 void table_set_hb (struct table *, int hb);
164 /* Simple kinds of tables. */
165 struct table *table_from_string (unsigned int options, const char *);
166 struct table *table_from_string_span (unsigned int options, const char *,
167 int colspan, int rowspan);
168 struct table *table_from_variables (unsigned int options,
169 struct variable **, size_t);
170 struct table *table_from_casereader (const struct casereader *,
173 const struct fmt_spec *);
174 struct table *table_create_nested (struct table *);
175 struct table *table_create_nested_item (struct table_item *);
177 /* Combining tables. */
178 struct table *table_paste (struct table *, struct table *,
179 enum table_axis orientation);
180 struct table *table_hpaste (struct table *left, struct table *right);
181 struct table *table_vpaste (struct table *top, struct table *bottom);
182 struct table *table_stomp (struct table *);
184 /* Taking subsets of tables. */
185 struct table *table_select (struct table *, int rect[TABLE_N_AXES][2]);
186 struct table *table_select_slice (struct table *, enum table_axis,
187 int z0, int z1, bool add_headers);
188 struct table *table_select_columns (struct table *,
189 int x0, int x1, bool add_headers);
190 struct table *table_select_rows (struct table *,
191 int y0, int y1, bool add_headers);
193 /* Miscellaneous table operations. */
194 struct table *table_transpose (struct table *);
196 #endif /* output/table.h */