factor: Fix return type of do_factor_by_matrix().
[pspp] / src / language / stats / factor.c
index 49bc8a4d67f5334fa4af3737edd99b1d4c368acd..fc3eb5b4d279446d7057559a707a664d3298e2a8 100644 (file)
@@ -1005,7 +1005,7 @@ iterate_factor_matrix (const gsl_matrix *r, gsl_vector *communalities, gsl_matri
 
 static bool run_factor (struct dataset *ds, const struct cmd_factor *factor);
 
-static bool do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata);
+static void do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata);
 
 
 
@@ -1467,6 +1467,12 @@ cmd_factor (struct lexer *lexer, struct dataset *ds)
   if (factor.n_vars < 2)
     msg (MW, _("Factor analysis on a single variable is not useful."));
 
+  if (factor.n_vars < 1)
+    {
+      msg (ME, _("Factor analysis without variables is not possible."));
+      goto error;
+    }
+
   if (matrix_reader)
     {
       struct idata *id = idata_alloc (factor.n_vars);
@@ -2191,7 +2197,7 @@ do_factor (const struct cmd_factor *factor, struct casereader *r)
   struct idata *idata = idata_alloc (factor->n_vars);
 
   idata->cvm = covariance_1pass_create (factor->n_vars, factor->vars,
-                                             factor->wv, factor->exclude);
+                                       factor->wv, factor->exclude, true);
 
   for ( ; (c = casereader_read (r) ); case_unref (c))
     {
@@ -2221,13 +2227,13 @@ do_factor (const struct cmd_factor *factor, struct casereader *r)
   casereader_destroy (r);
 }
 
-static bool
+static void
 do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata)
 {
   if (!idata->mm.cov && !idata->mm.corr)
     {
       msg (ME, _("The dataset has no complete covariance or correlation matrix."));
-      return false;
+      return;
     }
 
   if (idata->mm.cov && !idata->mm.corr)
@@ -2408,7 +2414,7 @@ do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata)
   if (idata->n_extractions == 0)
     {
       msg (MW, _("The %s criteria result in zero factors extracted. Therefore no analysis will be performed."), "FACTOR");
-      goto finish;
+      return;
     }
 
   if (idata->n_extractions > factor->n_vars)
@@ -2416,7 +2422,7 @@ do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata)
       msg (MW,
           _("The %s criteria result in more factors than variables, which is not meaningful. No analysis will be performed."),
           "FACTOR");
-      goto finish;
+      return;
     }
 
   {
@@ -2537,9 +2543,6 @@ do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata)
     gsl_vector_free (initial_communalities);
     gsl_vector_free (extracted_communalities);
   }
-
- finish:
-  return;
 }