Fix memory leak in barcharts
[pspp] / src / output / charts / barchart.c
index 5d35719a861796cbf1d82e3ab0f5ea9310e22c12..812a96d03a5b5cec1ca273585acf26fd799136b5 100644 (file)
@@ -75,7 +75,14 @@ compare_freq_2level_ptr_3way (const void *a_, const void *b_, const void *bc_)
 
 
 /* Creates and returns a chart that will render a barchart with
-   the given TITLE and the N_BARS described in CATS. */
+   the given TITLE and the N_CATS described in CATS. 
+
+   VAR is an array containing the categorical variables, and N_VAR 
+   the number of them. N_VAR must be exactly 1 or 2.
+
+   CATS are the counts of the values of those variables. N_CATS is the
+   number of distinct values.
+*/
 struct chart_item *
 barchart_create (const struct variable **var, int n_vars,
                 const char *ylabel, 
@@ -129,8 +136,9 @@ barchart_create (const struct variable **var, int n_vars,
            {
              struct category *s = xzalloc (sizeof *s);
              s->idx = idx++;
-             value_init (&s->val, var_get_width (var[pidx]));
-             value_copy (&s->val, &src->values[pidx], var_get_width (var[pidx]));
+             s->width = var_get_width (var[pidx]);
+             value_init (&s->val, s->width);
+             value_copy (&s->val, &src->values[pidx], s->width);
              ds_init_empty (&s->label);
              var_append_value_name (var[pidx], &s->val, &s->label);
 
@@ -166,7 +174,8 @@ barchart_create (const struct variable **var, int n_vars,
            {
              struct category *s = xzalloc (sizeof *s);
              s->idx = idx++;
-             value_init (&s->val, var_get_width (var[sidx]));
+             s->width = var_get_width (var[sidx]);
+             value_init (&s->val, s->width);
              value_copy (&s->val, &src->values[sidx], var_get_width (var[sidx]));
              ds_init_empty (&s->label);
              var_append_value_name (var[sidx], &s->val, &s->label);
@@ -249,6 +258,8 @@ destroy_cat_map (struct hmap *m)
   struct category *next = NULL;
   HMAP_FOR_EACH_SAFE (foo, next, struct category, node, m)
     {
+      value_destroy (&foo->val, foo->width);
+
       ds_destroy (&foo->label);
       free (foo);
     }