+static const char *
+modified_key(const char *name)
+{
+ static char result[100];
+ char buffer[sizeof(result) - 10];
+ int value;
+ char chr;
+ static const char *modifiers[][2] =
+ {
+ {"", ""},
+ {"s-", "shift-"},
+ {"a-", "alt-"},
+ {"as-", "alt-shift-"},
+ {"c-", "ctrl-"},
+ {"sc-", "ctrl-shift-"},
+ {"ac-", "alt-ctrl-"},
+ {"acs-" "alt-ctrl-shift-"},
+ };
+
+ if (strlen(name) > (sizeof(result) - 3)) {
+ *result = '\0';
+ } else if (sscanf(name, "kf%d%c", &value, &chr) == 1 &&
+ value >= 1 &&
+ value <= 63) {
+ /* map 1,2,3,4,5,6,7 to 1,2,5,... */
+ int map = ((value - 1) / 12);
+ int key = ((value - 1) % 12);
+ int bit1 = (map & 2);
+ int bit2 = (map & 4);
+ map &= ~6;
+ map |= (bit1 << 1) | (bit2 >> 1);
+ _nc_SPRINTF(result, _nc_SLIMIT(sizeof(result))
+ "%sF%d", modifiers[map][(unsigned) f_opt], 1 + key);
+ } else if (sscanf(name, "k%[A-Z]%d%c", buffer, &value, &chr) == 2 &&
+ (value > 1 &&
+ value <= 8) &&
+ (!strcmp(buffer, "UP") ||
+ !strcmp(buffer, "DN") ||
+ !strcmp(buffer, "LFT") ||
+ !strcmp(buffer, "RIT") ||
+ !strcmp(buffer, "IC") ||
+ !strcmp(buffer, "DC") ||
+ !strcmp(buffer, "HOM") ||
+ !strcmp(buffer, "END") ||
+ !strcmp(buffer, "NXT") ||
+ !strcmp(buffer, "PRV"))) {
+ _nc_SPRINTF(result, _nc_SLIMIT(sizeof(result))
+ "%sk%s", modifiers[value - 1][(unsigned) f_opt], buffer);
+ } else if (sscanf(name, "k%[A-Z]%c", buffer, &chr) == 1 &&
+ (!strcmp(buffer, "UP") ||
+ !strcmp(buffer, "DN"))) {
+ _nc_SPRINTF(result, _nc_SLIMIT(sizeof(result))
+ "%sk%s", modifiers[1][(unsigned) f_opt], buffer);
+ } else {
+ *result = '\0';
+ }
+ return result;
+}
+