X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=utilities%2Fpspp-output.c;h=deb2000432e74e6e3a1c605fa3083866dacd4a14;hb=d950831f83004457e69c3e6e44131aef3e57efd3;hp=bd4e895f7a0840a5dc1ae0c8979ed7c8728d0bfb;hpb=f6c9d54318ada2ae21badf52c9caa73fb0d2c514;p=pspp diff --git a/utilities/pspp-output.c b/utilities/pspp-output.c index bd4e895f7a..deb2000432 100644 --- a/utilities/pspp-output.c +++ b/utilities/pspp-output.c @@ -35,6 +35,7 @@ #include "output/spv/spv-legacy-data.h" #include "output/spv/spv-output.h" #include "output/spv/spv-select.h" +#include "output/spv/spv-table-look.h" #include "output/spv/spv.h" #include "output/table-item.h" #include "output/text-item.h" @@ -75,6 +76,9 @@ static bool raw; /* -f, --force: Keep output file even on error. */ static bool force; +/* --table-look: TableLook to replace table style for conversion. */ +static struct pivot_table_look *table_look; + /* Number of warnings issued. */ static size_t n_warnings; @@ -88,10 +92,14 @@ dump_item (const struct spv_item *item) { const char *x = item->xml_member; const char *b = item->bin_member; + + /* The strings below are not marked for translation because they are only + useful to developers. */ char *s = (x && b - ? xasprintf (_("%s and %s:"), x, b) + ? xasprintf ("%s and %s:", x, b) : xasprintf ("%s:", x ? x : b)); - text_item_submit (text_item_create_nocopy (TEXT_ITEM_TITLE, s)); + text_item_submit (text_item_create_nocopy (TEXT_ITEM_TITLE, s, + xstrdup ("Member Names"))); } switch (spv_item_get_type (item)) @@ -264,7 +272,8 @@ dump_heading_transition (const struct spv_item *old, group_close_item_submit (group_close_item_create ()); for (size_t i = common; i < new_path.n; i++) group_open_item_submit (group_open_item_create ( - new_path.nodes[i]->command_id)); + new_path.nodes[i]->command_id, + new_path.nodes[i]->label)); free_path (&old_path); free_path (&new_path); @@ -278,6 +287,9 @@ run_convert (int argc UNUSED, char **argv) if (err) error (1, 0, "%s", err); + if (table_look) + spv_item_set_table_look (spv_get_root (spv), table_look); + output_engine_push (); output_set_filename (argv[1]); string_map_replace (&output_options, "output-file", argv[2]); @@ -318,6 +330,69 @@ run_convert (int argc UNUSED, char **argv) } } +static const struct pivot_table * +get_first_table (const struct spv_reader *spv) +{ + struct spv_item **items; + size_t n_items; + spv_select (spv, criteria, n_criteria, &items, &n_items); + + for (size_t i = 0; i < n_items; i++) + if (spv_item_is_table (items[i])) + { + free (items); + return spv_item_get_table (items[i]); + } + + free (items); + return NULL; +} + +static void +run_get_table_look (int argc UNUSED, char **argv) +{ + struct pivot_table_look *look; + if (strcmp (argv[1], "-")) + { + struct spv_reader *spv; + char *err = spv_open (argv[1], &spv); + if (err) + error (1, 0, "%s", err); + + const struct pivot_table *table = get_first_table (spv); + if (!table) + error (1, 0, "%s: no tables found", argv[1]); + + look = pivot_table_look_ref (pivot_table_get_look (table)); + + spv_close (spv); + } + else + look = pivot_table_look_ref (pivot_table_look_builtin_default ()); + + char *err = spv_table_look_write (argv[2], look); + if (err) + error (1, 0, "%s", err); + + pivot_table_look_unref (look); +} + +static void +run_convert_table_look (int argc UNUSED, char **argv) +{ + struct pivot_table_look *look; + char *err = spv_table_look_read (argv[1], &look); + if (err) + error (1, 0, "%s", err); + + err = spv_table_look_write (argv[2], look); + if (err) + error (1, 0, "%s", err); + + pivot_table_look_unref (look); + free (look); +} + static void run_dump (int argc UNUSED, char **argv) { @@ -665,6 +740,8 @@ static const struct command commands[] = { "detect", 1, 1, run_detect }, { "dir", 1, 1, run_directory }, { "convert", 2, 2, run_convert }, + { "get-table-look", 2, 2, run_get_table_look }, + { "convert-table-look", 2, 2, run_convert_table_look }, /* Undocumented commands. */ { "dump", 1, 1, run_dump }, @@ -746,6 +823,7 @@ main (int argc, char **argv) c->run (argc, argv); + pivot_table_look_unref (table_look); i18n_done (); return n_warnings ? EXIT_FAILURE : EXIT_SUCCESS; @@ -849,6 +927,22 @@ parse_instances (char *arg) } } +static void +parse_nth_commands (char *arg) +{ + struct spv_criteria *c = get_criteria (); + size_t allocated_commands = c->n_commands; + + for (char *token = strtok (arg, ","); token; token = strtok (NULL, ",")) + { + if (c->n_commands >= allocated_commands) + c->commands = x2nrealloc (c->commands, &allocated_commands, + sizeof *c->commands); + + c->commands[c->n_commands++] = atoi (token); + } +} + static void parse_members (const char *arg) { @@ -856,6 +950,16 @@ parse_members (const char *arg) string_array_parse (&cm->members, ss_cstr (arg), ss_cstr (",")); } +static void +parse_table_look (const char *arg) +{ + pivot_table_look_unref (table_look); + + char *error_s = spv_table_look_read (arg, &table_look); + if (error_s) + error (1, 0, "%s", error_s); +} + static void parse_options (int argc, char *argv[]) { @@ -867,6 +971,7 @@ parse_options (int argc, char *argv[]) OPT_SHOW_HIDDEN, OPT_SELECT, OPT_COMMANDS, + OPT_NTH_COMMANDS, OPT_SUBTYPES, OPT_LABELS, OPT_INSTANCES, @@ -875,6 +980,7 @@ parse_options (int argc, char *argv[]) OPT_OR, OPT_SORT, OPT_RAW, + OPT_TABLE_LOOK, }; static const struct option long_options[] = { @@ -882,6 +988,7 @@ parse_options (int argc, char *argv[]) { "show-hidden", no_argument, NULL, OPT_SHOW_HIDDEN }, { "select", required_argument, NULL, OPT_SELECT }, { "commands", required_argument, NULL, OPT_COMMANDS }, + { "nth-commands", required_argument, NULL, OPT_NTH_COMMANDS }, { "subtypes", required_argument, NULL, OPT_SUBTYPES }, { "labels", required_argument, NULL, OPT_LABELS }, { "instances", required_argument, NULL, OPT_INSTANCES }, @@ -894,6 +1001,7 @@ parse_options (int argc, char *argv[]) /* "convert" command options. */ { "force", no_argument, NULL, 'f' }, + { "table-look", required_argument, NULL, OPT_TABLE_LOOK }, /* "dump-light-table" command options. */ { "sort", no_argument, NULL, OPT_SORT }, @@ -933,6 +1041,10 @@ parse_options (int argc, char *argv[]) parse_commands (optarg); break; + case OPT_NTH_COMMANDS: + parse_nth_commands (optarg); + break; + case OPT_SUBTYPES: parse_subtypes (optarg); break; @@ -965,6 +1077,10 @@ parse_options (int argc, char *argv[]) raw = true; break; + case OPT_TABLE_LOOK: + parse_table_look (optarg); + break; + case 'f': force = true; break; @@ -1008,11 +1124,14 @@ The following commands are available:\n\ detect FILE Detect whether FILE is an SPV file.\n\ dir FILE List tables and other items in FILE.\n\ convert SOURCE DEST Convert .spv SOURCE to DEST.\n\ + get-table-look SOURCE DEST Copies first selected TableLook into DEST\n\ + convert-table-look SOURCE DEST Copies .tlo or .stt SOURCE into DEST\n\ \n\ Input selection options for \"dir\" and \"convert\":\n\ --select=CLASS... include only some kinds of objects\n\ --select=help print known object classes\n\ --commands=COMMAND... include only specified COMMANDs\n\ + --nth-commands=N... include only the Nth instance of selected commands\n\ --subtypes=SUBTYPE... include only specified SUBTYPEs of output\n\ --labels=LABEL... include only output objects with the given LABELs\n\ --instances=INSTANCE... include only the given object INSTANCEs\n\ @@ -1025,6 +1144,7 @@ The following options override \"convert\" behavior:\n\ -O format=FORMAT set destination format to FORMAT\n\ -O OPTION=VALUE set output option\n\ -f, --force keep output file even given errors\n\ + --table-look=FILE override tables' style with TableLook from FILE\n\ Other options:\n\ --help display this help and exit\n\ --version output version information and exit\n",