+ pt_case = case_create (proto);
+
+ subcase_copy (&pt->src_sc, c, &pt->dst_sc, pt_case);
+ if (should_tabulate_case (pt, pt_case, proc.exclude, n_splits)
+ && proc.mode == INTEGER)
+ {
+ for (i = 0; i < pt->n_vars; i++)
+ {
+ double *d = &case_data_rw_idx (pt_case, i + n_splits)->f;
+ *d = (int) *d;
+ }
+ }
+
+ case_data_rw_idx (pt_case, caseproto_get_n_widths (proto) - 1)->f
+ = dict_get_case_weight (dict, c, &proc.bad_warn);
+
+ casewriter_write (pt->sorter, pt_case);
+ }
+ }
+ ok = casereader_destroy (input);
+ ok = proc_commit (ds) && ok;
+
+ for (pt = &proc.pivots[0]; pt < &proc.pivots[proc.n_pivots]; pt++)
+ {
+ const struct caseproto *proto;
+ struct casegrouper *grouper;
+ struct casereader *data;
+ struct subcase group_sc;
+ struct casereader *group;
+
+ subcase_init_vars (&group_sc, dict_get_split_vars (dict),
+ dict_get_split_cnt (dict));
+ subcase_project (&group_sc, 0);
+
+ data = casewriter_make_reader (pt->sorter);
+ proto = casereader_get_proto (data);
+ grouper = casegrouper_create_subcase (data, &group_sc);
+ subcase_destroy (&group_sc);
+
+ for (; casegrouper_get_next_group (grouper, &group);
+ casereader_destroy (group))
+ {
+ casenumber n_entries;
+ casenumber i;
+
+ c = casereader_peek (group, 0);
+ if (c != NULL)
+ {
+ /* XXX output_split_file_values (ds, c); */
+ case_unref (c);
+ }
+
+ n_entries = casereader_count_cases (group);
+ if (n_entries > 1000000)
+ {
+ msg (SW, _("Omitting analysis of crosstabulation that has %lu "
+ "nonempty cells."),
+ (unsigned long int) n_entries);
+ continue;
+ }
+
+ pt->entries = xmalloc (n_entries * sizeof *pt->entries);
+ pt->n_entries = 0;
+ pt->missing = 0.0;
+ for (; (c = casereader_read (group)) != NULL; case_unref (c))
+ if (should_tabulate_case (pt, c, proc.exclude, n_splits))