Example #1
0
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;
 }