Add power and right/left shift functions (Issue 7959)
authorTilghman Lesher <tilghman@meg.abyt.es>
Sun, 31 Dec 2006 05:20:18 +0000 (05:20 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Sun, 31 Dec 2006 05:20:18 +0000 (05:20 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@49076 65c4cc65-6c06-0410-ace0-fbb531ad65f3

funcs/func_math.c

index 386897d..b5ad435 100644 (file)
@@ -31,6 +31,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <math.h>
 #include <sys/types.h>
 
 #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';
@@ -194,6 +207,25 @@ static int math(struct ast_channel *chan, char *cmd, char *parse,
 
                        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:
                ast_copy_string(buf, (fnum1 > fnum2) ? "TRUE" : "FALSE", len);
                break;