X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fascii.c;h=6535121d8c0418bcc17686a3985fd00643a7a605;hb=cee6f0eb54144da7034566fa1bcdcee22337ae6a;hp=0efc523d2acd0f7108d1a4083086c5b66d91f797;hpb=a4c6ba6fe1a82efa5968584b274bc096ade11d24;p=pspp diff --git a/src/output/ascii.c b/src/output/ascii.c index 0efc523d2a..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" @@ -48,16 +45,13 @@ #include "libpspp/version.h" #include "output/ascii.h" #include "output/cairo-chart.h" -#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" @@ -316,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; }; @@ -376,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")); @@ -411,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, @@ -555,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)); @@ -580,80 +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)); - 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); + } } - } - 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 = @@ -663,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, @@ -1037,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),