[Freeswitch-svn] [commit] r6193 - in freeswitch/trunk/src: . include mod/applications/mod_commands mod/applications/mod_expr
Freeswitch SVN
anthm at freeswitch.org
Fri Nov 9 10:26:33 EST 2007
Author: anthm
Date: Fri Nov 9 10:26:32 2007
New Revision: 6193
Modified:
freeswitch/trunk/src/include/switch_utils.h
freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c
freeswitch/trunk/src/mod/applications/mod_expr/mod_expr.c
freeswitch/trunk/src/switch_utils.c
Log:
add regex api func
Modified: freeswitch/trunk/src/include/switch_utils.h
==============================================================================
--- freeswitch/trunk/src/include/switch_utils.h (original)
+++ freeswitch/trunk/src/include/switch_utils.h Fri Nov 9 10:26:32 2007
@@ -302,6 +302,7 @@
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
Modified: freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c Fri Nov 9 10:26:32 2007
@@ -41,6 +41,61 @@
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_ADD_API(commands_api_interface, "xml_wrap", "Wrap another api command in xml", xml_wrap_api_function, "<command> <args>");
SWITCH_ADD_API(commands_api_interface, "is_lan_addr", "see if an ip is a lan addr", lan_addr_function, "<ip>");
SWITCH_ADD_API(commands_api_interface, "qq", "Eval a conditional", qq_function, "<expr> ? <true val> : <false val>");
+ SWITCH_ADD_API(commands_api_interface, "regex", "Eval a regex", regex_function, "<data>|<pattern>[|<subst string>]");
/* indicate that the module should continue to be loaded */
return SWITCH_STATUS_NOUNLOAD;
Modified: freeswitch/trunk/src/mod/applications/mod_expr/mod_expr.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_expr/mod_expr.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_expr/mod_expr.c Fri Nov 9 10:26:32 2007
@@ -111,7 +111,7 @@
/* Parse expression */
err = exprParse(e, (char *)expr);
- printf("WTF %s\n", expr);
+
if(err != EXPR_ERROR_NOERROR)
goto error;
Modified: freeswitch/trunk/src/switch_utils.c
==============================================================================
--- freeswitch/trunk/src/switch_utils.c (original)
+++ freeswitch/trunk/src/switch_utils.c Fri Nov 9 10:26:32 2007
@@ -223,6 +223,26 @@
}
+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;
More information about the Freeswitch-svn
mailing list