[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