DESCRIPTIVES: Fix a pair of memory leaks.
[pspp] / src / language / stats / descriptives.c
index 54bc49d946a064bd3c4eee8ffdab962d611733c3..94421ef1e979807776a954d354c5be08019fcccc 100644 (file)
@@ -512,7 +512,7 @@ try_name (const struct dictionary *dict, struct dsc_proc *dsc,
   for (i = 0; i < dsc->var_cnt; i++)
     {
       struct dsc_var *dsc_var = &dsc->vars[i];
-      if (dsc_var->z_name != NULL && !strcasecmp (dsc_var->z_name, name))
+      if (dsc_var->z_name != NULL && !utf8_strcasecmp (dsc_var->z_name, name))
         return false;
     }
   return true;
@@ -689,6 +689,8 @@ descriptives_trns_free (void *trns_)
   casereader_destroy (t->z_reader);
   assert((t->missing_type != DSC_LISTWISE) ^ (t->vars != NULL));
   free (t->vars);
+  free (t);
+
   return ok;
 }
 
@@ -732,11 +734,13 @@ setup_z_trns (struct dsc_proc *dsc, struct dataset *ds)
        {
           struct dsc_z_score *z;
          struct variable *dst_var;
+          char *label;
 
          dst_var = dict_create_var_assert (dataset_dict (ds), dv->z_name, 0);
-          var_set_label (dst_var,
-                         xasprintf (_("Z-score of %s"),var_to_string (dv->v)),
-                         false);
+
+          label = xasprintf (_("Z-score of %s"),var_to_string (dv->v));
+          var_set_label (dst_var, label, false);
+          free (label);
 
           z = &t->z_scores[cnt++];
           z->src_var = dv->v;
@@ -1017,7 +1021,7 @@ descriptives_compare_dsc_vars (const void *a_, const void *b_, const void *dsc_)
   int result;
 
   if (dsc->sort_by_stat == DSC_NAME)
-    result = strcasecmp (var_get_name (a->v), var_get_name (b->v));
+    result = utf8_strcasecmp (var_get_name (a->v), var_get_name (b->v));
   else
     {
       double as = a->stats[dsc->sort_by_stat];