alloc: use darray in xkb_key_names
authorRan Benita <ran234@gmail.com>
Tue, 22 May 2012 05:39:09 +0000 (08:39 +0300)
committerRan Benita <ran234@gmail.com>
Tue, 22 May 2012 11:19:24 +0000 (14:19 +0300)
Signed-off-by: Ran Benita <ran234@gmail.com>
src/alloc.c
src/alloc.h
src/xkb-priv.h
src/xkbcomp/alias.c
src/xkbcomp/keycodes.c
src/xkbcomp/misc.c
src/xkbcomp/symbols.c

index a1d34bf..e95166e 100644 (file)
@@ -367,20 +367,19 @@ XkbcFreeCompatMap(struct xkb_keymap *keymap)
 }
 
 int
-XkbcAllocNames(struct xkb_keymap *keymap, unsigned which,
-               unsigned nTotalAliases)
+XkbcAllocNames(struct xkb_keymap *keymap, unsigned which, size_t nTotalAliases)
 {
-    struct xkb_names * names;
-
     if (!keymap)
         return BadMatch;
 
     if (!keymap->names) {
-        keymap->names = uTypedCalloc(1, struct xkb_names);
+        keymap->names = calloc(1, sizeof(*keymap->names));
         if (!keymap->names)
             return BadAlloc;
+
+        darray_init(keymap->names->keys);
+        darray_init(keymap->names->key_aliases);
     }
-    names = keymap->names;
 
     if ((which & XkbKTLevelNamesMask) && keymap->map) {
         struct xkb_key_type * type;
@@ -394,35 +393,11 @@ XkbcAllocNames(struct xkb_keymap *keymap, unsigned which,
         }
     }
 
-    if ((which & XkbKeyNamesMask) && !names->keys) {
-        names->keys = uTypedCalloc(keymap->max_key_code + 1,
-                                   struct xkb_key_name);
-        if (!names->keys)
-            return BadAlloc;
-    }
-
-    if ((which & XkbKeyAliasesMask) && (nTotalAliases > 0)) {
-        if (!names->key_aliases)
-            names->key_aliases = uTypedCalloc(nTotalAliases,
-                                                 struct xkb_key_alias);
-        else if (nTotalAliases > names->num_key_aliases) {
-            struct xkb_key_alias *prev_aliases = names->key_aliases;
-
-            names->key_aliases = uTypedRecalloc(names->key_aliases,
-                                                names->num_key_aliases,
-                                                nTotalAliases,
-                                                struct xkb_key_alias);
-            if (!names->key_aliases)
-                free(prev_aliases);
-        }
-
-        if (!names->key_aliases) {
-            names->num_key_aliases = 0;
-            return BadAlloc;
-        }
+    if (which & XkbKeyNamesMask)
+        darray_resize0(keymap->names->keys, keymap->max_key_code + 1);
 
-        names->num_key_aliases = nTotalAliases;
-    }
+    if (which & XkbKeyAliasesMask)
+        darray_resize0(keymap->names->key_aliases, nTotalAliases);
 
     return Success;
 }
@@ -458,8 +433,8 @@ XkbcFreeNames(struct xkb_keymap *keymap)
     for (i = 0; i < XkbNumKbdGroups; i++)
         free(UNCONSTIFY(names->groups[i]));
 
-    free(names->keys);
-    free(names->key_aliases);
+    darray_free(names->keys);
+    darray_free(names->key_aliases);
     free(names);
     keymap->names = NULL;
 }
index c9a3314..0e94682 100644 (file)
@@ -34,7 +34,7 @@ XkbcAllocCompatMap(struct xkb_keymap *keymap, unsigned nSI);
 
 extern int
 XkbcAllocNames(struct xkb_keymap *keymap, unsigned which,
-               unsigned nTotalAliases);
+               size_t nTotalAliases);
 
 extern int
 XkbcAllocControls(struct xkb_keymap *keymap);
