diff --git a/funcs/func_logic.c b/funcs/func_logic.c index 41a50e3599e809efc626fcaa2f473691688f420d..d4e6cdfb71db51d6887f1c6fc8ed42d060884e43 100755 --- a/funcs/func_logic.c +++ b/funcs/func_logic.c @@ -55,6 +55,12 @@ static char *builtin_function_if(struct ast_channel *chan, char *cmd, char *data } if (expr && iftrue) { + expr = ast_strip_quoted(expr, "\"", "\""); + iftrue = ast_strip_quoted(iftrue, "\"", "\""); + + if (iffalse) { + iffalse = ast_strip_quoted(iffalse, "\"", "\""); + } ret = ast_true(expr) ? iftrue : iffalse; if (ret) { ast_copy_string(buf, ret, len); diff --git a/include/asterisk/utils.h b/include/asterisk/utils.h index 5a772b12fac19cb80c9700ce5b921cab66c3ad99..443908578034a2db95216d4a5890d65e3b8c52d3 100755 --- a/include/asterisk/utils.h +++ b/include/asterisk/utils.h @@ -130,7 +130,43 @@ struct ast_hostent { char buf[1024]; }; -extern char *ast_strip(char *buf); +/*! + \brief Strip leading/trailing whitespace from a string. + \param s The string to be stripped (will be modified). + \return The stripped string. + + This functions strips all leading and trailing whitespace + characters from the input string, and returns a pointer to + the resulting string. The string is modified in place. +*/ +char *ast_strip(char *s); + +/*! + \brief Strip leading/trailing whitespace and quotes from a string. + \param s The string to be stripped (will be modified). + \param beg_quotes The list of possible beginning quote characters. + \param end_quotes The list of matching ending quote characters. + \return The stripped string. + + This functions strips all leading and trailing whitespace + characters from the input string, and returns a pointer to + the resulting string. The string is modified in place. + + It can also remove beginning and ending quote (or quote-like) + characters, in matching pairs. If the first character of the + string matches any character in beg_quotes, and the last + character of the string is the matching character in + end_quotes, then they are removed from the string. + + Examples: + \code + ast_strip_quoted(buf, "\"", "\""); + ast_strip_quoted(buf, "'", "'"); + ast_strip_quoted(buf, "[{(", "]})"); + \endcode + */ +char *ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes); + extern struct hostent *ast_gethostbyname(const char *host, struct ast_hostent *hp); /* ast_md5_hash: Produces MD5 hash based on input string */ extern void ast_md5_hash(char *output, char *input); diff --git a/utils.c b/utils.c index 594ef6e7b73f00158867078a07910a9d2ad61c27..ee60743484c85da4d7882add79e90cd98f4c79af 100755 --- a/utils.c +++ b/utils.c @@ -33,17 +33,33 @@ static char base64[64]; static char b2a[256]; -char *ast_strip(char *buf) +char *ast_strip(char *s) { - char *start; - /* Strip off trailing whitespace, returns, etc */ - while (!ast_strlen_zero(buf) && (buf[strlen(buf)-1]<33)) - buf[strlen(buf)-1] = '\0'; - start = buf; - /* Strip off leading whitespace, returns, etc */ - while (*start && (*start < 33)) - *start++ = '\0'; - return start; + char *e; + + while (*s && (*s < 33)) s++; + e = s + strlen(s) - 1; + while ((e > s) && (*e < 33)) e--; + *++e = '\0'; + + return s; +} + +char *ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes) +{ + char *e; + char *q; + + s = ast_strip(s); + if ((q = strchr(beg_quotes, *s))) { + e = s + strlen(s) - 1; + if (*e == *(end_quotes + (q - beg_quotes))) { + s++; + *e = '\0'; + } + } + + return s; } #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined( __NetBSD__ ) || defined(__APPLE__)