DO REPEAT: Order PRINT output correctly.
[pspp] / src / data / case-map.c
index 2e1507edca750d0cc650d922168c8f1902e301b4..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)
@@ -134,9 +150,9 @@ case_map_create_input_translator (struct case_map *map,
   static const struct casereader_translator_class class = {
     translate_case, destroy_case_map,
   };
-  return casereader_create_translator (subreader,
-                                       case_map_get_proto (map),
-                                       &class, map);
+  return casereader_translate_stateless (subreader,
+                                         case_map_get_proto (map),
+                                         &class, map);
 }
 
 /* Creates and returns a new casewriter.  Cases written to the