index 876dbfd..4fa85c1 100644 (file)
@@ -330,11 +330,9 @@ struct xkb_names {
     const char            *vmods[XkbNumVirtualMods];
     const char            *indicators[XkbNumIndicators];
     const char            *groups[XkbNumKbdGroups];
-    struct xkb_key_name *     keys;
-    struct xkb_key_alias *    key_aliases;
 
-    xkb_keycode_t     num_keys;
-    xkb_keycode_t     num_key_aliases;
+    darray(struct xkb_key_name) keys;
+    darray(struct xkb_key_alias) key_aliases;
 };
 
 struct xkb_controls {
index 2b05646..ae1ebdc 100644 (file)
@@ -157,8 +157,8 @@ ApplyAliases(struct xkb_keymap *keymap, AliasInfo ** info_in)
 
     if (*info_in == NULL)
         return true;
-    nOld = (keymap->names ? keymap->names->num_key_aliases : 0);
-    old = (keymap->names ? keymap->names->key_aliases : NULL);
+    nOld = (keymap->names ? darray_size(keymap->names->key_aliases) : 0);
+    old = (keymap->names ? &darray_item(keymap->names->key_aliases, 0) : NULL);
     for (nNew = 0, info = *info_in; info != NULL;
          info = (AliasInfo *) info->def.next)
     {
@@ -221,7 +221,7 @@ ApplyAliases(struct xkb_keymap *keymap, AliasInfo ** info_in)
         WSGO("Allocation failure in ApplyAliases\n");
         return false;
     }
-    a = keymap->names ? &keymap->names->key_aliases[nOld] : NULL;
+    a = keymap->names ? &darray_item(keymap->names->key_aliases, nOld) : NULL;
     for (info = *info_in; info != NULL; info = (AliasInfo *) info->def.next)
     {
         if (info->alias[0] != '\0')
index cca2688..c5cd613 100644 (file)
@@ -897,7 +897,8 @@ CompileKeycodes(XkbFile *file, struct xkb_keymap *keymap, unsigned merge)
         == Success) {
         uint64_t i;
         for (i = info.computedMin; i <= info.computedMax; i++)
-            LongToKeyName(info.names[i], keymap->names->keys[i].name);
+            LongToKeyName(info.names[i],
+                          darray_item(keymap->names->keys, i).name);
     } else {
         WSGO("Cannot create struct xkb_names in CompileKeycodes\n");
         goto err_info;
index e29c9ae..5ff1e65 100644 (file)
@@ -244,12 +244,12 @@ FindNamedKey(struct xkb_keymap *keymap, unsigned long name,
     }
 
     *kc_rtrn = 0;               /* some callers rely on this */
-    if (keymap && keymap->names && keymap->names->keys)
+    if (keymap && keymap->names && !darray_empty(keymap->names->keys))
     {
         for (n = start_from; n <= keymap->max_key_code; n++)
         {
             unsigned long tmp;
-            tmp = KeyNameToLong(keymap->names->keys[n].name);
+            tmp = KeyNameToLong(darray_item(keymap->names->keys, n).name);
             if (tmp == name)
             {
                 *kc_rtrn = n;
@@ -266,7 +266,7 @@ FindNamedKey(struct xkb_keymap *keymap, unsigned long name,
     }
     if (create)
     {
-        if ((!keymap->names) || (!keymap->names->keys))
+        if ((!keymap->names) || darray_empty(keymap->names->keys))
         {
             if (XkbcAllocNames(keymap, XkbKeyNamesMask, 0) != Success)
             {
@@ -282,11 +282,12 @@ FindNamedKey(struct xkb_keymap *keymap, unsigned long name,
         /* Find first unused keycode and store our key here */
         for (n = keymap->min_key_code; n <= keymap->max_key_code; n++)
         {
-            if (keymap->names->keys[n].name[0] == '\0')
+            if (darray_item(keymap->names->keys, n).name[0] == '\0')
             {
                 char buf[XkbKeyNameLength + 1];
                 LongToKeyName(name, buf);
-                memcpy(keymap->names->keys[n].name, buf, XkbKeyNameLength);
+                memcpy(darray_item(keymap->names->keys, n).name, buf,
+                       XkbKeyNameLength);
                 *kc_rtrn = n;
                 return true;
             }
@@ -299,19 +300,14 @@ bool
 FindKeyNameForAlias(struct xkb_keymap *keymap, unsigned long lname,
                     unsigned long *real_name)
 {
-    unsigned int i;
     char name[XkbKeyNameLength + 1];
+    struct xkb_key_alias *a;
 
-    if (keymap && keymap->names && keymap->names->key_aliases)
-    {
-        struct xkb_key_alias * a;
-        a = keymap->names->key_aliases;
+    if (keymap && keymap->names) {
         LongToKeyName(lname, name);
         name[XkbKeyNameLength] = '\0';
-        for (i = 0; i < keymap->names->num_key_aliases; i++, a++)
-        {
-            if (strncmp(name, a->alias, XkbKeyNameLength) == 0)
-            {
+        darray_foreach(a, keymap->names->key_aliases) {
+            if (strncmp(name, a->alias, XkbKeyNameLength) == 0) {
                 *real_name = KeyNameToLong(a->real);
                 return true;
             }
index 3ae10cf..8b371b9 100644 (file)
@@ -2236,12 +2236,12 @@ CompileSymbols(XkbFile *file, struct xkb_keymap *keymap, unsigned merge)
 
     if (warningLevel > 3) {
         for (i = keymap->min_key_code; i <= keymap->max_key_code; i++) {
-            if (keymap->names->keys[i].name[0] == '\0')
+            if (darray_item(keymap->names->keys, i).name[0] == '\0')
                 continue;
 
             if (XkbKeyNumGroups(keymap, i) < 1) {
                 char buf[5];
-                memcpy(buf, keymap->names->keys[i].name, 4);
+                memcpy(buf, darray_item(keymap->names->keys, i).name, 4);
                 buf[4] = '\0';
                 WARN("No symbols defined for <%s> (keycode %d)\n", buf, i);
             }