(FSCORE-192) expose api for partial regex matching

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@9623 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Michael Jerris 2008-09-23 16:05:12 +00:00
parent 221fbdb0f3
commit 870a3ef8ff
2 changed files with 31 additions and 3 deletions

View File

@ -61,11 +61,22 @@ SWITCH_DECLARE(void) switch_perform_substitution(switch_regex_t *re, int match_c
*/
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

View File

@ -161,14 +161,15 @@ SWITCH_DECLARE(void) switch_perform_substitution(switch_regex_t *re, int match_c
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 @@ SWITCH_DECLARE(switch_status_t) switch_regex_match(const char *target, const cha
/* 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 @@ SWITCH_DECLARE(switch_status_t) switch_regex_match(const char *target, const cha
/* 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