From 33377538b0e3ea1c7f1f9b011b7035a601b28d62 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Wed, 12 Oct 2005 01:09:04 +0000 Subject: [PATCH] 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 --- funcs/func_strings.c | 54 ++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/funcs/func_strings.c b/funcs/func_strings.c index 303ca77d76..dced1e1a65 100755 --- a/funcs/func_strings.c +++ b/funcs/func_strings.c @@ -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(®exbuf, arg, REG_EXTENDED | REG_NOSUB))) { - regerror(errcode, ®exbuf, errstr, sizeof(errstr)); - ast_log(LOG_WARNING, "Malformed input %s(%s): %s\n", cmd, data, errstr); - ret = NULL; - } else { - ret = regexec(®exbuf, data, 0, NULL, 0) ? ret_false : ret_true; - } - regfree(®exbuf); - } 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(®exbuf, arg, REG_EXTENDED | REG_NOSUB))) { + regerror(errcode, ®exbuf, errstr, sizeof(errstr)); + ast_log(LOG_WARNING, "Malformed input %s(%s): %s\n", cmd, data, errstr); + } else { + if (!regexec(®exbuf, earg ? earg : "", 0, NULL, 0)) + ast_copy_string(buf, "1", len); + } + regfree(®exbuf); + + return buf; } #ifndef BUILTIN_FUNC