Commit d941bc0c03580804169de3d07e6b6e4224b3d254

Ran Benita 2012-09-23T22:12:43

keymap, symbols: use darray for num_groups Instead of using a static array of size XKB_NUM_GROUPS, because we want to get rid of this limit. Signed-off-by: Ran Benita <ran234@gmail.com>

diff --git a/src/keymap-dump.c b/src/keymap-dump.c
index 701441c..72db22b 100644
--- a/src/keymap-dump.c
+++ b/src/keymap-dump.c
@@ -599,6 +599,7 @@ write_symbols(struct xkb_keymap *keymap, struct buf *buf)
 {
     struct xkb_key *key;
     xkb_layout_index_t group, tmp;
+    xkb_atom_t *group_name;
     bool showActions;
 
     if (keymap->symbols_section_name)
@@ -607,12 +608,13 @@ write_symbols(struct xkb_keymap *keymap, struct buf *buf)
     else
         write_buf(buf, "\txkb_symbols {\n\n");
 
-    for (tmp = group = 0; group < XKB_NUM_GROUPS; group++) {
-        if (!keymap->group_names[group])
+    tmp = 0;
+    darray_enumerate(group, group_name, keymap->group_names) {
+        if (!*group_name)
             continue;
         write_buf(buf,
                   "\t\tname[group%d]=\"%s\";\n", group + 1,
-                  xkb_atom_text(keymap->ctx, keymap->group_names[group]));
+                  xkb_atom_text(keymap->ctx, *group_name));
         tmp++;
     }
     if (tmp > 0)
diff --git a/src/keymap.c b/src/keymap.c
index 43e43dd..a36a404 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -104,6 +104,7 @@ xkb_keymap_unref(struct xkb_keymap *keymap)
     darray_free(keymap->keys);
     darray_free(keymap->sym_interpret);
     darray_free(keymap->key_aliases);
+    darray_free(keymap->group_names);
     free(keymap->keycodes_section_name);
     free(keymap->symbols_section_name);
     free(keymap->types_section_name);
@@ -192,10 +193,11 @@ xkb_keymap_num_layouts(struct xkb_keymap *keymap)
 XKB_EXPORT const char *
 xkb_keymap_layout_get_name(struct xkb_keymap *keymap, xkb_layout_index_t idx)
 {
-    if (idx >= xkb_keymap_num_layouts(keymap))
+    if (idx >= xkb_keymap_num_layouts(keymap) ||
+        idx >= darray_size(keymap->group_names))
         return NULL;
 
-    return xkb_atom_text(keymap->ctx, keymap->group_names[idx]);
+    return xkb_atom_text(keymap->ctx, darray_item(keymap->group_names, idx));
 }
 
 /**
@@ -204,15 +206,15 @@ xkb_keymap_layout_get_name(struct xkb_keymap *keymap, xkb_layout_index_t idx)
 XKB_EXPORT xkb_layout_index_t
 xkb_keymap_layout_get_index(struct xkb_keymap *keymap, const char *name)
 {
-    xkb_layout_index_t num_groups = xkb_keymap_num_layouts(keymap);
     xkb_atom_t atom = xkb_atom_lookup(keymap->ctx, name);
+    xkb_atom_t *group_name;
     xkb_layout_index_t i;
 
     if (atom == XKB_ATOM_NONE)
         return XKB_LAYOUT_INVALID;
 
-    for (i = 0; i < num_groups; i++)
-        if (keymap->group_names[i] == atom)
+    darray_enumerate(i, group_name, keymap->group_names)
+        if (*group_name == atom)
             return i;
 
     return XKB_LAYOUT_INVALID;
diff --git a/src/keymap.h b/src/keymap.h
index af47e4b..48f2da0 100644
--- a/src/keymap.h
+++ b/src/keymap.h
@@ -336,6 +336,8 @@ struct xkb_key {
     xkb_keysym_t *syms;
 };
 
+typedef darray(xkb_atom_t) darray_xkb_atom_t;
+
 /* Common keyboard description structure */
 struct xkb_keymap {
     struct xkb_context *ctx;
@@ -365,7 +367,7 @@ struct xkb_keymap {
 
     /* Number of groups in the key with the most groups. */
     xkb_layout_index_t num_groups;
-    xkb_atom_t group_names[XKB_NUM_GROUPS];
+    darray_xkb_atom_t group_names;
 
     struct xkb_indicator_map indicators[XKB_NUM_INDICATORS];
 
diff --git a/src/xkbcomp/symbols.c b/src/xkbcomp/symbols.c
index 05cf10e..7ef5722 100644
--- a/src/xkbcomp/symbols.c
+++ b/src/xkbcomp/symbols.c
@@ -167,7 +167,7 @@ typedef struct _SymbolsInfo {
     KeyInfo dflt;
     VModInfo vmods;
     ActionsInfo *actions;
-    xkb_atom_t group_names[XKB_NUM_GROUPS];
+    darray_xkb_atom_t group_names;
     darray(ModMapEntry) modMaps;
 
     struct xkb_keymap *keymap;
@@ -195,6 +195,7 @@ ClearSymbolsInfo(SymbolsInfo * info)
     darray_foreach(keyi, info->keys)
         ClearKeyInfo(keyi);
     darray_free(info->keys);
+    darray_free(info->group_names);
     darray_free(info->modMaps);
     ClearKeyInfo(&info->dflt);
 }
@@ -549,22 +550,33 @@ MergeIncludedSymbols(SymbolsInfo *into, SymbolsInfo *from,
     unsigned int i;
     KeyInfo *keyi;
     ModMapEntry *mm;
+    xkb_atom_t *group_name;
+    xkb_layout_index_t group_names_in_both;
 
     if (from->errorCount > 0) {
         into->errorCount += from->errorCount;
         return;
     }
+
     if (into->name == NULL) {
         into->name = from->name;
         from->name = NULL;
     }
-    for (i = 0; i < XKB_NUM_GROUPS; i++) {
-        if (from->group_names[i] != XKB_ATOM_NONE) {
-            if ((merge != MERGE_AUGMENT) ||
-                (into->group_names[i] == XKB_ATOM_NONE))
-                into->group_names[i] = from->group_names[i];
-        }
+
+    group_names_in_both = MIN(darray_size(into->group_names),
+                              darray_size(from->group_names));
+    for (i = 0; i < group_names_in_both; i++) {
+        if (!darray_item(from->group_names, i))
+            continue;
+
+        if (merge == MERGE_AUGMENT && darray_item(into->group_names, i))
+            continue;
+
+        darray_item(into->group_names, i) = darray_item(from->group_names, i);
     }
+    /* If @from has more, get them as well. */
+    darray_foreach_from(group_name, from->group_names, group_names_in_both)
+        darray_append(into->group_names, *group_name);
 
     darray_foreach(keyi, from->keys) {
         merge = (merge == MERGE_DEFAULT ? keyi->merge : merge);
@@ -768,14 +780,20 @@ AddSymbolsToKey(SymbolsInfo *info, KeyInfo *keyi, ExprDef *arrayNdx,
                                           leveli->sym_index + j),
                               &darray_item(groupi->syms,
                                            leveli->sym_index + j))) {
+                const char *group_name = "unnamed";
+
+                if (ndx < darray_size(info->group_names) &&
+                    darray_item(info->group_names, ndx))
+                    group_name = xkb_atom_text(info->keymap->ctx,
+                                               darray_item(info->group_names,
+                                                           ndx));
+
                 log_warn(info->keymap->ctx,
                          "Could not resolve keysym %s for key %s, group %u (%s), level %u\n",
                          darray_item(value->value.list.syms, i),
                          LongKeyNameText(keyi->name),
-                         ndx + 1,
-                         xkb_atom_text(info->keymap->ctx,
-                                       info->group_names[ndx]),
-                         nSyms);
+                         ndx + 1, group_name, nSyms);
+
                 leveli->sym_index = 0;
                 leveli->num_syms = 0;
                 break;
@@ -1033,7 +1051,7 @@ SetSymbolsField(SymbolsInfo *info, KeyInfo *keyi, const char *field,
 static int
 SetGroupName(SymbolsInfo *info, ExprDef *arrayNdx, ExprDef *value)
 {
-    xkb_layout_index_t grp;
+    xkb_layout_index_t grp, grp_to_use;
     xkb_atom_t name;
 
     if (!arrayNdx) {
@@ -1057,18 +1075,26 @@ SetGroupName(SymbolsInfo *info, ExprDef *arrayNdx, ExprDef *value)
         return false;
     }
 
-    if (info->explicit_group == XKB_LAYOUT_INVALID)
-        info->group_names[grp - 1] = name;
-    else if (grp - 1 == 0)
-        info->group_names[info->explicit_group] = name;
-    else
+    grp_to_use = XKB_LAYOUT_INVALID;
+    if (info->explicit_group == XKB_LAYOUT_INVALID) {
+        grp_to_use = grp - 1;
+    }
+    else if (grp - 1 == 0) {
+        grp_to_use = info->explicit_group;
+    }
+    else {
         log_warn(info->keymap->ctx,
                  "An explicit group was specified for the '%s' map, "
                  "but it provides a name for a group other than Group1 (%d); "
                  "Ignoring group name '%s'\n",
                  info->name, grp,
                  xkb_atom_text(info->keymap->ctx, name));
+        return false;
+    }
 
+    if (grp_to_use >= darray_size(info->group_names))
+        darray_resize0(info->group_names, grp_to_use + 1);
+    darray_item(info->group_names, grp_to_use) = name;
     return true;
 }
 
@@ -1672,14 +1698,12 @@ CopySymbolsToKeymap(struct xkb_keymap *keymap, SymbolsInfo *info)
 {
     KeyInfo *keyi;
     ModMapEntry *mm;
-    xkb_layout_index_t i;
     struct xkb_key *key;
 
     keymap->symbols_section_name = strdup_safe(info->name);
 
-    for (i = 0; i < XKB_NUM_GROUPS; i++)
-        if (info->group_names[i] != XKB_ATOM_NONE)
-            keymap->group_names[i] = info->group_names[i];
+    keymap->group_names = info->group_names;
+    darray_init(info->group_names);
 
     darray_foreach(keyi, info->keys)
         if (!CopySymbolsDef(info, keyi))