compose: drop the 65535 node limit (#343) In commit 1638409b22aef33d487863876ab214b949db4984, the number of compose nodes was limited to 65535 to enable "future optimizations", which apparently means slightly reduced memory usage due to fitting in a uint16_t. At this time, it was mentioned that the author was not aware of "any compose files which come close". However, I'm one of the users that actually do require a larger number of nodes for their compose file. Thus, use a uint32_t again and raise the limit significantly.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
diff --git a/src/compose/parser.c b/src/compose/parser.c
index f84b314..124456d 100644
--- a/src/compose/parser.c
+++ b/src/compose/parser.c
@@ -332,8 +332,8 @@ add_production(struct xkb_compose_table *table, struct scanner *s,
const struct production *production)
{
unsigned lhs_pos = 0;
- uint16_t curr = darray_size(table->nodes) == 1 ? 0 : 1;
- uint16_t *pptr = NULL;
+ uint32_t curr = darray_size(table->nodes) == 1 ? 0 : 1;
+ uint32_t *pptr = NULL;
struct compose_node *node = NULL;
/* Warn before potentially going over the limit, discard silently after. */
diff --git a/src/compose/state.c b/src/compose/state.c
index 6ba0344..7a78891 100644
--- a/src/compose/state.c
+++ b/src/compose/state.c
@@ -41,8 +41,8 @@ struct xkb_compose_state {
* This is also sufficient for inferring the current status; see
* xkb_compose_state_get_status().
*/
- uint16_t prev_context;
- uint16_t context;
+ uint32_t prev_context;
+ uint32_t context;
};
XKB_EXPORT struct xkb_compose_state *
@@ -91,7 +91,7 @@ xkb_compose_state_get_compose_table(struct xkb_compose_state *state)
XKB_EXPORT enum xkb_compose_feed_result
xkb_compose_state_feed(struct xkb_compose_state *state, xkb_keysym_t keysym)
{
- uint16_t context;
+ uint32_t context;
const struct compose_node *node;
/*
diff --git a/src/compose/table.h b/src/compose/table.h
index 6be4348..825a8e2 100644
--- a/src/compose/table.h
+++ b/src/compose/table.h
@@ -75,16 +75,17 @@
* \0 is so offset 0 points to an empty string).
*/
-/* Fits in uint16_t, also a good idea to have some limit. */
-#define MAX_COMPOSE_NODES 65535
+/* 7 nodes for every potential Unicode character and then some should be
+ * enough for all purposes. */
+#define MAX_COMPOSE_NODES (1 << 23)
struct compose_node {
xkb_keysym_t keysym;
/* Offset into xkb_compose_table::nodes or 0. */
- uint16_t lokid;
+ uint32_t lokid;
/* Offset into xkb_compose_table::nodes or 0. */
- uint16_t hikid;
+ uint32_t hikid;
union {
struct {
@@ -95,7 +96,7 @@ struct compose_node {
uint32_t _pad:31;
bool is_leaf:1;
/* Offset into xkb_compose_table::nodes or 0. */
- uint16_t eqkid;
+ uint32_t eqkid;
} internal;
struct {
/* Offset into xkb_compose_table::utf8. */