1 /* PSPP - a program for statistical analysis.
2 Copyright (C) 2009, 2011, 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/>. */
19 #include "output/table-provider.h"
21 #include "data/casereader.h"
22 #include "data/data-out.h"
23 #include "data/format.h"
24 #include "libpspp/i18n.h"
26 #include "gl/xalloc.h"
28 struct table_casereader
31 struct casereader *reader;
33 struct fmt_spec format;
36 static const struct table_class table_casereader_class;
38 static struct table_casereader *
39 table_casereader_cast (const struct table *table)
41 assert (table->klass == &table_casereader_class);
42 return UP_CAST (table, struct table_casereader, table);
45 /* Returns a new table that has one column and the same number of rows as
46 READER. Each row in the table is derived from column COLUMN in the same row
47 of READER by formatting with data_out() using the specified FORMAT (which
48 must be a valid format for the column's width).
50 If HEADING is nonnull, adds an additional row above the first row of data
51 that contains HEADING, and sets that row as a header row.
53 The returned table has no rules, except that if HEADING is nonnull, a single
54 line (TAL_1) separates HEADING from the first row if data. */
56 table_from_casereader (const struct casereader *reader, size_t column,
57 const char *heading, const struct fmt_spec *format)
59 struct table_casereader *tc;
62 assert (fmt_check_width_compat (format,
64 casereader_get_proto (reader), column)));
66 tc = xmalloc (sizeof *tc);
68 table_init (t, &table_casereader_class);
70 table_set_nr (t, casereader_count_cases (reader));
71 tc->reader = casereader_project_1 (casereader_clone (reader), column);
77 tc->heading = xstrdup (heading);
78 table_set_nr (t, table_nr (t) + 1);
86 table_casereader_destroy (struct table *t)
88 struct table_casereader *tc = table_casereader_cast (t);
89 casereader_destroy (tc->reader);
95 free_string (void *s_)
102 table_casereader_get_cell (const struct table *t, int x, int y,
103 struct table_cell *cell)
105 struct table_casereader *tc = table_casereader_cast (t);
109 cell->d[TABLE_HORZ][0] = x;
110 cell->d[TABLE_HORZ][1] = x + 1;
111 cell->d[TABLE_VERT][0] = y;
112 cell->d[TABLE_VERT][1] = y + 1;
113 cell->contents = &cell->inline_contents;
114 cell->n_contents = 1;
115 cell->inline_contents.options = TAB_RIGHT;
116 cell->inline_contents.n_footnotes = 0;
117 if (tc->heading != NULL)
121 s = xstrdup (tc->heading);
122 cell->inline_contents.text = s;
123 cell->destructor = free_string;
124 cell->destructor_aux = s;
130 c = casereader_peek (tc->reader, y);
132 s = xstrdup ("I/O Error");
135 s = data_out (case_data_idx (c, 0), UTF8, &tc->format);
138 cell->inline_contents.text = s;
139 cell->destructor = free_string;
140 cell->destructor_aux = s;
144 table_casereader_get_rule (const struct table *t, enum table_axis axis,
146 struct cell_color *color UNUSED)
148 struct table_casereader *tc = table_casereader_cast (t);
149 if (axis == TABLE_VERT)
150 return tc->heading != NULL && y == 1 ? TAL_1 : TAL_0;
155 static const struct table_class table_casereader_class =
157 table_casereader_destroy,
158 table_casereader_get_cell,
159 table_casereader_get_rule,
161 NULL, /* select (XXX) */