genmap.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /* genmap.c
  3. * originally written by: Kirk Reiser.
  4. *
  5. ** Copyright (C) 2002 Kirk Reiser.
  6. * Copyright (C) 2003 David Borowski.
  7. */
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <libgen.h>
  11. #include <string.h>
  12. #include <linux/version.h>
  13. #include <ctype.h>
  14. #include "utils.h"
  15. struct st_key_init {
  16. char *name;
  17. int value, shift;
  18. };
  19. static unsigned char key_data[MAXKEYVAL][16], *kp;
  20. #include "mapdata.h"
  21. static const char delims[] = "\t\n ";
  22. static char *cp;
  23. static int map_ver = 119; /* an arbitrary number so speakup can check */
  24. static int shift_table[17];
  25. static int max_states = 1, flags;
  26. /* flags reserved for later, maybe for individual console maps */
  27. static int get_shift_value(int state)
  28. {
  29. int i;
  30. for (i = 0; shift_table[i] != state; i++) {
  31. if (shift_table[i] == -1) {
  32. if (i >= 16)
  33. oops("too many shift states", NULL);
  34. shift_table[i] = state;
  35. max_states = i+1;
  36. break;
  37. }
  38. }
  39. return i;
  40. }
  41. int
  42. main(int argc, char *argv[])
  43. {
  44. int value, shift_state, i, spk_val = 0, lock_val = 0;
  45. int max_key_used = 0, num_keys_used = 0;
  46. struct st_key *this;
  47. struct st_key_init *p_init;
  48. char buffer[256];
  49. bzero(key_table, sizeof(key_table));
  50. bzero(key_data, sizeof(key_data));
  51. shift_table[0] = 0;
  52. for (i = 1; i <= 16; i++)
  53. shift_table[i] = -1;
  54. if (argc < 2) {
  55. fputs("usage: genmap filename\n", stderr);
  56. exit(1);
  57. }
  58. for (p_init = init_key_data; p_init->name[0] != '.'; p_init++)
  59. add_key(p_init->name, p_init->value, p_init->shift);
  60. open_input(NULL, argv[1]);
  61. while (fgets(buffer, sizeof(buffer), infile)) {
  62. lc++;
  63. value = shift_state = 0;
  64. cp = strtok(buffer, delims);
  65. if (*cp == '#')
  66. continue;
  67. while (cp) {
  68. if (*cp == '=')
  69. break;
  70. this = find_key(cp);
  71. if (this == NULL)
  72. oops("unknown key/modifier", cp);
  73. if (this->shift == is_shift) {
  74. if (value)
  75. oops("modifiers must come first", cp);
  76. shift_state += this->value;
  77. } else if (this->shift == is_input)
  78. value = this->value;
  79. else
  80. oops("bad modifier or key", cp);
  81. cp = strtok(0, delims);
  82. }
  83. if (!cp)
  84. oops("no = found", NULL);
  85. cp = strtok(0, delims);
  86. if (!cp)
  87. oops("no speakup function after =", NULL);
  88. this = find_key(cp);
  89. if (this == NULL || this->shift != is_spk)
  90. oops("invalid speakup function", cp);
  91. i = get_shift_value(shift_state);
  92. if (key_data[value][i]) {
  93. while (--cp > buffer)
  94. if (!*cp)
  95. *cp = ' ';
  96. oops("two functions on same key combination", cp);
  97. }
  98. key_data[value][i] = (char)this->value;
  99. if (value > max_key_used)
  100. max_key_used = value;
  101. }
  102. fclose(infile);
  103. this = find_key("spk_key");
  104. if (this)
  105. spk_val = this->value;
  106. this = find_key("spk_lock");
  107. if (this)
  108. lock_val = this->value;
  109. for (lc = 1; lc <= max_key_used; lc++) {
  110. kp = key_data[lc];
  111. if (!memcmp(key_data[0], kp, 16))
  112. continue;
  113. num_keys_used++;
  114. for (i = 0; i < max_states; i++) {
  115. if (kp[i] != spk_val && kp[i] != lock_val)
  116. continue;
  117. shift_state = shift_table[i];
  118. if (shift_state&16)
  119. continue;
  120. shift_state = get_shift_value(shift_state+16);
  121. kp[shift_state] = kp[i];
  122. /* fill in so we can process the key up, as spk bit will be set */
  123. }
  124. }
  125. printf("\t%d, %d, %d,\n\t", map_ver, num_keys_used, max_states);
  126. for (i = 0; i < max_states; i++)
  127. printf("%d, ", shift_table[i]);
  128. printf("%d,", flags);
  129. for (lc = 1; lc <= max_key_used; lc++) {
  130. kp = key_data[lc];
  131. if (!memcmp(key_data[0], kp, 16))
  132. continue;
  133. printf("\n\t%d,", lc);
  134. for (i = 0; i < max_states; i++)
  135. printf(" %d,", (unsigned int)kp[i]);
  136. }
  137. printf("\n\t0, %d\n", map_ver);
  138. exit(0);
  139. }