X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fcsv.c;h=e6b769b383039c740abdb9c5321c86b5d889724a;hb=95cde62bdf5210c1c60dad5598a888b864f93161;hp=b97bfda6004a3812597601de5905a3251a965f86;hpb=5f894a49a00de93333e64db483c193669c937a45;p=pspp diff --git a/src/output/csv.c b/src/output/csv.c index b97bfda600..e6b769b383 100644 --- a/src/output/csv.c +++ b/src/output/csv.c @@ -26,14 +26,11 @@ #include "libpspp/message.h" #include "libpspp/str.h" #include "libpspp/string-map.h" -#include "output/text-item.h" #include "output/driver-provider.h" #include "output/options.h" -#include "output/message-item.h" -#include "output/page-break-item.h" +#include "output/output-item.h" #include "output/pivot-output.h" #include "output/pivot-table.h" -#include "output/table-item.h" #include "output/table-provider.h" #include "gl/minmax.h" @@ -68,44 +65,46 @@ csv_driver_cast (struct output_driver *driver) return UP_CAST (driver, struct csv_driver, driver); } -static struct driver_option * -opt (struct output_driver *d, struct string_map *options, const char *key, - const char *default_value) +static struct driver_option +opt (struct driver_options *options, const char *key, const char *default_value) { - return driver_option_get (d, options, key, default_value); + return driver_option_get (options, key, default_value); } static struct output_driver * csv_create (struct file_handle *fh, enum settings_output_devices device_type, - struct string_map *o) + struct driver_options *o) { - struct output_driver *d; - struct csv_driver *csv; - char *quote; - - csv = xzalloc (sizeof *csv); - d = &csv->driver; - output_driver_init (&csv->driver, &csv_driver_class, fh_get_file_name (fh), device_type); - - csv->separator = parse_string (opt (d, o, "separator", ",")); - quote = parse_string (opt (d, o, "quote", "\"")); - csv->quote = quote[0]; - free (quote); - csv->quote_set = xasprintf ("\n\r\t%s%c", csv->separator, csv->quote); - csv->titles = parse_boolean (opt (d, o, "titles", "true")); - csv->captions = parse_boolean (opt (d, o, "captions", "true")); - csv->handle = fh; - csv->file = fn_open (fh, "w"); - csv->n_items = 0; - - if (csv->file == NULL) + FILE *file = fn_open (fh, "w"); + if (!file) { msg_error (errno, _("error opening output file `%s'"), fh_get_file_name (fh)); - output_driver_destroy (d); return NULL; } - return d; + char *quote_s = parse_string (opt (o, "quote", "\"")); + int quote = quote_s[0]; + free (quote_s); + + char *separator = parse_string (opt (o, "separator", ",")); + + struct csv_driver *csv = xmalloc (sizeof *csv); + *csv = (struct csv_driver) { + .driver = { + .class = &csv_driver_class, + .name = xstrdup (fh_get_file_name (fh)), + .device_type = device_type, + }, + .separator = separator, + .quote = quote, + .quote_set = xasprintf ("\n\r\t%s%c", separator, quote), + .titles = parse_boolean (opt (o, "titles", "true")), + .captions = parse_boolean (opt (o, "captions", "true")), + .handle = fh, + .file = file, + }; + + return &csv->driver; } static void @@ -184,12 +183,6 @@ csv_output_table_cell (struct csv_driver *csv, const struct pivot_table *pt, if (leader) ds_put_format (&s, "%s: ", leader); pivot_value_format (cell->value, pt, &s); - if (cell->font_style->markup) - { - char *t = output_get_text_from_markup (ds_cstr (&s)); - ds_assign_cstr (&s, t); - free (t); - } csv_output_field (csv, ds_cstr (&s)); ds_destroy (&s); } @@ -245,51 +238,53 @@ csv_output_table_layer (struct csv_driver *csv, const struct pivot_table *pt, static void csv_submit (struct output_driver *driver, - const struct output_item *output_item) + const struct output_item *item) { struct csv_driver *csv = csv_driver_cast (driver); - if (is_table_item (output_item)) + switch (item->type) { - const struct pivot_table *pt = to_table_item (output_item)->pt; + case OUTPUT_ITEM_CHART: + break; - size_t *layer_indexes; - PIVOT_OUTPUT_FOR_EACH_LAYER (layer_indexes, pt, true) - csv_output_table_layer (csv, pt, layer_indexes); - } - else if (is_text_item (output_item)) - { - const struct text_item *text_item = to_text_item (output_item); - enum text_item_type type = text_item_get_type (text_item); - const char *text = text_item_get_text (text_item); + case OUTPUT_ITEM_GROUP: + break; - if (type == TEXT_ITEM_SYNTAX || type == TEXT_ITEM_PAGE_TITLE) - return; + case OUTPUT_ITEM_IMAGE: + break; + case OUTPUT_ITEM_MESSAGE: csv_put_separator (csv); + char *s = msg_to_string (item->message); + csv_output_field (csv, s); + free (s); + putc ('\n', csv->file); + break; - if (text_item->style.markup) - { - char *plain_text = output_get_text_from_markup (text); - csv_output_lines (csv, plain_text); - free (plain_text); - } - else - csv_output_lines (csv, text); - } - else if (is_page_break_item (output_item)) - { + case OUTPUT_ITEM_PAGE_BREAK: csv_put_separator (csv); csv_output_lines (csv, ""); - } - else if (is_message_item (output_item)) - { - const struct message_item *message_item = to_message_item (output_item); - char *s = msg_to_string (message_item_get_msg (message_item)); + break; + + case OUTPUT_ITEM_TABLE: + { + size_t *layer_indexes; + PIVOT_OUTPUT_FOR_EACH_LAYER (layer_indexes, item->table, true) + csv_output_table_layer (csv, item->table, layer_indexes); + } + break; + + case OUTPUT_ITEM_TEXT: + if (item->text.subtype == TEXT_ITEM_SYNTAX + || item->text.subtype == TEXT_ITEM_PAGE_TITLE) + return; + csv_put_separator (csv); - csv_output_field (csv, s); - free (s); - putc ('\n', csv->file); + + char *text = text_item_get_plain_text (item); + csv_output_lines (csv, text); + free (text); + break; } } @@ -297,8 +292,8 @@ struct output_driver_factory csv_driver_factory = { "csv", "-", csv_create }; static const struct output_driver_class csv_driver_class = { - "csv", - csv_destroy, - csv_submit, - csv_flush, + .name = "csv", + .destroy = csv_destroy, + .submit = csv_submit, + .flush = csv_flush, };