diff --git a/src/include/switch_utils.h b/src/include/switch_utils.h index edbfc905a9..13fc9dbdd9 100644 --- a/src/include/switch_utils.h +++ b/src/include/switch_utils.h @@ -302,6 +302,7 @@ SWITCH_DECLARE(switch_bool_t) switch_is_number(const char *str); SWITCH_DECLARE(char *) switch_strip_spaces(const char *str); SWITCH_DECLARE(const char *) switch_stristr(const char *str, const char *instr); SWITCH_DECLARE(switch_bool_t) switch_is_lan_addr(const char *ip); +SWITCH_DECLARE(char *) switch_replace_char(char *str, char from, char to, switch_bool_t dup); /*! \brief Escape a string by prefixing a list of characters with an escape character diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c index da98974df8..193fad78e8 100644 --- a/src/mod/applications/mod_commands/mod_commands.c +++ b/src/mod/applications/mod_commands/mod_commands.c @@ -41,6 +41,61 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load); SWITCH_MODULE_DEFINITION(mod_commands, mod_commands_load, NULL, NULL); +SWITCH_STANDARD_API(regex_function) +{ + switch_regex_t *re = NULL; + int ovector[30]; + int argc; + char *mydata = NULL, *argv[3]; + size_t len = 0; + char *substituted = NULL; + int proceed = 0; + + if (!cmd) { + goto error; + } + + mydata = strdup(cmd); + assert(mydata); + + argc = switch_separate_string(mydata, '|', argv, (sizeof(argv) / sizeof(argv[0]))); + + if (argc < 2) { + goto error; + } + + + if ((proceed = switch_regex_perform(argv[0], argv[1], &re, ovector, sizeof(ovector) / sizeof(ovector[0])))) { + if (argc > 2) { + len = strlen(argv[0]) * 3; + substituted = malloc(len); + assert(substituted); + memset(substituted, 0, len); + switch_replace_char(argv[2], '%','$', SWITCH_FALSE); + switch_perform_substitution(re, proceed, argv[2], argv[0], substituted, len, ovector); + + stream->write_function(stream, "%s", substituted); + free(substituted); + } else { + stream->write_function(stream, "true"); + } + } else { + stream->write_function(stream, "false"); + } + + goto ok; + + error: + stream->write_function(stream, "!err!"); + ok: + + switch_regex_safe_free(re); + switch_safe_free(mydata); + + return SWITCH_STATUS_SUCCESS; + +} + typedef enum { O_NONE, O_EQ, @@ -1640,6 +1695,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load) SWITCH_ADD_API(commands_api_interface, "xml_wrap", "Wrap another api command in xml", xml_wrap_api_function, " "); SWITCH_ADD_API(commands_api_interface, "is_lan_addr", "see if an ip is a lan addr", lan_addr_function, ""); SWITCH_ADD_API(commands_api_interface, "qq", "Eval a conditional", qq_function, " ? : "); + SWITCH_ADD_API(commands_api_interface, "regex", "Eval a regex", regex_function, "|[|]"); /* indicate that the module should continue to be loaded */ return SWITCH_STATUS_NOUNLOAD; diff --git a/src/mod/applications/mod_expr/mod_expr.c b/src/mod/applications/mod_expr/mod_expr.c index 197154224d..ea7f1ed3ef 100644 --- a/src/mod/applications/mod_expr/mod_expr.c +++ b/src/mod/applications/mod_expr/mod_expr.c @@ -111,7 +111,7 @@ SWITCH_STANDARD_API(expr_function) /* Parse expression */ err = exprParse(e, (char *)expr); - printf("WTF %s\n", expr); + if(err != EXPR_ERROR_NOERROR) goto error; diff --git a/src/switch_utils.c b/src/switch_utils.c index eb37b28ad8..91c2e7db2a 100644 --- a/src/switch_utils.c +++ b/src/switch_utils.c @@ -223,6 +223,26 @@ SWITCH_DECLARE(switch_bool_t) switch_is_lan_addr(const char *ip) } +SWITCH_DECLARE(char *) switch_replace_char(char *str, char from, char to, switch_bool_t dup) +{ + char *p; + + if (dup) { + p = strdup(str); + assert(p); + } else { + p = str; + } + + for(;p && *p; p++) { + if (*p == from) { + *p = to; + } + } + + return p; +} + SWITCH_DECLARE(char *) switch_strip_spaces(const char *str) { const char *sp = str;