+/* Second pass */
+static void levene2_precalc (struct levene_info *l);
+static int levene2_calc (const struct dictionary *, const struct ccase *,
+ struct levene_info *l);
+static void levene2_postcalc (struct levene_info *);
+
+
+void
+levene(const struct dictionary *dict,
+ struct casereader *reader,
+ const struct variable *v_indep, size_t n_dep,
+ const struct variable **v_dep,
+ enum mv_class exclude)
+{
+ struct casereader *pass1, *pass2;
+ struct ccase *c;
+ struct levene_info l;
+
+ l.n_dep = n_dep;
+ l.v_indep = v_indep;
+ l.v_dep = v_dep;
+ l.exclude = exclude;
+ l.lz = xnmalloc (l.n_dep, sizeof *l.lz);
+ l.lz_denominator = xnmalloc (l.n_dep, sizeof *l.lz_denominator);
+
+ casereader_split (reader, &pass1, &pass2);
+
+ levene_precalc (&l);
+ for (; (c = casereader_read (pass1)) != NULL; case_unref (c))
+ levene_calc (dict, c, &l);
+ casereader_destroy (pass1);
+ levene_postcalc (&l);
+
+ levene2_precalc(&l);
+ for (; (c = casereader_read (pass2)) != NULL; case_unref (c))
+ levene2_calc (dict, c, &l);
+ casereader_destroy (pass2);
+ levene2_postcalc (&l);
+
+ free (l.lz_denominator);
+ free (l.lz);
+}
+
+static void