provide the correct string to evaluate with the given regex, instead of the

entire string provided as input to the REGEX function..  Also, use the
provided buffer to store the result.


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6744 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Russell Bryant 2005-10-12 01:09:04 +00:00
parent c5a8178bb4
commit 33377538b0
1 changed files with 29 additions and 25 deletions

View File

@ -69,39 +69,43 @@ struct ast_custom_function fieldqty_function = {
static char *builtin_function_regex(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
{
char *ret_true = "1", *ret_false = "0", *ret;
char *arg, *earg, *tmp, errstr[256] = "";
int errcode;
regex_t regexbuf;
ret = ret_false; /* convince me otherwise */
ast_copy_string(buf, "0", len);
tmp = ast_strdupa(data);
if (tmp) {
/* Regex in quotes */
arg = strchr(tmp, '"');
if (arg) {
arg++;
earg = strrchr(arg, '"');
if (earg) {
*earg = '\0';
}
} else {
arg = tmp;
}
if ((errcode = regcomp(&regexbuf, arg, REG_EXTENDED | REG_NOSUB))) {
regerror(errcode, &regexbuf, errstr, sizeof(errstr));
ast_log(LOG_WARNING, "Malformed input %s(%s): %s\n", cmd, data, errstr);
ret = NULL;
} else {
ret = regexec(&regexbuf, data, 0, NULL, 0) ? ret_false : ret_true;
}
regfree(&regexbuf);
} else {
if (!tmp) {
ast_log(LOG_ERROR, "Out of memory in %s(%s)\n", cmd, data);
return buf;
}
return ret;
/* Regex in quotes */
arg = strchr(tmp, '"');
if (arg) {
arg++;
earg = strrchr(arg, '"');
if (earg) {
*earg++ = '\0';
/* Skip over any spaces before the data we are checking */
while (*earg == ' ')
earg++;
}
} else {
arg = tmp;
}
if ((errcode = regcomp(&regexbuf, arg, REG_EXTENDED | REG_NOSUB))) {
regerror(errcode, &regexbuf, errstr, sizeof(errstr));
ast_log(LOG_WARNING, "Malformed input %s(%s): %s\n", cmd, data, errstr);
} else {
if (!regexec(&regexbuf, earg ? earg : "", 0, NULL, 0))
ast_copy_string(buf, "1", len);
}
regfree(&regexbuf);
return buf;
}
#ifndef BUILTIN_FUNC