Fix bug #37984 - EXAMINE extremes vs. fractional weights.
[pspp] / src / language / stats / regression.c
index 0a2e2a8cf67c08fae3bdd26f658654176f63e348..cb2c3ff31bd2cd77334f38922c3b3b80ad9314c0 100644 (file)
@@ -196,16 +196,15 @@ reg_get_name (const struct dictionary *dict, const char *prefix)
 static bool
 regression_trns_free (void *t_)
 {
-  bool result = true;
   struct reg_trns *t = t_;
 
   if (t->trns_id == t->n_trns)
     {
-      result = linreg_free (t->c);
+      linreg_unref (t->c);
     }
   free (t);
 
-  return result;
+  return true;
 }
 
 static void
@@ -249,6 +248,7 @@ subcommand_save (const struct regression *cmd)
         {
           if ((*lc)->depvar != NULL)
             {
+             (*lc)->refcnt++;
               if (cmd->resid)
                 {
                   reg_save_var (cmd->ds, "RES", regression_trns_resid_proc, *lc,
@@ -267,6 +267,7 @@ subcommand_save (const struct regression *cmd)
 int
 cmd_regression (struct lexer *lexer, struct dataset *ds)
 {
+  int k;
   struct regression regression;
   const struct dictionary *dict = dataset_dict (ds);
 
@@ -400,12 +401,24 @@ cmd_regression (struct lexer *lexer, struct dataset *ds)
   }
 
   if (regression.pred || regression.resid )
-    subcommand_save (&regression);
+    {
+      subcommand_save (&regression);
+    }
  
 
+  for (k = 0; k < regression.n_dep_vars; k++)
+    linreg_unref (regression.models[k]);
+  free (regression.models);
+  free (regression.vars);
+  free (regression.dep_vars);
   return CMD_SUCCESS;
   
  error:
+  for (k = 0; k < regression.n_dep_vars; k++)
+    linreg_unref (regression.models[k]);
+  free (regression.models);
+  free (regression.vars);
+  free (regression.dep_vars);
   return CMD_FAILURE;
 }
 
@@ -671,10 +684,10 @@ run_regression (const struct regression *cmd, struct casereader *input)
        }
       else
        {
-         msg (SE,
+          msg (SE,
               _("No valid data found. This command was skipped."));
-         linreg_free (models[k]);
-         models[k] = NULL;
+          linreg_unref (models[k]);
+          models[k] = NULL;
        }
       gsl_matrix_free (this_cm);
     }