split-file: New function output_split_file_values_peek().
authorBen Pfaff <blp@cs.stanford.edu>
Sun, 20 Nov 2022 17:52:31 +0000 (09:52 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Sun, 20 Nov 2022 17:52:31 +0000 (09:52 -0800)
This helper function encapsulates what most of the callers were doing.

src/language/data-io/list.c
src/language/dictionary/split-file.c
src/language/dictionary/split-file.h
src/language/stats/crosstabs.c
src/language/stats/ctables.c
src/language/stats/descriptives.c
src/language/stats/glm.c
src/language/stats/oneway.c

index 6732e23a3dd89ed99f6dfe1d42d1e726a5ab9788..b09a4dc2f5a978b46d16800c0cb75485d3fe2241 100644 (file)
@@ -72,13 +72,7 @@ list_execute (const struct lst_cmd *lcmd, struct dataset *ds)
   grouper = casegrouper_create_splits (proc_open (ds), dict);
   while (casegrouper_get_next_group (grouper, &group))
     {
-      struct ccase *c = casereader_peek (group, 0);
-      if (c != NULL)
-        {
-          output_split_file_values (ds, c);
-          case_unref (c);
-        }
-
+      output_split_file_values_peek (ds, group);
       group = casereader_project (group, &sc);
       group = casereader_select (group, lcmd->first - 1,
                                  (lcmd->last != LONG_MAX ? lcmd->last
@@ -101,6 +95,7 @@ list_execute (const struct lst_cmd *lcmd, struct dataset *ds)
         cases->hide_all_labels = true;
 
       casenumber case_num = lcmd->first;
+      struct ccase *c;
       for (; (c = casereader_read (group)) != NULL; case_unref (c))
         {
           int case_idx = pivot_category_create_leaf (
index 13eecbb4ce358ffd1d8ad2a7c6c61556343e8fa3..efb796d7d266f0dbdde246f857361adea8f6aa52 100644 (file)
@@ -19,6 +19,7 @@
 #include <stdlib.h>
 
 #include "data/case.h"
+#include "data/casereader.h"
 #include "data/data-out.h"
 #include "data/dataset.h"
 #include "data/dictionary.h"
@@ -104,3 +105,17 @@ output_split_file_values (const struct dataset *ds, const struct ccase *c)
 
   pivot_table_submit (table);
 }
+
+/* Dumps out the values of all the split variables for the first case in
+   READER. */
+void
+output_split_file_values_peek (const struct dataset *ds,
+                               const struct casereader *reader)
+{
+  struct ccase *c = casereader_peek (reader, 0);
+  if (c)
+    {
+      output_split_file_values (ds, c);
+      case_unref (c);
+    }
+}
index af8c44e32b5755bef342f6016e178c82a8dbbb08..961ad4846268c866b5018b00381c45c627a13af2 100644 (file)
@@ -17,6 +17,8 @@
 #ifndef SPLIT_FILE_H
 #define SPLIT_FILE_H 1
 
-void output_split_file_values (const struct dataset *ds, const struct ccase *);
+void output_split_file_values (const struct dataset *, const struct ccase *);
+void output_split_file_values_peek (const struct dataset *,
+                                    const struct casereader *);
 
 #endif /* split-file.h */
index 7211d38d53b816e5b68970d9051bfb38734c7f1b..e7ad472caaed54927221111d662ce3250763505d 100644 (file)
@@ -508,13 +508,7 @@ cmd_crosstabs (struct lexer *lexer, struct dataset *ds)
   struct casereader *group;
   while (casegrouper_get_next_group (grouper, &group))
     {
-      /* Output SPLIT FILE variables. */
-      struct ccase *c = casereader_peek (group, 0);
-      if (c != NULL)
-        {
-          output_split_file_values (ds, c);
-          case_unref (c);
-        }
+      output_split_file_values_peek (ds, group);
 
       /* Initialize hash tables. */
       for (struct crosstabulation *xt = &proc.pivots[0];
@@ -522,6 +516,7 @@ cmd_crosstabs (struct lexer *lexer, struct dataset *ds)
         hmap_init (&xt->data);
 
       /* Tabulate. */
+      struct ccase *c;
       for (; (c = casereader_read (group)) != NULL; case_unref (c))
         for (struct crosstabulation *xt = &proc.pivots[0];
              xt < &proc.pivots[proc.n_pivots]; xt++)
index 05e9824b7d0b02fb88e10a6b025794fe3aa80af5..476681b2bc0ff0b6d49478ab5118f8d5bd61eb6a 100644 (file)
@@ -5627,14 +5627,7 @@ ctables_execute (struct dataset *ds, struct casereader *input,
   while (casegrouper_get_next_group (grouper, &group))
     {
       if (splitting)
-        {
-          struct ccase *c = casereader_peek (group, 0);
-          if (c != NULL)
-            {
-              output_split_file_values (ds, c);
-              case_unref (c);
-            }
-        }
+        output_split_file_values_peek (ds, group);
 
       bool warn_on_invalid = true;
       for (struct ccase *c = casereader_read (group); c;
index f82e6c580a2ad237ffa587bbc94722dc0ed3af32..6f78f28473c7ad6ab48891d872781f0a656fe9f4 100644 (file)
@@ -759,15 +759,7 @@ static void
 calc_descriptives (struct dsc_proc *dsc, struct casereader *group,
                    struct dataset *ds)
 {
-  struct ccase *c = casereader_peek (group, 0);
-  if (c == NULL)
-    {
-      casereader_destroy (group);
-      return;
-    }
-  output_split_file_values (ds, c);
-  case_unref (c);
-
+  output_split_file_values_peek (ds, group);
   group = casereader_create_filter_weight (group, dataset_dict (ds),
                                            NULL, NULL);
 
@@ -790,6 +782,7 @@ calc_descriptives (struct dsc_proc *dsc, struct casereader *group,
   /* First pass to handle most of the work. */
   casenumber count = 0;
   const struct variable *filter = dict_get_filter (dataset_dict (ds));
+  struct ccase *c;
   for (; (c = casereader_read (pass1)) != NULL; case_unref (c))
     {
       double weight = dict_get_case_weight (dataset_dict (ds), c, NULL);
index 6a98dd4f49cd192c6e46c5f45f96c60d4275be11..1002653a8438a347771c466853c4676ec9ff9588 100644 (file)
@@ -539,15 +539,8 @@ run_glm (struct glm_spec *cmd, struct casereader *input,
   cov = covariance_2pass_create (cmd->n_dep_vars, cmd->dep_vars,
                                 ws.cats, cmd->wv, cmd->exclude, true);
 
+  output_split_file_values_peek (ds, input);
 
-  c = casereader_peek (input, 0);
-  if (c == NULL)
-    {
-      casereader_destroy (input);
-      return;
-    }
-  output_split_file_values (ds, c);
-  case_unref (c);
 
   taint = taint_clone (casereader_get_taint (input));
 
index c65683e246ab4b1949fcaebda03b353a7eb3073a..797800155abd7f1ca05fa0fdb79f431ece960c88 100644 (file)
@@ -705,7 +705,6 @@ run_oneway (const struct oneway_spec *cmd,
   struct taint *taint;
   struct dictionary *dict = dataset_dict (ds);
   struct casereader *reader;
-  struct ccase *c;
 
   struct oneway_workspace ws;
 
@@ -741,14 +740,7 @@ run_oneway (const struct oneway_spec *cmd,
       ws.vws[v].nl = levene_create (var_get_width (cmd->indep_var), NULL);
     }
 
-  c = casereader_peek (input, 0);
-  if (c == NULL)
-    {
-      casereader_destroy (input);
-      goto finish;
-    }
-  output_split_file_values (ds, c);
-  case_unref (c);
+  output_split_file_values_peek (ds, input);
 
   taint = taint_clone (casereader_get_taint (input));
 
@@ -760,6 +752,7 @@ run_oneway (const struct oneway_spec *cmd,
   input = casereader_create_filter_weight (input, dict, NULL, NULL);
 
   reader = casereader_clone (input);
+  struct ccase *c;
   for (; (c = casereader_read (reader)) != NULL; case_unref (c))
     {
       int i;
@@ -887,8 +880,6 @@ run_oneway (const struct oneway_spec *cmd,
 
   taint_destroy (taint);
 
- finish:
-
   for (v = 0; v < cmd->n_vars; ++v)
     {
       covariance_destroy (ws.vws[v].cov);