Index: funcs/func_strings.c =================================================================== --- funcs/func_strings.c (revision 9169) +++ funcs/func_strings.c (working copy) @@ -79,6 +79,50 @@ .read = function_fieldqty, }; +static char *builtin_function_keypadhash(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) +{ + char *bufptr, *dataptr; + for (bufptr = buf, dataptr = data; bufptr < buf + len - 1; dataptr++) { + if (*dataptr == '1') { + *bufptr++ = '1'; + } else if (strchr("AaBbCc2", *dataptr)) { + *bufptr++ = '2'; + } else if (strchr("DdEeFf3", *dataptr)) { + *bufptr++ = '3'; + } else if (strchr("GgHhIi4", *dataptr)) { + *bufptr++ = '4'; + } else if (strchr("JjKkLl5", *dataptr)) { + *bufptr++ = '5'; + } else if (strchr("MmNnOo6", *dataptr)) { + *bufptr++ = '6'; + } else if (strchr("PpQqRrSs7", *dataptr)) { + *bufptr++ = '7'; + } else if (strchr("TtUuVv8", *dataptr)) { + *bufptr++ = '8'; + } else if (strchr("WwXxYyZz9", *dataptr)) { + *bufptr++ = '9'; + } else if (*dataptr == '0') { + *bufptr++ = '0'; + } else if (*dataptr == '\0') { + *bufptr++ = '\0'; + break; + } + } + buf[len - 1] = '\0'; + return buf; +} + +#ifndef BUILTIN_FUNC +static +#endif +struct ast_custom_function keypadhash_function = { + .name = "KEYPADHASH", + .synopsis = "Hash the letters in the string into the equivalent keypad numbers.", + .syntax = "KEYPADHASH()", + .read = builtin_function_keypadhash, + .desc = "Example: ${KEYPADHASH(Les)} returns \"537\"\n", +}; + static char *builtin_function_filter(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) { char *parse;