X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fascii.c;h=6535121d8c0418bcc17686a3985fd00643a7a605;hb=2501627caac743acbfcc97480f15344f8a393a6e;hp=b5c9c004b9eb2460b4fb6666ed256a0ee26f12f3;hpb=f8659933d48c5682010d1e1f04ae7acb5cbcd611;p=pspp diff --git a/src/output/ascii.c b/src/output/ascii.c index b5c9c004b9..6535121d8c 100644 --- a/src/output/ascii.c +++ b/src/output/ascii.c @@ -28,11 +28,8 @@ #include #ifdef HAVE_TERMIOS_H -# include -#endif - -#ifdef GWINSZ_IN_SYS_IOCTL # include +# include #endif #include "data/file-name.h" @@ -47,19 +44,14 @@ #include "libpspp/u8-line.h" #include "libpspp/version.h" #include "output/ascii.h" -#ifdef HAVE_CAIRO #include "output/cairo-chart.h" -#endif -#include "output/chart-item-provider.h" +#include "output/chart-provider.h" #include "output/driver-provider.h" -#include "output/image-item.h" -#include "output/message-item.h" #include "output/options.h" #include "output/pivot-output.h" #include "output/pivot-table.h" #include "output/render.h" -#include "output/table-item.h" -#include "output/text-item.h" +#include "output/output-item.h" #include "gl/minmax.h" #include "gl/xalloc.h" @@ -296,11 +288,9 @@ struct ascii_driver bool emphasis; /* Enable bold and underline in output? */ char *chart_file_name; /* Name of files used for charts. */ -#ifdef HAVE_CAIRO /* Colours for charts */ struct cell_color fg; struct cell_color bg; -#endif /* How the page width is determined: */ enum { @@ -320,8 +310,8 @@ struct ascii_driver bool error; /* Output error? */ struct u8_line *lines; /* Page content. */ int allocated_lines; /* Number of lines allocated. */ - int chart_cnt; /* Number of charts so far. */ - int object_cnt; /* Number of objects so far. */ + int n_charts; /* Number of charts so far. */ + int n_objects; /* Number of objects so far. */ const struct pivot_table *pt; struct render_params params; }; @@ -380,9 +370,7 @@ ascii_create (struct file_handle *fh, enum settings_output_devices device_type, { enum { BOX_ASCII, BOX_UNICODE } box; struct output_driver *d; - struct ascii_driver *a; - - a = xzalloc (sizeof *a); + struct ascii_driver *a = XZALLOC (struct ascii_driver); d = &a->driver; output_driver_init (&a->driver, &ascii_driver_class, fh_get_file_name (fh), device_type); a->append = parse_boolean (opt (d, o, "append", "false")); @@ -399,10 +387,8 @@ ascii_create (struct file_handle *fh, enum settings_output_devices device_type, : VIEW_WIDTH); a->min_hbreak = parse_int (opt (d, o, "min-hbreak", "-1"), -1, INT_MAX); -#ifdef HAVE_CAIRO a->bg = parse_color (opt (d, o, "background-color", "#FFFFFFFFFFFF")); a->fg = parse_color (opt (d, o, "foreground-color", "#000000000000")); -#endif const char *default_box = (terminal && (!strcmp (locale_charset (), "UTF-8") || term_is_utf8_xterm ()) @@ -417,8 +403,8 @@ ascii_create (struct file_handle *fh, enum settings_output_devices device_type, a->error = false; a->lines = NULL; a->allocated_lines = 0; - a->chart_cnt = 0; - a->object_cnt = 0; + a->n_charts = 0; + a->n_objects = 0; static const struct render_ops ascii_render_ops = { .draw_line = ascii_draw_line, @@ -561,19 +547,19 @@ ascii_output_lines (struct ascii_driver *a, size_t n_lines) static void ascii_output_table_item (struct ascii_driver *a, - const struct table_item *table_item) + const struct output_item *item) { update_page_size (a, false); - a->pt = table_item->pt; + a->pt = item->table; size_t *layer_indexes; - PIVOT_OUTPUT_FOR_EACH_LAYER (layer_indexes, table_item->pt, true) + PIVOT_OUTPUT_FOR_EACH_LAYER (layer_indexes, item->table, true) { - struct render_pager *p = render_pager_create (&a->params, table_item, + struct render_pager *p = render_pager_create (&a->params, item->table, layer_indexes); for (int i = 0; render_pager_has_next (p); i++) { - if (a->object_cnt++) + if (a->n_objects++) putc ('\n', a->file); ascii_output_lines (a, render_pager_draw_next (p, INT_MAX)); @@ -586,82 +572,82 @@ ascii_output_table_item (struct ascii_driver *a, static void ascii_output_table_item_unref (struct ascii_driver *a, - struct table_item *table_item) + struct output_item *table_item) { ascii_output_table_item (a, table_item); - table_item_unref (table_item); + output_item_unref (table_item); } static void -ascii_submit (struct output_driver *driver, - const struct output_item *output_item) +ascii_submit (struct output_driver *driver, const struct output_item *item) { struct ascii_driver *a = ascii_driver_cast (driver); - if (a->error) return; - if (is_table_item (output_item)) - ascii_output_table_item (a, to_table_item (output_item)); -#ifdef HAVE_CAIRO - else if (is_image_item (output_item) && a->chart_file_name != NULL) + switch (item->type) { - struct image_item *image_item = to_image_item (output_item); - char *file_name = xr_write_png_image ( - image_item->image, a->chart_file_name, ++a->chart_cnt); - if (file_name != NULL) - { - struct text_item *text_item; - - text_item = text_item_create_nocopy ( - TEXT_ITEM_LOG, - xasprintf (_("See %s for an image."), file_name), - NULL); + case OUTPUT_ITEM_TABLE: + ascii_output_table_item (a, item); + break; - ascii_submit (driver, &text_item->output_item); - text_item_unref (text_item); - free (file_name); - } - } - else if (is_chart_item (output_item) && a->chart_file_name != NULL) - { - struct chart_item *chart_item = to_chart_item (output_item); - char *file_name; - - file_name = xr_draw_png_chart (chart_item, a->chart_file_name, - ++a->chart_cnt, - &a->fg, - &a->bg); - if (file_name != NULL) + case OUTPUT_ITEM_IMAGE: + if (a->chart_file_name != NULL) { - struct text_item *text_item; - - text_item = text_item_create_nocopy ( - TEXT_ITEM_LOG, - xasprintf (_("See %s for a chart."), file_name), - NULL); + char *file_name = xr_write_png_image ( + item->image, a->chart_file_name, ++a->n_charts); + if (file_name != NULL) + { + struct output_item *text_item = text_item_create_nocopy ( + TEXT_ITEM_LOG, + xasprintf (_("See %s for an image."), file_name), + NULL); + + ascii_submit (driver, text_item); + output_item_unref (text_item); + free (file_name); + } + } + break; - ascii_submit (driver, &text_item->output_item); - text_item_unref (text_item); - free (file_name); + case OUTPUT_ITEM_CHART: + if (a->chart_file_name != NULL) + { + char *file_name = xr_draw_png_chart ( + item->chart, a->chart_file_name, ++a->n_charts, &a->fg, &a->bg); + if (file_name != NULL) + { + struct output_item *text_item = text_item_create_nocopy ( + TEXT_ITEM_LOG, + xasprintf (_("See %s for a chart."), file_name), + NULL); + + ascii_submit (driver, text_item); + output_item_unref (text_item); + free (file_name); + } } - } -#endif /* HAVE_CAIRO */ - 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); + break; - if (type != TEXT_ITEM_PAGE_TITLE) + case OUTPUT_ITEM_TEXT: + if (item->text.subtype != TEXT_ITEM_PAGE_TITLE) ascii_output_table_item_unref ( - a, text_item_to_table_item (text_item_ref (text_item))); + a, text_item_to_table_item (output_item_ref (item))); + break; + + case OUTPUT_ITEM_MESSAGE: + ascii_output_table_item_unref ( + a, text_item_to_table_item ( + message_item_to_text_item ( + output_item_ref (item)))); + break; + + case OUTPUT_ITEM_GROUP: + break; + + case OUTPUT_ITEM_PAGE_BREAK: + break; } - else if (is_message_item (output_item)) - ascii_output_table_item_unref ( - a, text_item_to_table_item ( - message_item_to_text_item ( - to_message_item ( - output_item_ref (output_item))))); } const struct output_driver_factory txt_driver_factory = @@ -671,10 +657,10 @@ const struct output_driver_factory list_driver_factory = static const struct output_driver_class ascii_driver_class = { - "text", - ascii_destroy, - ascii_submit, - ascii_flush, + .name = "text", + .destroy = ascii_destroy, + .submit = ascii_submit, + .flush = ascii_flush, }; static char *ascii_reserve (struct ascii_driver *, int y, int x0, int x1, @@ -933,7 +919,7 @@ ascii_layout_cell (struct ascii_driver *a, const struct table_cell *cell, *heightp = 0; struct string body = DS_EMPTY_INITIALIZER; - bool numeric = pivot_value_format_body (cell->value, a->pt, &body); + bool numeric = pivot_value_format (cell->value, a->pt, &body); /* Calculate length; if it's zero, then there's nothing to do. */ if (ds_is_empty (&body)) @@ -1045,8 +1031,8 @@ ascii_test_write (struct output_driver *driver, .underline = underline, }; const struct pivot_value value = { - .type = PIVOT_VALUE_TEXT, .text = { + .type = PIVOT_VALUE_TEXT, .local = CONST_CAST (char *, s), .c = CONST_CAST (char *, s), .id = CONST_CAST (char *, s),