[Freeswitch-svn] [commit] r9623 - in freeswitch/trunk/src: . include

Freeswitch SVN mikej at freeswitch.org
Tue Sep 23 12:05:13 EDT 2008


Author: mikej
Date: Tue Sep 23 12:05:12 2008
New Revision: 9623

Modified:
   freeswitch/trunk/src/include/switch_regex.h
   freeswitch/trunk/src/switch_regex.c

Log:
(FSCORE-192) expose api for partial regex matching 

Modified: freeswitch/trunk/src/include/switch_regex.h
==============================================================================
--- freeswitch/trunk/src/include/switch_regex.h	(original)
+++ freeswitch/trunk/src/include/switch_regex.h	Tue Sep 23 12:05:12 2008
@@ -61,11 +61,22 @@
 */
 SWITCH_DECLARE(switch_status_t) switch_regex_match(const char *target, const char *expression);
 
+/*!
+ \brief Function to evaluate an expression against a string
+ \param target The string to find a match in
+ \param expression The regular expression to run against the string
+ \param partial If non-zero returns SUCCESS if the target is a partial match, on successful return, this is set to non-zero if the match was partial and zero if it was a full match
+ \return Boolean if a match was found or not
+*/
+SWITCH_DECLARE(switch_status_t) switch_regex_match_partial(const char *target, const char *expression, int * partial_match);
+
+
 #define switch_regex_safe_free(re)	if (re) {\
 				switch_regex_free(re);\
 				re = NULL;\
 			}
 
+
 /** @} */
 
 SWITCH_END_EXTERN_C

Modified: freeswitch/trunk/src/switch_regex.c
==============================================================================
--- freeswitch/trunk/src/switch_regex.c	(original)
+++ freeswitch/trunk/src/switch_regex.c	Tue Sep 23 12:05:12 2008
@@ -161,14 +161,15 @@
 	substituted[y++] = '\0';
 }
 
-SWITCH_DECLARE(switch_status_t) switch_regex_match(const char *target, const char *expression)
+SWITCH_DECLARE(switch_status_t) switch_regex_match_partial(const char *target, const char *expression, int * partial)
 {
 	const char *error = NULL;	/* Used to hold any errors                                           */
 	int error_offset = 0;		/* Holds the offset of an error                                      */
 	pcre *pcre_prepared = NULL;	/* Holds the compiled regex                                          */
 	int match_count = 0;		/* Number of times the regex was matched                             */
 	int offset_vectors[2];		/* not used, but has to exist or pcre won't even try to find a match */
-
+	int pcre_flags = 0;
+	
 	/* Compile the expression */
 	pcre_prepared = pcre_compile(expression, 0, &error, &error_offset, NULL);
 
@@ -186,8 +187,13 @@
 		/* We definitely didn't match anything */
 		return SWITCH_STATUS_FALSE;
 	}
+	
+	if (*partial) {
+		pcre_flags = PCRE_PARTIAL;
+	}
+	
 	/* So far so good, run the regex */
-	match_count = pcre_exec(pcre_prepared, NULL, target, (int) strlen(target), 0, 0, offset_vectors, sizeof(offset_vectors) / sizeof(offset_vectors[0]));
+	match_count = pcre_exec(pcre_prepared, NULL, target, (int) strlen(target), 0, pcre_flags, offset_vectors, sizeof(offset_vectors) / sizeof(offset_vectors[0]));
 
 	/* Clean up */
 	if (pcre_prepared) {
@@ -199,12 +205,23 @@
 
 	/* Was it a match made in heaven? */
 	if (match_count > 0) {
+		*partial = 0;
+		return SWITCH_STATUS_SUCCESS;
+	} else if (match_count == PCRE_ERROR_PARTIAL) {
+		/* yes it is already set, but the code is clearer this way */
+		*partial = 1;
 		return SWITCH_STATUS_SUCCESS;
 	} else {
 		return SWITCH_STATUS_FALSE;
 	}
 }
 
+SWITCH_DECLARE(switch_status_t) switch_regex_match(const char *target, const char *expression)
+{
+	int partial = 0;
+	return switch_regex_match_partial(target, expression, &partial);
+}
+
 /* For Emacs:
  * Local Variables:
  * mode:c



More information about the Freeswitch-svn mailing list