case-map: New function case_map_clone().
authorBen Pfaff <blp@cs.stanford.edu>
Tue, 21 Feb 2023 04:00:23 +0000 (20:00 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Tue, 21 Feb 2023 04:01:26 +0000 (20:01 -0800)
This will acquire its first user in an upcoming commit.

src/data/case-map.c
src/data/case-map.h

index 968b945af2a9318a74324b458b9382a212dbab96..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)
index 0e9970a873c13bc8e1fb5bbb60618838b61896a5..13e2ef190f4a0f79716bf3d3d40a4da99f8b05e8 100644 (file)
@@ -32,7 +32,7 @@ struct casewriter;
 struct ccase;
 struct dictionary;
 
-struct case_map *case_map_create (void);
+struct case_map *case_map_clone (const struct case_map *);
 void case_map_destroy (struct case_map *);
 struct ccase *case_map_execute (const struct case_map *, struct ccase *);