compose-iter.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /*
  2. * Copyright © 2022 Ran Benita <ran@unusedvar.com>
  3. * SPDX-License-Identifier: MIT
  4. */
  5. #include "config.h"
  6. #include "test-config.h"
  7. #include "src/darray.h"
  8. #include <stdio.h>
  9. #include <stdbool.h>
  10. #include <string.h>
  11. #include "xkbcommon/xkbcommon-compose.h"
  12. #include "src/compose/escape.h"
  13. #include "src/compose/constants.h"
  14. #include "src/keysym.h"
  15. #include "src/utils.h"
  16. #include "test/compose-iter.h"
  17. /* Reference implentation of Compose table traversal */
  18. static void
  19. for_each_helper(struct xkb_compose_table *table,
  20. xkb_compose_table_iter_t iter,
  21. void *data,
  22. xkb_keysym_t *syms,
  23. size_t nsyms,
  24. uint32_t p)
  25. {
  26. if (!p) {
  27. return;
  28. }
  29. const struct compose_node *node = &darray_item(table->nodes, p);
  30. for_each_helper(table, iter, data, syms, nsyms, node->lokid);
  31. syms[nsyms++] = node->keysym;
  32. if (node->is_leaf) {
  33. struct xkb_compose_table_entry entry = {
  34. .sequence = syms,
  35. .sequence_length = nsyms,
  36. .keysym = node->leaf.keysym,
  37. .utf8 = &darray_item(table->utf8, node->leaf.utf8),
  38. };
  39. iter(&entry, data);
  40. } else {
  41. for_each_helper(table, iter, data, syms, nsyms, node->internal.eqkid);
  42. }
  43. nsyms--;
  44. for_each_helper(table, iter, data, syms, nsyms, node->hikid);
  45. }
  46. void
  47. xkb_compose_table_for_each(struct xkb_compose_table *table,
  48. xkb_compose_table_iter_t iter,
  49. void *data)
  50. {
  51. if (darray_size(table->nodes) <= 1) {
  52. return;
  53. }
  54. xkb_keysym_t syms[COMPOSE_MAX_LHS_LEN];
  55. for_each_helper(table, iter, data, syms, 0, 1);
  56. }