DO REPEAT: Order PRINT output correctly.
[pspp] / src / data / case-map.c
index 131e4078796eb8c8c7d4f812499857b03e6ba031..b47d38e1dd1346df17454ed4c20f4dff432da806 100644 (file)
@@ -72,6 +72,22 @@ insert_mapping (struct case_map *map, size_t from, size_t to)
   map->map[to] = from;
 }
 
+/* Returns a copy of OLD, if OLD is nonnull, and otherwise returns NULL.  */
+struct case_map *
+case_map_clone (const struct case_map *old)
+{
+  if (!old)
+    return NULL;
+
+  size_t n_values = caseproto_get_n_widths (old->proto);
+  struct case_map *new = xmalloc (sizeof *new);
+  *new = (struct case_map) {
+    .proto = caseproto_ref (old->proto),
+    .map = xmemdup (old->proto, n_values * sizeof *new->map),
+  };
+  return new;
+}
+
 /* Destroys case map MAP. */
 void
 case_map_destroy (struct case_map *map)
@@ -131,11 +147,12 @@ struct casereader *
 case_map_create_input_translator (struct case_map *map,
                                   struct casereader *subreader)
 {
-    return casereader_create_translator (subreader,
+  static const struct casereader_translator_class class = {
+    translate_case, destroy_case_map,
+  };
+  return casereader_translate_stateless (subreader,
                                          case_map_get_proto (map),
-                                         translate_case,
-                                         destroy_case_map,
-                                         map);
+                                         &class, map);
 }
 
 /* Creates and returns a new casewriter.  Cases written to the
@@ -182,14 +199,14 @@ destroy_case_map (void *map_)
    the last value.  (Holes are created by deleting variables.)
 
    All variables are compacted if EXCLUDE_CLASSES is 0, or it may
-   contain one or more of (1u << DC_ORDINARY), (1u << DC_SYSTEM),
-   or (1u << DC_SCRATCH) to cause the corresponding type of
-   variable to be deleted during compaction. */
+   contain one or more of DC_ORDINARY, DC_SYSTEM, or DC_SCRATCH
+   to cause the corresponding type of variable to be deleted
+   during compaction. */
 struct case_map *
 case_map_to_compact_dict (const struct dictionary *d,
                           unsigned int exclude_classes)
 {
-  size_t n_vars = dict_get_var_cnt (d);
+  size_t n_vars = dict_get_n_vars (d);
   struct caseproto *proto;
   struct case_map *map;
   size_t n_values;
@@ -205,7 +222,7 @@ case_map_to_compact_dict (const struct dictionary *d,
   for (i = 0; i < n_vars; i++)
     {
       struct variable *v = dict_get_var (d, i);
-      if (!(exclude_classes & (1u << var_get_dict_class (v))))
+      if (!(exclude_classes & var_get_dict_class (v)))
         insert_mapping (map, var_get_case_index (v), n_values++);
     }
 
@@ -234,7 +251,7 @@ struct case_map_stage
 struct case_map_stage *
 case_map_stage_create (const struct dictionary *dict)
 {
-  size_t n_vars = dict_get_var_cnt (dict);
+  size_t n_vars = dict_get_n_vars (dict);
   struct case_map_stage *stage;
   size_t i;
 
@@ -305,7 +322,7 @@ struct case_map *
 case_map_stage_get_case_map (const struct case_map_stage *stage)
 {
   struct case_map *map;
-  size_t n_vars = dict_get_var_cnt (stage->dict);
+  size_t n_vars = dict_get_n_vars (stage->dict);
   size_t n_values;
   size_t i;
   bool identity_map = true;
@@ -343,12 +360,9 @@ struct case_map *
 case_map_by_name (const struct dictionary *old,
                   const struct dictionary *new)
 {
-  struct case_map *map;
-  size_t var_cnt = dict_get_var_cnt (new);
-  size_t i;
-
-  map = create_case_map (dict_get_proto (new));
-  for (i = 0; i < var_cnt; i++)
+  size_t n_vars = dict_get_n_vars (new);
+  struct case_map *map = create_case_map (dict_get_proto (new));
+  for (size_t i = 0; i < n_vars; i++)
     {
       struct variable *nv = dict_get_var (new, i);
       struct variable *ov = dict_lookup_var_assert (old, var_get_name (nv));
@@ -364,6 +378,6 @@ void
 case_map_dump (const struct case_map *cm)
 {
   int i;
-  for (i = 0 ; i < caseproto_get_n_widths (cm->proto); ++i )
+  for (i = 0 ; i < caseproto_get_n_widths (cm->proto); ++i)
     printf ("%d -> %d\n", i, cm->map[i]);
 }