dect
/
asterisk
Archived
13
0
Fork 0

Added AND, OR, and XOR bitwise operations to MATH for issue 9891, thanks jcmoore

git-svn-id: http://svn.digium.com/svn/asterisk/trunk@72524 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
dhubbard 2007-06-28 20:52:22 +00:00
parent d2ebf530af
commit f1d65bfb7d
1 changed files with 37 additions and 1 deletions

View 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"