char *chart_file_name;
FILE *file;
- size_t chart_cnt;
+ size_t n_charts;
struct ll_list preamble_list;
struct ll_list token_list;
return UP_CAST (driver, struct tex_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 *
tex_create (struct file_handle *fh, enum settings_output_devices device_type,
- struct string_map *o)
+ struct driver_options *o)
{
- struct output_driver *d;
- struct tex_driver *tex = XZALLOC (struct tex_driver);
- hmap_init (&tex->macros);
- ll_init (&tex->preamble_list);
- ll_init (&tex->token_list);
-
- d = &tex->driver;
- output_driver_init (&tex->driver, &tex_driver_class, fh_get_file_name (fh),
- device_type);
- tex->handle = fh;
- tex->chart_file_name = parse_chart_file_name (opt (d, o, "charts",
- fh_get_file_name (fh)));
- tex->chart_cnt = 1;
- tex->bg = parse_color (opt (d, o, "background-color", "#FFFFFFFFFFFF"));
- tex->fg = parse_color (opt (d, o, "foreground-color", "#000000000000"));
-
- tex->file = fn_open (tex->handle, "w");
- if (tex->file == NULL)
+ FILE *file = fn_open (fh, "w");
+ if (!file)
{
msg_error (errno, _("error opening output file `%s'"),
- fh_get_file_name (tex->handle));
- goto error;
+ fh_get_file_name (fh));
+ return NULL;
}
- return d;
-
- error:
- output_driver_destroy (d);
- return NULL;
+ struct tex_driver *tex = xmalloc (sizeof *tex);
+ *tex = (struct tex_driver) {
+ .driver = {
+ .class = &tex_driver_class,
+ .name = xstrdup (fh_get_file_name (fh)),
+ .device_type = device_type,
+ },
+ .macros = HMAP_INITIALIZER (tex->macros),
+ .bg = parse_color (opt (o, "background-color", "#FFFFFFFFFFFF")),
+ .fg = parse_color (opt (o, "foreground-color", "#000000000000")),
+ .handle = fh,
+ .chart_file_name = parse_chart_file_name (opt (o, "charts",
+ fh_get_file_name (fh))),
+ .file = file,
+ .n_charts = 1,
+ .preamble_list = LL_INITIALIZER (tex->preamble_list),
+ .token_list = LL_INITIALIZER (tex->token_list),
+ };
+ return &tex->driver;
}
if (nt->cat == CAT_SPACE || nt->cat == CAT_EOL)
break;
if (prev_x && (prev_x->cat == CAT_COMMENT) && (nt->cat != CAT_COMMENT))
- break;
+ {
+ ds_destroy (&prev_x->str);
+ free (prev_x);
+ break;
+ }
word_len += ds_length (&nt->str);
prev_x = nt;
}
{
fputs ("\n", file);
line_len = 0;
+ if (tt)
+ {
+ ds_destroy (&tt->str);
+ free (tt);
+ }
continue;
}
}
{
char *file_name = xr_draw_png_chart (item->chart,
tex->chart_file_name,
- tex->chart_cnt++,
+ tex->n_charts++,
&tex->fg, &tex->bg);
if (file_name != NULL)
{
}
break;
- case OUTPUT_ITEM_GROUP_OPEN:
- break;
-
- case OUTPUT_ITEM_GROUP_CLOSE:
+ case OUTPUT_ITEM_GROUP:
break;
case OUTPUT_ITEM_IMAGE:
{
char *file_name = xr_write_png_image (
- item->image, tex->chart_file_name, tex->chart_cnt++);
+ item->image, tex->chart_file_name, tex->n_charts++);
if (file_name != NULL)
{
shipout (&tex->token_list, "\\includegraphics{%s}\n", file_name);
case OUTPUT_ITEM_PAGE_BREAK:
break;
- case OUTPUT_ITEM_PAGE_SETUP:
- break;
-
case OUTPUT_ITEM_TABLE:
tex_output_table (tex, item->table);
break;
static void
tex_put_footnote_markers (struct tex_driver *tex,
const struct pivot_table *pt,
- const size_t *footnote_indexes,
- size_t n_footnotes)
+ const struct pivot_value_ex *ex)
{
size_t n_visible = 0;
- for (size_t i = 0; i < n_footnotes; i++)
+ for (size_t i = 0; i < ex->n_footnotes; i++)
{
- const struct pivot_footnote *f = pt->footnotes[footnote_indexes[i]];
+ const struct pivot_footnote *f = pt->footnotes[ex->footnote_indexes[i]];
if (f->show)
{
if (!n_visible++)
tex_escape_string (tex, ds_cstr (&s), false);
ds_destroy (&s);
- tex_put_footnote_markers (tex, pt,
- cell->value->footnote_indexes,
- cell->value->n_footnotes);
+ tex_put_footnote_markers (tex, pt, pivot_value_ex (cell->value));
}
static void
for (int y = 0; y < body->n[V]; y++)
{
enum { H = TABLE_HORZ, V = TABLE_VERT };
- bool is_column_header = y < body->h[V][0] || y >= body->n[V] - body->h[V][1];
+ bool is_column_header = y < body->h[V] || y >= body->n[V];
int prev_x = -1;
int skipped = 0;
for (int x = 0; x < body->n[H];)
tex_escape_string (tex, ds_cstr (&s), true);
ds_destroy (&s);
- tex_put_footnote_markers (tex, pt, cell.value->footnote_indexes,
- cell.value->n_footnotes);
+ tex_put_footnote_markers (tex, pt, pivot_value_ex (cell.value));
if (halign == TABLE_HALIGN_CENTER || halign == TABLE_HALIGN_RIGHT)
{
shipout (&tex->token_list, "}");
static const struct output_driver_class tex_driver_class =
{
- "tex",
- tex_destroy,
- tex_submit,
- NULL,
+ .name = "tex",
+ .destroy = tex_destroy,
+ .submit = tex_submit,
};