diff --git a/src/rrd_rpncalc.c b/src/rrd_rpncalc.c
index 75c24cfa49799873f7f08dc5198ef061d488e95e..8639d398d805f937682ff571ccc99f7b03625114 100644 (file)
--- a/src/rrd_rpncalc.c
+++ b/src/rrd_rpncalc.c
/****************************************************************************
- * RRDtool 1.0.28 Copyright Tobias Oetiker, 1997 - 2002
+ * RRDtool 1.2.1 Copyright by Tobi Oetiker, 1997-2005
****************************************************************************
* rrd_rpncalc.c RPN calculator functions
****************************************************************************/
if (rpnc[i].op == OP_NUMBER) {
/* convert a short into a string */
-#ifdef WIN32
+#if defined(WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__)
_itoa(rpnc[i].val,buffer,10);
#else
sprintf(buffer,"%d",rpnc[i].val);
add_op(OP_SQRT,SQRT)
add_op(OP_SORT,SORT)
add_op(OP_REV,REV)
-
+ add_op(OP_TREND,TREND)
#undef add_op
}
(*str)[offset] = '\0';
match_op(OP_NEGINF,NEGINF)
match_op(OP_NE,NE)
match_op(OP_COUNT,COUNT)
- match_op_param(OP_PREV_OTHER,PREV)
+ match_op_param(OP_PREV_OTHER,PREV)
match_op(OP_PREV,PREV)
match_op(OP_INF,INF)
match_op(OP_ISINF,ISINF)
match_op(OP_SQRT,SQRT)
match_op(OP_SORT,SORT)
match_op(OP_REV,REV)
+ match_op(OP_TREND,TREND)
#undef match_op
}
}
break;
+ case OP_TREND:
+ stackunderflow(1);
+ if ((rpi < 2) || (rpnp[rpi-2].op != OP_VARIABLE)) {
+ rrd_set_error("malformed trend arguments");
+ return -1;
+ } else {
+ time_t dur = (time_t)rpnstack -> s[stptr];
+ time_t step = (time_t)rpnp[rpi-2].step;
+
+ if (output_idx > (int)ceil((float)dur / (float)step)) {
+ double accum = 0.0;
+ int i = 0;
+
+ do {
+ accum += rpnp[rpi-2].data[rpnp[rpi-2].ds_cnt * i--];
+ dur -= step;
+ } while (dur > 0);
+
+ rpnstack -> s[--stptr] = (accum / -i);
+ } else
+ rpnstack -> s[--stptr] = DNAN;
+ }
+ break;
case OP_END:
break;
}