X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Ftex.c;h=8a88452ec8a22760c146edd8f4c27e800d54a85b;hb=95cde62bdf5210c1c60dad5598a888b864f93161;hp=1a4f22fe09a3412e6949300a32ee24fc5c83dab7;hpb=6132656980af2e8527e3e83c8418846ef4c478c7;p=pspp diff --git a/src/output/tex.c b/src/output/tex.c index 1a4f22fe09..8a88452ec8 100644 --- a/src/output/tex.c +++ b/src/output/tex.c @@ -75,7 +75,7 @@ struct tex_driver char *chart_file_name; FILE *file; - size_t chart_cnt; + size_t n_charts; struct ll_list preamble_list; struct ll_list token_list; @@ -108,46 +108,43 @@ tex_driver_cast (struct output_driver *driver) 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; } @@ -175,7 +172,11 @@ post_process_tokens (FILE *file, struct ll_list *list) 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; } @@ -184,6 +185,11 @@ post_process_tokens (FILE *file, struct ll_list *list) { fputs ("\n", file); line_len = 0; + if (tt) + { + ds_destroy (&tt->str); + free (tt); + } continue; } } @@ -314,7 +320,7 @@ tex_submit (struct output_driver *driver, const struct output_item *item) { 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) { @@ -334,7 +340,7 @@ tex_submit (struct output_driver *driver, const struct output_item *item) 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);