diff --git a/src/rrd_rpncalc.c b/src/rrd_rpncalc.c
index e392a656bb95163bf7116d5a00014445f5be01d5..630a94c49c7148ce17a3738a1eee3ebb11fef851 100644 (file)
--- a/src/rrd_rpncalc.c
+++ b/src/rrd_rpncalc.c
/****************************************************************************
- * RRDtool 1.4.3 Copyright by Tobi Oetiker, 1997-2010
+ * RRDtool 1.4.8 Copyright by Tobi Oetiker, 1997-2013
****************************************************************************
* rrd_rpncalc.c RPN calculator functions
****************************************************************************/
while (rpnp[*count].op != OP_END)
(*count)++;
if (++(*count) > DS_CDEF_MAX_RPN_NODES) {
- rrd_set_error("Maximum %d RPN nodes permitted",
- DS_CDEF_MAX_RPN_NODES);
+ rrd_set_error("Maximum %d RPN nodes permitted. Got %d RPN nodes at present.",
+ DS_CDEF_MAX_RPN_NODES-1,(*count)-1);
return -1;
}
/* DS_CDEF_MAX_RPN_NODES is small, so at the expense of some wasted
* memory we avoid any reallocs */
rpnp = (rpnp_t *) calloc(DS_CDEF_MAX_RPN_NODES, sizeof(rpnp_t));
- if (rpnp == NULL)
+ if (rpnp == NULL) {
+ rrd_set_error("failed allocating rpnp array");
return NULL;
+ }
for (i = 0; rpnc[i].op != OP_END; ++i) {
- rpnp[i].op = rpnc[i].op;
+ rpnp[i].op = (enum op_en)rpnc[i].op;
if (rpnp[i].op == OP_NUMBER) {
rpnp[i].val = (double) rpnc[i].val;
} else if (rpnp[i].op == OP_VARIABLE || rpnp[i].op == OP_PREV_OTHER) {
* occur too often. */
for (i = 0; rpnp[i].op != OP_END; i++) {
if (rpnp[i].op == OP_TIME || rpnp[i].op == OP_LTIME ||
- rpnp[i].op == OP_PREV || rpnp[i].op == OP_COUNT) {
+ rpnp[i].op == OP_PREV || rpnp[i].op == OP_COUNT ||
+ rpnp[i].op == OP_TREND || rpnp[i].op == OP_TRENDNAN ||
+ rpnp[i].op == OP_PREDICT || rpnp[i].op == OP_PREDICTSIGMA ) {
rrd_set_error
- ("operators time, ltime, prev and count not supported with DS COMPUTE");
+ ("operators TIME, LTIME, PREV COUNT TREND TRENDNAN PREDICT PREDICTSIGMA are not supported with DS COMPUTE");
free(rpnp);
return;
}
char vname[MAX_VNAME_LEN + 10];
char *old_locale;
- old_locale = setlocale(LC_NUMERIC, "C");
+ old_locale = setlocale(LC_NUMERIC, NULL);
+ setlocale(LC_NUMERIC, "C");
rpnp = NULL;
expr = (char *) expr_const;
rpnp[steps].op = VV; \
rpnp[steps].ptr = (*lookup)(key_hash,vname); \
if (rpnp[steps].ptr < 0) { \
+ rrd_set_error("variable '%s' not found",vname);\
free(rpnp); \
return NULL; \
} else expr+=length; \
}
else {
+ rrd_set_error("don't undestand '%s'",expr);
setlocale(LC_NUMERIC, old_locale);
free(rpnp);
return NULL;
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)) {
+ if (output_idx + 1 >= (int) ceil((float) dur / (float) step)) {
int ignorenan = (rpnp[rpi].op == OP_TREND);
double accum = 0.0;
- int i = 0;
+ int i = -1; /* pick the current entries, not the next one
+ as the data pointer has already been forwarded
+ when the OP_VARIABLE was processed */
int count = 0;
do {