xkb: XkbSendCompatMap(): little cleanup and simplification

Make it a bit simpler and easier to read.

calloc() and WriteToClient() can handle zero lengths very well.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-07-15 21:59:02 +02:00
parent d1555edcc2
commit f3176bae97

View File

@ -2806,52 +2806,45 @@ static int
XkbSendCompatMap(ClientPtr client,
XkbCompatMapPtr compat, xkbGetCompatMapReply rep)
{
char *data;
int size;
int sz = rep.length * sizeof(CARD32);
char *buf = calloc(1, sz);
if (sz && (!buf))
return BadAlloc;
if (rep.length > 0) {
data = calloc(rep.length, 4);
if (data) {
register unsigned i, bit;
xkbModsWireDesc *grp;
XkbSymInterpretPtr sym = &compat->sym_interpret[rep.firstSI];
xkbSymInterpretWireDesc *wire = (xkbSymInterpretWireDesc *) data;
if (sz) {
register unsigned i, bit;
xkbModsWireDesc *grp;
XkbSymInterpretPtr sym = &compat->sym_interpret[rep.firstSI];
xkbSymInterpretWireDesc *wire = (xkbSymInterpretWireDesc *) buf;
size = rep.length * 4;
for (i = 0; i < rep.nSI; i++, sym++, wire++) {
wire->sym = sym->sym;
wire->mods = sym->mods;
wire->match = sym->match;
wire->virtualMod = sym->virtual_mod;
wire->flags = sym->flags;
memcpy((char *) &wire->act, (char *) &sym->act,
sz_xkbActionWireDesc);
if (client->swapped) {
swapl(&wire->sym);
}
}
if (rep.groups) {
grp = (xkbModsWireDesc *) wire;
for (i = 0, bit = 1; i < XkbNumKbdGroups; i++, bit <<= 1) {
if (rep.groups & bit) {
grp->mask = compat->groups[i].mask;
grp->realMods = compat->groups[i].real_mods;
grp->virtualMods = compat->groups[i].vmods;
if (client->swapped) {
swaps(&grp->virtualMods);
}
grp++;
}
}
wire = (xkbSymInterpretWireDesc *) grp;
for (i = 0; i < rep.nSI; i++, sym++, wire++) {
wire->sym = sym->sym;
wire->mods = sym->mods;
wire->match = sym->match;
wire->virtualMod = sym->virtual_mod;
wire->flags = sym->flags;
memcpy((char *) &wire->act, (char *) &sym->act,
sz_xkbActionWireDesc);
if (client->swapped) {
swapl(&wire->sym);
}
}
else
return BadAlloc;
if (rep.groups) {
grp = (xkbModsWireDesc *) wire;
for (i = 0, bit = 1; i < XkbNumKbdGroups; i++, bit <<= 1) {
if (rep.groups & bit) {
grp->mask = compat->groups[i].mask;
grp->realMods = compat->groups[i].real_mods;
grp->virtualMods = compat->groups[i].vmods;
if (client->swapped) {
swaps(&grp->virtualMods);
}
grp++;
}
}
wire = (xkbSymInterpretWireDesc *) grp;
}
}
else
data = NULL;
if (client->swapped) {
swaps(&rep.sequenceNumber);
@ -2862,10 +2855,8 @@ XkbSendCompatMap(ClientPtr client,
}
WriteToClient(client, sizeof(xkbGetCompatMapReply), &rep);
if (data) {
WriteToClient(client, size, data);
free((char *) data);
}
WriteToClient(client, sz, buf);
free(buf);
return Success;
}