From 54bdfd05a4f30397a4cb4ee1608f2c8d82416b00 Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Wed, 6 Jun 2012 01:22:52 +0300 Subject: [PATCH] symbols: use darray for KeyInfo acts Signed-off-by: Ran Benita --- src/xkbcomp/symbols.c | 152 ++++++++++++++++++++------------------------------ 1 file changed, 61 insertions(+), 91 deletions(-) diff --git a/src/xkbcomp/symbols.c b/src/xkbcomp/symbols.c index d9c0f77..f3b16ec 100644 --- a/src/xkbcomp/symbols.c +++ b/src/xkbcomp/symbols.c @@ -35,6 +35,7 @@ /* Needed to work with the typechecker. */ typedef darray(xkb_keysym_t) darray_xkb_keysym_t; +typedef darray(union xkb_action) darray_xkb_action; #define RepeatYes 1 #define RepeatNo 0 @@ -74,7 +75,8 @@ typedef struct _KeyInfo */ darray(size_t) symsMapNumEntries[XkbNumKbdGroups]; - union xkb_action *acts[XkbNumKbdGroups]; + darray_xkb_action acts[XkbNumKbdGroups]; + xkb_atom_t types[XkbNumKbdGroups]; unsigned repeat; struct xkb_behavior behavior; @@ -105,7 +107,7 @@ InitKeyInfo(KeyInfo * info) darray_init(info->syms[i]); darray_init(info->symsMapIndex[i]); darray_init(info->symsMapNumEntries[i]); - info->acts[i] = NULL; + darray_init(info->acts[i]); } info->dfltType = XKB_ATOM_NONE; info->behavior.type = XkbKB_Default; @@ -135,8 +137,7 @@ FreeKeyInfo(KeyInfo * info) darray_free(info->syms[i]); darray_free(info->symsMapIndex[i]); darray_free(info->symsMapNumEntries[i]); - free(info->acts[i]); - info->acts[i] = NULL; + darray_free(info->acts[i]); } info->dfltType = XKB_ATOM_NONE; info->behavior.type = XkbKB_Default; @@ -157,44 +158,25 @@ CopyKeyInfo(KeyInfo * old, KeyInfo * new, bool clearOld) *new = *old; new->defs.next = NULL; - if (clearOld) - { - for (i = 0; i < XkbNumKbdGroups; i++) - { + + if (clearOld) { + for (i = 0; i < XkbNumKbdGroups; i++) { old->numLevels[i] = 0; darray_init(old->symsMapIndex[i]); darray_init(old->symsMapNumEntries[i]); darray_init(old->syms[i]); - old->acts[i] = NULL; + darray_init(old->acts[i]); } } - else - { - unsigned int width; - for (i = 0; i < XkbNumKbdGroups; i++) - { - width = new->numLevels[i]; - + else { + for (i = 0; i < XkbNumKbdGroups; i++) { darray_copy(new->syms[i], old->syms[i]); darray_copy(new->symsMapIndex[i], old->symsMapIndex[i]); darray_copy(new->symsMapNumEntries[i], old->symsMapNumEntries[i]); - - if (old->acts[i] != NULL) - { - new->acts[i] = uTypedCalloc(width, union xkb_action); - if (!new->acts[i]) - { - darray_free(new->syms[i]); - darray_free(new->symsMapIndex[i]); - darray_free(new->symsMapNumEntries[i]); - new->numLevels[i] = 0; - return false; - } - memcpy(new->acts[i], old->acts[i], - width * sizeof(union xkb_action)); - } + darray_copy(new->acts[i], old->acts[i]); } } + return true; } @@ -276,8 +258,7 @@ ResizeKeyGroup(KeyInfo * key, unsigned int group, unsigned int numLevels, darray_resize0(key->syms[group], sizeSyms); if (darray_empty(key->symsMapIndex[group]) || - key->numLevels[group] < numLevels) - { + key->numLevels[group] < numLevels) { darray_resize(key->symsMapIndex[group], numLevels); for (i = key->numLevels[group]; i < numLevels; i++) darray_item(key->symsMapIndex[group], i) = -1; @@ -287,19 +268,14 @@ ResizeKeyGroup(KeyInfo * key, unsigned int group, unsigned int numLevels, key->numLevels[group] < numLevels) darray_resize0(key->symsMapNumEntries[group], numLevels); - if ((forceActions && - (key->numLevels[group] < numLevels || (key->acts[group] == NULL))) || - (key->numLevels[group] < numLevels && (key->acts[group] != NULL))) - { - key->acts[group] = uTypedRecalloc(key->acts[group], - key->numLevels[group], - numLevels, - union xkb_action); - if (!key->acts[group]) - return false; - } + if ((forceActions && (key->numLevels[group] < numLevels || + darray_empty(key->acts[group]))) || + (key->numLevels[group] < numLevels && !darray_empty(key->acts[group]))) + darray_resize0(key->acts[group], numLevels); + if (key->numLevels[group] < numLevels) key->numLevels[group] = numLevels; + return true; } @@ -315,7 +291,7 @@ MergeKeyGroups(SymbolsInfo * info, { darray_xkb_keysym_t resultSyms; enum key_group_selector using = NONE; - union xkb_action *resultActs; + darray_xkb_action resultActs; unsigned int resultWidth; unsigned int resultSize = 0; int cur_idx = 0; @@ -347,30 +323,29 @@ MergeKeyGroups(SymbolsInfo * info, darray_item(into->symsMapIndex[group], i) = -1; } - if ((resultActs == NULL) && (into->acts[group] || from->acts[group])) + if (darray_empty(resultActs) && (!darray_empty(into->acts[group]) || + !darray_empty(from->acts[group]))) { - resultActs = uTypedCalloc(resultWidth, union xkb_action); - if (!resultActs) - { - WSGO("Could not allocate actions for group merge\n"); - ACTION("Group %d of key %s not merged\n", group, - longText(into->name)); - return false; - } + darray_resize0(resultActs, resultWidth); for (i = 0; i < resultWidth; i++) { - union xkb_action *fromAct, *toAct; - fromAct = (from->acts[group] ? &from->acts[group][i] : NULL); - toAct = (into->acts[group] ? &into->acts[group][i] : NULL); + union xkb_action *fromAct = NULL, *toAct = NULL; + + if (!darray_empty(from->acts[group])) + fromAct = &darray_item(from->acts[group], i); + + if (!darray_empty(into->acts[group])) + toAct = &darray_item(into->acts[group], i); + if (((fromAct == NULL) || (fromAct->type == XkbSA_NoAction)) && (toAct != NULL)) { - resultActs[i] = *toAct; + darray_item(resultActs, i) = *toAct; } else if (((toAct == NULL) || (toAct->type == XkbSA_NoAction)) && (fromAct != NULL)) { - resultActs[i] = *fromAct; + darray_item(resultActs, i) = *fromAct; } else { @@ -395,7 +370,7 @@ MergeKeyGroups(SymbolsInfo * info, XkbcActionTypeText(ignore->type)); } if (use) - resultActs[i] = *use; + darray_item(resultActs, i) = *use; } } } @@ -503,10 +478,10 @@ MergeKeyGroups(SymbolsInfo * info, } out: - if (resultActs != into->acts[group]) - free(into->acts[group]); - if (resultActs != from->acts[group]) - free(from->acts[group]); + if (!darray_same(resultActs, into->acts[group])) + darray_free(into->acts[group]); + if (!darray_same(resultActs, from->acts[group])) + darray_free(from->acts[group]); into->numLevels[group] = resultWidth; if (!darray_same(resultSyms, into->syms[group])) darray_free(into->syms[group]); @@ -517,7 +492,7 @@ out: darray_free(from->symsMapIndex[group]); darray_free(from->symsMapNumEntries[group]); into->acts[group] = resultActs; - from->acts[group] = NULL; + darray_init(from->acts[group]); if (!darray_empty(into->syms[group])) into->symsDefined |= (1 << group); from->symsDefined &= ~(1 << group); @@ -542,7 +517,7 @@ MergeKeys(SymbolsInfo *info, struct xkb_keymap *keymap, if (into->numLevels[i] != 0) { darray_free(into->syms[i]); - free(into->acts[i]); + darray_free(into->acts[i]); } } *into = *from; @@ -567,12 +542,12 @@ MergeKeys(SymbolsInfo *info, struct xkb_keymap *keymap, darray_init(from->syms[i]); darray_init(from->symsMapIndex[i]); darray_init(from->symsMapNumEntries[i]); - from->acts[i] = NULL; + darray_init(from->acts[i]); from->numLevels[i] = 0; from->symsDefined &= ~(1 << i); if (!darray_empty(into->syms[i])) into->defs.defined |= _Key_Syms; - if (into->acts[i]) + if (!darray_empty(into->acts[i])) into->defs.defined |= _Key_Acts; } else @@ -581,7 +556,7 @@ MergeKeys(SymbolsInfo *info, struct xkb_keymap *keymap, { if (!darray_empty(into->syms[i])) collide |= _Key_Syms; - if (into->acts[i]) + if (!darray_empty(into->acts[i])) collide |= _Key_Acts; } MergeKeyGroups(info, into, from, (unsigned) i); @@ -1058,7 +1033,7 @@ AddActionsToKey(KeyInfo *key, struct xkb_keymap *keymap, ExprDef *arrayNdx, longText(key->name)); return false; } - if (key->acts[ndx] != NULL) + if (!darray_empty(key->acts[ndx])) { WSGO("Actions for key %s, group %d already defined\n", longText(key->name), ndx); @@ -1073,8 +1048,8 @@ AddActionsToKey(KeyInfo *key, struct xkb_keymap *keymap, ExprDef *arrayNdx, WSGO("Action list but not actions in AddActionsToKey\n"); return false; } - if (((key->numLevels[ndx] < nActs) || (key->acts[ndx] == NULL)) && - (!ResizeKeyGroup(key, ndx, nActs, nActs, true))) + if ((key->numLevels[ndx] < nActs || darray_empty(key->acts[ndx])) && + !ResizeKeyGroup(key, ndx, nActs, nActs, true)) { WSGO("Could not resize group %d of key %s\n", ndx, longText(key->name)); @@ -1083,7 +1058,7 @@ AddActionsToKey(KeyInfo *key, struct xkb_keymap *keymap, ExprDef *arrayNdx, } key->actsDefined |= (1 << ndx); - toAct = (struct xkb_any_action *) key->acts[ndx]; + toAct = (struct xkb_any_action *) darray_mem(key->acts[ndx], 0); act = value->value.child; for (i = 0; i < nActs; i++, toAct++) { @@ -1423,8 +1398,7 @@ SetExplicitGroup(SymbolsInfo *info, KeyInfo *key) { key->numLevels[i] = 0; darray_free(key->syms[i]); - free(key->acts[i]); - key->acts[i] = NULL; + darray_free(key->acts[i]); key->types[i] = 0; } } @@ -1439,7 +1413,7 @@ SetExplicitGroup(SymbolsInfo *info, KeyInfo *key) key->symsMapNumEntries[group] = key->symsMapNumEntries[0]; darray_init(key->symsMapNumEntries[0]); key->acts[group] = key->acts[0]; - key->acts[0] = NULL; + darray_init(key->acts[0]); key->types[group] = key->types[0]; key->types[0] = 0; return true; @@ -1731,13 +1705,9 @@ PrepareKeyDef(KeyInfo * key) } key->typesDefined |= 1 << i; } - if ((key->actsDefined & 1) && key->acts[0]) + if ((key->actsDefined & 1) && !darray_empty(key->acts[0])) { - key->acts[i] = uTypedCalloc(width, union xkb_action); - if (key->acts[i] == NULL) - continue; - memcpy(key->acts[i], key->acts[0], - width * sizeof(union xkb_action)); + darray_copy(key->acts[i], key->acts[0]); key->actsDefined |= 1 << i; } if ((key->symsDefined & 1) && !darray_empty(key->syms[0])) @@ -1793,10 +1763,11 @@ PrepareKeyDef(KeyInfo * key) identical = false; continue; } - if ((key->acts[i] != key->acts[0]) && - (key->acts[i] == NULL || key->acts[0] == NULL || - memcmp(key->acts[i], key->acts[0], - sizeof(union xkb_action) * key->numLevels[0]))) + if (!darray_same(key->acts[i], key->acts[0]) && + (darray_empty(key->acts[i]) || darray_empty(key->acts[0]) || + memcmp(darray_mem(key->acts[i], 0), + darray_mem(key->acts[0], 0), + key->numLevels[0] * sizeof(union xkb_action)))) { identical = false; break; @@ -1810,8 +1781,7 @@ PrepareKeyDef(KeyInfo * key) darray_free(key->syms[i]); darray_free(key->symsMapIndex[i]); darray_free(key->symsMapNumEntries[i]); - free(key->acts[i]); - key->acts[i] = NULL; + darray_free(key->acts[i]); key->types[i] = 0; } key->symsDefined &= 1; @@ -1860,7 +1830,7 @@ CopySymbolsDef(struct xkb_keymap *keymap, KeyInfo *key, int start_from) && (((key->symsDefined | key->actsDefined) & (1 << i)) || (key->typesDefined) & (1 << i))) nGroups = i + 1; - if (key->acts[i]) + if (!darray_empty(key->acts[i])) haveActions = true; autoType = false; /* Assign the type to the key, if it is missing. */ @@ -1986,10 +1956,10 @@ CopySymbolsDef(struct xkb_keymap *keymap, KeyInfo *key, int start_from) sym_map->sym_index[(i * width) + tmp] = -1; sym_map->num_syms[(i * width) + tmp] = 0; } - if ((outActs != NULL) && (key->acts[i] != NULL)) + if (outActs != NULL && !darray_empty(key->acts[i])) { if (tmp < key->numLevels[i]) - outActs[tmp] = key->acts[i][tmp]; + outActs[tmp] = darray_item(key->acts[i], tmp); else outActs[tmp].type = XkbSA_NoAction; } -- 2.7.4