From: Tilghman Lesher Date: Sun, 31 Dec 2006 05:20:18 +0000 (+0000) Subject: Add power and right/left shift functions (Issue 7959) X-Git-Tag: 1.6.0-beta1~3^2~3593 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ee8b36228a882990e752a590e6843bb55daafa29;p=thirdparty%2Fasterisk.git Add power and right/left shift functions (Issue 7959) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@49076 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/funcs/func_math.c b/funcs/func_math.c index 386897dbd8..b5ad4358fb 100644 --- a/funcs/func_math.c +++ b/funcs/func_math.c @@ -31,6 +31,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include #include #include +#include #include #include "asterisk/module.h" @@ -47,6 +48,9 @@ enum TypeOfFunctions { MULTIPLYFUNCTION, SUBTRACTFUNCTION, MODULUSFUNCTION, + POWFUNCTION, + SHLEFTFUNCTION, + SHRIGHTFUNCTION, GTFUNCTION, LTFUNCTION, GTEFUNCTION, @@ -105,12 +109,18 @@ static int math(struct ast_channel *chan, char *cmd, char *parse, } else if ((op = strchr(mvalue1, '%'))) { iaction = MODULUSFUNCTION; *op = '\0'; + } else if ((op = strchr(mvalue1, '^'))) { + iaction = POWFUNCTION; + *op = '\0'; } else if ((op = strchr(mvalue1, '>'))) { iaction = GTFUNCTION; *op = '\0'; if (*(op + 1) == '=') { *++op = '\0'; iaction = GTEFUNCTION; + } else if (*(op + 1) == '>') { + *++op = '\0'; + iaction = SHRIGHTFUNCTION; } } else if ((op = strchr(mvalue1, '<'))) { iaction = LTFUNCTION; @@ -118,6 +128,9 @@ static int math(struct ast_channel *chan, char *cmd, char *parse, if (*(op + 1) == '=') { *++op = '\0'; iaction = LTEFUNCTION; + } else if (*(op + 1) == '<') { + *++op = '\0'; + iaction = SHLEFTFUNCTION; } } else if ((op = strchr(mvalue1, '='))) { *op = '\0'; @@ -192,6 +205,25 @@ static int math(struct ast_channel *chan, char *cmd, char *parse, ftmp = (inum1 % inum2); + break; + } + case POWFUNCTION: + ftmp = pow(fnum1, fnum2); + break; + case SHLEFTFUNCTION: + { + int inum1 = fnum1; + int inum2 = fnum2; + + ftmp = (inum1 << inum2); + break; + } + case SHRIGHTFUNCTION: + { + int inum1 = fnum1; + int inum2 = fnum2; + + ftmp = (inum1 >> inum2); break; } case GTFUNCTION: