+CopyKeyType(const struct xkb_key_type *from, struct xkb_key_type *into)
+{
+ int i;
+
+ darray_free(into->map);
+ free(into->preserve);
+ free(into->level_names);
+
+ *into = *from;
+ darray_init(into->map);
+
+ darray_copy(into->map, from->map);
+
+ if (from->preserve && !darray_empty(into->map)) {
+ into->preserve = calloc(darray_size(into->map),
+ sizeof(*into->preserve));
+ if (!into->preserve)
+ return BadAlloc;
+ memcpy(into->preserve, from->preserve,
+ darray_size(into->map) * sizeof(*into->preserve));
+ }
+
+ if (from->level_names && into->num_levels > 0) {
+ into->level_names = calloc(into->num_levels,
+ sizeof(*into->level_names));
+ if (!into->level_names)
+ return BadAlloc;
+
+ for (i = 0; i < into->num_levels; i++)
+ into->level_names[i] = strdup(from->level_names[i]);
+ }
+
+ return Success;
+}
+
+static int