+
+ for (i = 0; i < resultWidth; i++)
+ {
+ unsigned int fromSize = 0;
+ unsigned toSize = 0;
+
+ if (from->symsMapNumEntries[group] && (i < from->numLevels[group]))
+ fromSize = from->symsMapNumEntries[group][i];
+ if (into->symsMapNumEntries[group] && (i < into->numLevels[group]))
+ toSize = into->symsMapNumEntries[group][i];
+
+ if (fromSize == 0)
+ {
+ resultSize += toSize;
+ using |= TO;
+ }
+ else if (toSize == 0 || clobber)
+ {
+ resultSize += fromSize;
+ using |= FROM;
+ }
+ else
+ {
+ resultSize += toSize;
+ using |= TO;
+ }
+ }
+
+ if (resultSize == 0)
+ goto out;
+
+ if (using == FROM)
+ {
+ resultSyms = from->syms[group];
+ goto out;
+ }
+ else if (using == TO)
+ {
+ resultSyms = into->syms[group];
+ goto out;
+ }
+
+ resultSyms = uTypedCalloc(resultSize, xkb_keysym_t);
+ if (!resultSyms)
+ {
+ WSGO("Could not allocate symbols for group merge\n");
+ ACTION("Group %d of key %s not merged\n", group, longText(into->name));
+ return false;
+ }
+
+ for (i = 0; i < resultWidth; i++)
+ {
+ enum key_group_selector use = NONE;
+ unsigned int fromSize = 0;
+ unsigned int toSize = 0;
+
+ if (i < from->numLevels[group])
+ fromSize = from->symsMapNumEntries[group][i];
+ if (i < into->numLevels[group])
+ toSize = into->symsMapNumEntries[group][i];
+
+ if (fromSize == 0 && toSize == 0)
+ {
+ into->symsMapIndex[group][i] = -1;
+ into->symsMapNumEntries[group][i] = 0;
+ continue;
+ }
+
+ if (fromSize == 0)
+ use = TO;
+ else if (toSize == 0 || clobber)
+ use = FROM;
+ else
+ use = TO;
+
+ if (toSize && fromSize && report)
+ {
+ INFO("Multiple symbols for group %d, level %d on key %s\n",
+ group + 1, i + 1, longText(into->name));
+ ACTION("Using %s, ignoring %s\n",
+ (use == FROM ? "from" : "to"),
+ (use == FROM ? "to" : "from"));
+ }
+
+ if (use == FROM)
+ {
+ memcpy(&resultSyms[cur_idx],
+ &from->syms[group][from->symsMapIndex[group][i]],
+ from->symsMapNumEntries[group][i] * sizeof(xkb_keysym_t));
+ into->symsMapIndex[group][i] = cur_idx;
+ into->symsMapNumEntries[group][i] =
+ from->symsMapNumEntries[group][i];
+ }
+ else
+ {
+ memcpy(&resultSyms[cur_idx],
+ &into->syms[group][into->symsMapIndex[group][i]],
+ into->symsMapNumEntries[group][i] * sizeof(xkb_keysym_t));
+ into->symsMapIndex[group][i] = cur_idx;
+ }
+ cur_idx += into->symsMapNumEntries[group][i];
+ }
+
+out:
+ if (resultActs != into->acts[group])