#include "libpspp/misc.h"
#include "libpspp/pool.h"
#include "libpspp/u8-line.h"
-#include "output/tab.h"
-#include "output/text-item.h"
+#include "output/pivot-table.h"
+#include "output/table.h"
+#include "output/output-item.h"
#include "gl/xalloc.h"
#include "gettext.h"
+#define N_(msgid) msgid
#define _(msgid) gettext (msgid)
/* Describes what to do when an output field is encountered. */
int width; /* Width of 'string', in display columns. */
};
-static inline struct prt_out_spec *
-ll_to_prt_out_spec (struct ll *ll)
-{
- return ll_data (ll, struct prt_out_spec, ll);
-}
-
/* PRINT, PRINT EJECT, WRITE private data structure. */
struct print_trns
{
static trns_free_func print_trns_free;
static bool parse_specs (struct lexer *, struct pool *tmp_pool, struct print_trns *,
struct dictionary *dict, enum which_formats);
-static void dump_table (struct print_trns *, const struct file_handle *);
+static void dump_table (struct print_trns *);
\f
/* Basic parsing. */
}
if (binary && fh == NULL)
{
- msg (SE, _("OUTFILE is required when binary formats are specified."));
+ msg (SE, _("%s is required when binary formats are specified."), "OUTFILE");
goto error;
}
/* Output the variable table if requested. */
if (print_table)
- dump_table (trns, fh);
+ dump_table (trns);
/* Put the transformation in the queue. */
add_transformation (ds,
/* Prints the table produced by the TABLE subcommand to the listing
file. */
static void
-dump_table (struct print_trns *trns, const struct file_handle *fh)
+dump_table (struct print_trns *trns)
{
+ struct pivot_table *table = pivot_table_create (N_("Print Summary"));
+
+ pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Attributes"),
+ N_("Record"), N_("Columns"), N_("Format"));
+
+ struct pivot_dimension *variables = pivot_dimension_create (
+ table, PIVOT_AXIS_ROW, N_("Variable"));
+
struct prt_out_spec *spec;
- struct tab_table *t;
- int spec_cnt;
- int row;
-
- spec_cnt = ll_count (&trns->specs);
- t = tab_create (4, spec_cnt + 1);
- tab_box (t, TAL_1, TAL_1, TAL_0, TAL_1, 0, 0, 3, spec_cnt);
- tab_hline (t, TAL_2, 0, 3, 1);
- tab_headers (t, 0, 0, 1, 0);
- tab_text (t, 0, 0, TAB_CENTER | TAT_TITLE, _("Variable"));
- tab_text (t, 1, 0, TAB_CENTER | TAT_TITLE, _("Record"));
- tab_text (t, 2, 0, TAB_CENTER | TAT_TITLE, _("Columns"));
- tab_text (t, 3, 0, TAB_CENTER | TAT_TITLE, _("Format"));
- row = 1;
ll_for_each (spec, struct prt_out_spec, ll, &trns->specs)
{
+ if (spec->type != PRT_VAR)
+ continue;
+
+ int row = pivot_category_create_leaf (
+ variables->root, pivot_value_new_variable (spec->var));
+
+ pivot_table_put2 (table, 0, row,
+ pivot_value_new_integer (spec->record));
+ int last_column = spec->first_column + spec->format.w - 1;
+ pivot_table_put2 (table, 1, row, pivot_value_new_user_text_nocopy (
+ xasprintf ("%d-%d",
+ spec->first_column, last_column)));
+
char fmt_string[FMT_STRING_LEN_MAX + 1];
- int width;
- switch (spec->type)
- {
- case PRT_LITERAL:
- tab_text_format (t, 0, row, TAB_LEFT | TAB_FIX, "`%.*s'",
- (int) ds_length (&spec->string),
- ds_data (&spec->string));
- width = ds_length (&spec->string);
- break;
- case PRT_VAR:
- tab_text (t, 0, row, TAB_LEFT, var_get_name (spec->var));
- tab_text (t, 3, row, TAB_LEFT | TAB_FIX,
- fmt_to_string (&spec->format, fmt_string));
- width = spec->format.w;
- break;
- default:
- NOT_REACHED ();
- }
- tab_text_format (t, 1, row, 0, "%d", spec->record);
- tab_text_format (t, 2, row, 0, "%3d-%3d",
- spec->first_column, spec->first_column + width - 1);
- row++;
+ pivot_table_put2 (table, 2, row, pivot_value_new_user_text (
+ fmt_to_string (&spec->format, fmt_string), -1));
}
- if (fh != NULL)
- tab_title (t, ngettext ("Writing %zu record to %s.",
- "Writing %zu records to %s.", trns->record_cnt),
- trns->record_cnt, fh_get_name (fh));
- else
- tab_title (t, ngettext ("Writing %zu record.",
- "Writing %zu records.", trns->record_cnt),
- trns->record_cnt);
- tab_submit (t);
+ int row = pivot_category_create_leaf (
+ variables->root, pivot_value_new_text (N_("N of Records")));
+ pivot_table_put2 (table, 0, row,
+ pivot_value_new_integer (trns->record_cnt));
+
+ pivot_table_submit (table);
}
\f
/* Transformation, for all-text output. */
char *s;
s = data_out (input, var_get_encoding (spec->var),
- &spec->format);
+ &spec->format, settings_get_fmt_settings ());
len = strlen (s);
width = u8_width (CHAR_CAST (const uint8_t *, s), len, UTF8);
x1 = x0 + width;
{
*eject = false;
if (trns->writer == NULL)
- text_item_submit (text_item_create (TEXT_ITEM_EJECT_PAGE, ""));
+ output_item_submit (page_break_item_create ());
else
leader = '1';
}
*u8_line_reserve (line, 0, 1, 1) = leader;
if (trns->writer == NULL)
- tab_output_text (TAB_FIX, ds_cstr (&line->s) + 1);
+ output_item_submit (text_item_create (TEXT_ITEM_LOG,
+ ds_cstr (&line->s) + 1,
+ NULL));
else
{
size_t len = ds_length (&line->s);
const union value *input = case_data (*c, spec->var);
if (!spec->sysmis_as_spaces || input->f != SYSMIS)
data_out_recode (input, var_get_encoding (spec->var),
- &spec->format, &line, trns->encoding);
+ &spec->format, settings_get_fmt_settings (),
+ &line, trns->encoding);
else
ds_put_byte_multiple (&line, encoded_space, spec->format.w);
if (spec->add_space)