[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