diff options
Diffstat (limited to 'funcs')
-rw-r--r-- | funcs/func_math.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/funcs/func_math.c b/funcs/func_math.c index 386897dbd..ea409130b 100644 --- a/funcs/func_math.c +++ b/funcs/func_math.c @@ -71,6 +71,7 @@ static int math(struct ast_channel *chan, char *cmd, char *parse, int iaction = -1; int type_of_result = FLOAT_RESULT; char *mvalue1, *mvalue2 = NULL, *mtype_of_result; + int negvalue1 = 0; AST_DECLARE_APP_ARGS(args, AST_APP_ARG(argv0); AST_APP_ARG(argv1); @@ -90,13 +91,12 @@ static int math(struct ast_channel *chan, char *cmd, char *parse, mvalue1 = args.argv0; - if ((op = strchr(mvalue1, '+'))) { - iaction = ADDFUNCTION; - *op = '\0'; - } else if ((op = strchr(mvalue1, '-'))) { - iaction = SUBTRACTFUNCTION; - *op = '\0'; - } else if ((op = strchr(mvalue1, '*'))) { + if (mvalue1[0] == '-') { + negvalue1 = 1; + mvalue1++; + } + + if ((op = strchr(mvalue1, '*'))) { iaction = MULTIPLYFUNCTION; *op = '\0'; } else if ((op = strchr(mvalue1, '/'))) { @@ -126,6 +126,12 @@ static int math(struct ast_channel *chan, char *cmd, char *parse, iaction = EQFUNCTION; } else op = NULL; + } else if ((op = strchr(mvalue1, '+'))) { + iaction = ADDFUNCTION; + *op = '\0'; + } else if ((op = strchr(mvalue1, '-'))) { /* subtraction MUST always be last, in case we have a negative first number */ + iaction = SUBTRACTFUNCTION; + *op = '\0'; } if (op) @@ -169,6 +175,9 @@ static int math(struct ast_channel *chan, char *cmd, char *parse, return -1; } + if (negvalue1) + fnum1 = 0 - fnum1; + switch (iaction) { case ADDFUNCTION: ftmp = fnum1 + fnum2; |