Added AND, OR, and XOR bitwise operations to MATH for issue 9891, thanks jcmoore
authorDwayne M. Hubbard <dwayne.hubbard@gmail.com>
Thu, 28 Jun 2007 20:52:22 +0000 (20:52 +0000)
committerDwayne M. Hubbard <dwayne.hubbard@gmail.com>
Thu, 28 Jun 2007 20:52:22 +0000 (20:52 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@72524 65c4cc65-6c06-0410-ace0-fbb531ad65f3

funcs/func_math.c

index ad42d19..70882d1 100644 (file)
@@ -53,6 +53,9 @@ enum TypeOfFunctions {
        POWFUNCTION,
        SHLEFTFUNCTION,
        SHRIGHTFUNCTION,
+       BITWISEANDFUNCTION,
+       BITWISEXORFUNCTION,
+       BITWISEORFUNCTION,
        GTFUNCTION,
        LTFUNCTION,
        GTEFUNCTION,
@@ -114,6 +117,18 @@ static int math(struct ast_channel *chan, const char *cmd, char *parse,
        } else if ((op = strchr(mvalue1, '^'))) {
                iaction = POWFUNCTION;
                *op = '\0';
+       } else if ((op = strstr(mvalue1, "AND"))) {
+               iaction = BITWISEANDFUNCTION;
+               op += 3;
+               *op = '\0';
+       } else if ((op = strstr(mvalue1, "XOR"))) {
+               iaction = BITWISEXORFUNCTION;
+               op += 3;
+               *op = '\0';
+       } else if ((op = strstr(mvalue1, "OR"))) {
+               iaction = BITWISEORFUNCTION;
+               op += 2;
+               *op = '\0';
        } else if ((op = strchr(mvalue1, '>'))) {
                iaction = GTFUNCTION;
                *op = '\0';
@@ -237,6 +252,27 @@ static int math(struct ast_channel *chan, const char *cmd, char *parse,
                        ftmp = (inum1 >> inum2);
                        break;
                }
+       case BITWISEANDFUNCTION:
+               {
+                       int inum1 = fnum1;
+                       int inum2 = fnum2;
+                       ftmp = (inum1 & inum2);
+                       break;
+               }
+       case BITWISEXORFUNCTION:
+               {
+                       int inum1 = fnum1;
+                       int inum2 = fnum2;
+                       ftmp = (inum1 ^ inum2);
+                       break;
+               }
+       case BITWISEORFUNCTION:
+               {
+                       int inum1 = fnum1;
+                       int inum2 = fnum2;
+                       ftmp = (inum1 | inum2);
+                       break;
+               }
        case GTFUNCTION:
                ast_copy_string(buf, (fnum1 > fnum2) ? "TRUE" : "FALSE", len);
                break;
@@ -278,7 +314,7 @@ static struct ast_custom_function math_function = {
        .synopsis = "Performs Mathematical Functions",
        .syntax = "MATH(<number1><op><number2>[,<type_of_result>])",
        .desc = "Perform calculation on number1 to number2. Valid ops are: \n"
-               "    +,-,/,*,%,<<,>>,^,<,>,>=,<=,==\n"
+               "    +,-,/,*,%,<<,>>,^,AND,OR,XOR,<,>,>=,<=,==\n"
                "and behave as their C equivalents.\n"
                "<type_of_result> - wanted type of result:\n"
                "       f, float - float(default)\n"