enum status_code get_key_value(const char **name_ptr, struct key *key) { const char *name = *name_ptr; const char *end = NULL; memset(key, 0, sizeof(*key)); if (*name == '<') { end = strchr(name + 1, '>'); if (!end) return error("Missing '>' from key mapping: %s", name); if (!prefixcmp(name, "<Ctrl-")) { key->modifiers.control = 1; return parse_key_value(key, name_ptr, 6, NULL, end); } else if (!prefixcmp(name, "<C-")) { key->modifiers.control = 1; return parse_key_value(key, name_ptr, 3, NULL, end); } else { const struct key_mapping *mapping; const char *start = name + 1; int len = end - start; mapping = get_key_mapping(start, len); if (!mapping) return error("Unknown key mapping: %.*s", len, start); if (mapping->value == ' ') return parse_key_value(key, name_ptr, 0, " ", end); if (mapping->value == '#') return parse_key_value(key, name_ptr, 0, "#", end); if (mapping->value == '<') return parse_key_value(key, name_ptr, 0, "<", end); *name_ptr = end + 1; key->data.value = mapping->value; return SUCCESS; } } if (name[0] == '^' && name[1] == '[') { return error("Escape key combo must now use '<Esc>%s' " "instead of '%s'", name + 2, name); } else if (name[0] == '^' && name[1] != '\0') { return error("Control key mapping must now use '<Ctrl-%s>' " "instead of '%s'", name + 1, name); } return parse_key_value(key, name_ptr, 0, NULL, end); }
vector<string> letterCombinations(string digits) { vector<string> ret; if (digits.size() == 0) { return {""}; } // build data vector<vector<char> > phone_key = get_key_mapping(); string buf; combinations(ret, digits, 0, buf, phone_key); return ret; }