#include <uniwidth.h>
#ifdef HAVE_TERMIOS_H
-# include <termios.h>
-#endif
-
-#ifdef GWINSZ_IN_SYS_IOCTL
# include <sys/ioctl.h>
+# include <termios.h>
#endif
#include "data/file-name.h"
#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"
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 {
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;
};
{
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"));
: 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 ())
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,
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));
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 =
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,
};
\f
static char *ascii_reserve (struct ascii_driver *, int y, int x0, int x1,
*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))
.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),