X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Frrd_rpncalc.c;h=839643b0075101429fe4171b9297f0d3867d11d0;hb=2ebb9e5e4cd81f7f389600a475a6f3e4f8afc87f;hp=ed086626d1d21923aae50e904ad8821ede5ee459;hpb=cf3eec070106f426cffea72f894ae3f4321956f5;p=rrdtool.git diff --git a/src/rrd_rpncalc.c b/src/rrd_rpncalc.c index ed08662..839643b 100644 --- a/src/rrd_rpncalc.c +++ b/src/rrd_rpncalc.c @@ -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'; @@ -374,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)) != @@ -543,6 +545,19 @@ 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])) { + //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]