X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_rpncalc.c;h=eb7c94b2e5be67d8dd74afd2e7d060ee01bbc824;hb=5fc7ff89bdbced9c593c566fea9840a269935dcd;hp=3c6510f913d1a81418b07e6e8119b5c896b2b6b3;hpb=5b9934cea6164cb4c1bb15a4400af2f861a4a834;p=rrdtool.git diff --git a/src/rrd_rpncalc.c b/src/rrd_rpncalc.c index 3c6510f..eb7c94b 100644 --- a/src/rrd_rpncalc.c +++ b/src/rrd_rpncalc.c @@ -1,5 +1,5 @@ /**************************************************************************** - * RRDtool 1.2.13 Copyright by Tobi Oetiker, 1997-2006 + * RRDtool 1.2.23 Copyright by Tobi Oetiker, 1997-2007 **************************************************************************** * rrd_rpncalc.c RPN calculator functions ****************************************************************************/ @@ -161,6 +161,8 @@ void rpn_compact2str(rpn_cdefds_t *rpnc,ds_def_t *ds_def,char **str) add_op(OP_TREND,TREND) add_op(OP_RAD2DEG,RAD2DEG) add_op(OP_DEG2RAD,DEG2RAD) + add_op(OP_AVG,AVG) + add_op(OP_ABS,ABS) #undef add_op } (*str)[offset] = '\0'; @@ -186,7 +188,7 @@ short addop2str(enum op_en op, enum op_en op_type, char *op_str, return 0; } -void parseCDEF_DS(char *def,rrd_t *rrd, int ds_idx) +void parseCDEF_DS(const char *def,rrd_t *rrd, int ds_idx) { rpnp_t *rpnp = NULL; rpn_cdefds_t *rpnc = NULL; @@ -274,9 +276,9 @@ rpn_parse(void *key_hash,const char *const expr_const,long (*lookup)(void *,char } #define match_op(VV,VVV) \ - else if (strncmp(expr, #VVV, strlen(#VVV))==0){ \ - rpnp[steps].op = VV; \ - expr+=strlen(#VVV); \ + else if (strncmp(expr, #VVV, strlen(#VVV))==0 && ( expr[strlen(#VVV)] == ',' || expr[strlen(#VVV)] == '\0' )){ \ + rpnp[steps].op = VV; \ + expr+=strlen(#VVV); \ } @@ -338,6 +340,8 @@ rpn_parse(void *key_hash,const char *const expr_const,long (*lookup)(void *,char match_op(OP_TREND,TREND) match_op(OP_RAD2DEG,RAD2DEG) match_op(OP_DEG2RAD,DEG2RAD) + match_op(OP_AVG,AVG) + match_op(OP_ABS,ABS) #undef match_op @@ -755,6 +759,32 @@ rpn_calc(rpnp_t *rpnp, rpnstack_t *rpnstack, long data_idx, rpnstack -> s[--stptr] = DNAN; } break; + case OP_AVG: + stackunderflow(0); + { + int i=(int)rpnstack -> s[stptr--]; + double sum=0; + int count=0; + stackunderflow(i-1); + while(i>0) { + double val=rpnstack -> s[stptr--]; + i--; + if (isnan(val)) { continue; } + count++; + sum+=val; + } + /* now push the result back on stack */ + if (count>0) { + rpnstack -> s[++stptr]=sum/count; + } else { + rpnstack -> s[++stptr]=DNAN; + } + } + break; + case OP_ABS: + stackunderflow(0); + rpnstack -> s[stptr] = fabs(rpnstack -> s[stptr]); + break; case OP_END: break; }