X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_rpncalc.c;h=5bb5e4056ac21c5beb203c973d29962479ba5725;hb=6c6bd6077fbc7dd9caa23e73e41b62af346e1fbf;hp=2fc6ca77ee2cdd6598a914f888e34a1849ab48f3;hpb=caa48b895c886c615896aff2ff635e8956378861;p=rrdtool.git diff --git a/src/rrd_rpncalc.c b/src/rrd_rpncalc.c index 2fc6ca7..5bb5e40 100644 --- a/src/rrd_rpncalc.c +++ b/src/rrd_rpncalc.c @@ -1,12 +1,12 @@ /**************************************************************************** - * RRDtool 1.2.23 Copyright by Tobi Oetiker, 1997-2007 + * RRDtool 1.3.2 Copyright by Tobi Oetiker, 1997-2008 **************************************************************************** * rrd_rpncalc.c RPN calculator functions ****************************************************************************/ #include "rrd_tool.h" #include "rrd_rpncalc.h" -#include "rrd_graph.h" +// #include "rrd_graph.h" #include #include @@ -178,6 +178,7 @@ void rpn_compact2str( add_op(OP_DEG2RAD, DEG2RAD) add_op(OP_AVG, AVG) add_op(OP_ABS, ABS) + add_op(OP_ADDNAN, ADDNAN) #undef add_op } (*str)[offset] = '\0'; @@ -288,8 +289,9 @@ rpnp_t *rpn_parse( long steps = -1; rpnp_t *rpnp; char vname[MAX_VNAME_LEN + 10]; - char *old_locale; - old_locale = setlocale(LC_NUMERIC,"C"); + char *old_locale; + + old_locale = setlocale(LC_NUMERIC, "C"); rpnp = NULL; expr = (char *) expr_const; @@ -297,10 +299,10 @@ rpnp_t *rpn_parse( while (*expr) { if ((rpnp = (rpnp_t *) rrd_realloc(rpnp, (++steps + 2) * sizeof(rpnp_t))) == NULL) { - setlocale(LC_NUMERIC,old_locale); + setlocale(LC_NUMERIC, old_locale); return NULL; } - + else if ((sscanf(expr, "%lf%n", &rpnp[steps].val, &pos) == 1) && (expr[pos] == ',')) { rpnp[steps].op = OP_NUMBER; @@ -373,6 +375,7 @@ rpnp_t *rpn_parse( match_op(OP_DEG2RAD, DEG2RAD) match_op(OP_AVG, AVG) match_op(OP_ABS, ABS) + match_op(OP_ADDNAN, ADDNAN) #undef match_op else if ((sscanf(expr, DEF_NAM_FMT "%n", vname, &pos) == 1) && ((rpnp[steps].ptr = (*lookup) (key_hash, vname)) != @@ -382,7 +385,7 @@ rpnp_t *rpn_parse( } else { - setlocale(LC_NUMERIC,old_locale); + setlocale(LC_NUMERIC, old_locale); free(rpnp); return NULL; } @@ -392,13 +395,13 @@ rpnp_t *rpn_parse( if (*expr == ',') expr++; else { - setlocale(LC_NUMERIC,old_locale); + setlocale(LC_NUMERIC, old_locale); free(rpnp); return NULL; } } rpnp[steps + 1].op = OP_END; - setlocale(LC_NUMERIC,old_locale); + setlocale(LC_NUMERIC, old_locale); return rpnp; } @@ -542,6 +545,20 @@ short rpn_calc( + rpnstack->s[stptr]; stptr--; break; + case OP_ADDNAN: + stackunderflow(1); + if (isnan(rpnstack->s[stptr - 1])) { + rpnstack->s[stptr - 1] = rpnstack->s[stptr]; + } else if (isnan(rpnstack->s[stptr])) { + /* NOOP */ + /* rpnstack->s[stptr - 1] = rpnstack->s[stptr - 1]; */ + } else { + rpnstack->s[stptr - 1] = rpnstack->s[stptr - 1] + + rpnstack->s[stptr]; + } + + stptr--; + break; case OP_SUB: stackunderflow(1); rpnstack->s[stptr - 1] = rpnstack->s[stptr - 1] @@ -689,8 +706,10 @@ short rpn_calc( break; case OP_IF: stackunderflow(2); - rpnstack->s[stptr - 2] = rpnstack->s[stptr - 2] != 0.0 ? - rpnstack->s[stptr - 1] : rpnstack->s[stptr]; + rpnstack->s[stptr - 2] = (isnan(rpnstack->s[stptr - 2]) + || rpnstack->s[stptr - 2] == + 0.0) ? rpnstack->s[stptr] : rpnstack-> + s[stptr - 1]; stptr--; stptr--; break;