output: Modernize how drivers are initialized.
[pspp] / src / output / tex.c
index 698abaa453347e04cb877fd44bc8ea19a9707362..4ffe33b1f9954e3b8edb51f277a06119a086148c 100644 (file)
@@ -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;
@@ -109,45 +109,42 @@ tex_driver_cast (struct output_driver *driver)
 }
 
 static struct driver_option *
-opt (struct output_driver *d, struct string_map *options, const char *key,
-     const char *default_value)
+opt (struct string_map *options, const char *key, const char *default_value)
 {
-  return driver_option_get (d, options, key, default_value);
+  return driver_option_get ("tex", 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 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)
             {
@@ -329,12 +335,12 @@ tex_submit (struct output_driver *driver, const struct output_item *item)
       break;
 
     case OUTPUT_ITEM_GROUP:
-      NOT_REACHED ();
+      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);