X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fdata-io%2Fprint.c;h=c0fc3d84f115bfbeebcb761ad880ab2ab16b1f33;hb=510cc9dd9baf3108ba55cfb7893384517c9930b4;hp=7781a317b6a872fd2e15faf4062f7fad2f0ad1fa;hpb=eb06da6a334bc37108cdce9bfc7f26cfcb2003ee;p=pspp diff --git a/src/language/data-io/print.c b/src/language/data-io/print.c index 7781a317b6..c0fc3d84f1 100644 --- a/src/language/data-io/print.c +++ b/src/language/data-io/print.c @@ -40,12 +40,15 @@ #include "libpspp/misc.h" #include "libpspp/pool.h" #include "libpspp/u8-line.h" -#include "output/tab.h" -#include "output/text-item.h" +#include "output/driver.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. */ @@ -75,12 +78,6 @@ struct prt_out_spec 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 { @@ -105,7 +102,7 @@ static trns_proc_func print_text_trns_proc, print_binary_trns_proc; 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 *); /* Basic parsing. */ @@ -178,7 +175,7 @@ internal_cmd_print (struct lexer *lexer, struct dataset *ds, { lex_match (lexer, T_EQUALS); lex_match (lexer, T_LPAREN); - if (!lex_force_int (lexer)) + if (!lex_force_int_range (lexer, "RECORDS", 0, INT_MAX)) goto error; trns->record_cnt = lex_integer (lexer); lex_get (lexer); @@ -239,7 +236,7 @@ internal_cmd_print (struct lexer *lexer, struct dataset *ds, /* 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, @@ -431,59 +428,43 @@ parse_variable_argument (struct lexer *lexer, const struct dictionary *dict, /* 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); } /* Transformation, for all-text output. */ @@ -524,7 +505,7 @@ print_text_trns_proc (void *trns_, struct ccase **c, 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; @@ -575,14 +556,14 @@ print_text_flush_records (struct print_trns *trns, struct u8_line *line, { *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_log ("%s", ds_cstr (&line->s) + 1); else { size_t len = ds_length (&line->s); @@ -594,14 +575,7 @@ print_text_flush_records (struct print_trns *trns, struct u8_line *line, len--; } - if (is_encoding_utf8 (trns->encoding)) - dfm_put_record (trns->writer, s, len); - else - { - char *recoded = recode_string (trns->encoding, UTF8, s, len); - dfm_put_record (trns->writer, recoded, strlen (recoded)); - free (recoded); - } + dfm_put_record_utf8 (trns->writer, s, len); } } } @@ -636,7 +610,8 @@ print_binary_trns_proc (void *trns_, struct ccase **c, 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)