projects
/
rrdtool.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fontmap resolution was not matching scaled_font resolution ... this killed layouting...
[rrdtool.git]
/
src
/
rrd_rpncalc.c
diff --git
a/src/rrd_rpncalc.c
b/src/rrd_rpncalc.c
index
d1ab0de
..
ed08662
100644
(file)
--- a/
src/rrd_rpncalc.c
+++ b/
src/rrd_rpncalc.c
@@
-1,5
+1,5
@@
/****************************************************************************
/****************************************************************************
- * RRDtool 1.2.
23
Copyright by Tobi Oetiker, 1997-2007
+ * RRDtool 1.2.
99907080300
Copyright by Tobi Oetiker, 1997-2007
****************************************************************************
* rrd_rpncalc.c RPN calculator functions
****************************************************************************/
****************************************************************************
* rrd_rpncalc.c RPN calculator functions
****************************************************************************/
@@
-8,6
+8,7
@@
#include "rrd_rpncalc.h"
#include "rrd_graph.h"
#include <limits.h>
#include "rrd_rpncalc.h"
#include "rrd_graph.h"
#include <limits.h>
+#include <locale.h>
short addop2str(
enum op_en op,
short addop2str(
enum op_en op,
@@
-19,8
+20,8
@@
int tzoffset(
time_t); /* used to implement LTIME */
short rpn_compact(
time_t); /* used to implement LTIME */
short rpn_compact(
- rpnp_t *
rpnp,
- rpn_cdefds_t **
rpnc,
+ rpnp_t *rpnp,
+ rpn_cdefds_t **rpnc,
short *count)
{
short i;
short *count)
{
short i;
@@
-61,7
+62,7
@@
short rpn_compact(
}
rpnp_t *rpn_expand(
}
rpnp_t *rpn_expand(
- rpn_cdefds_t *
rpnc)
+ rpn_cdefds_t *rpnc)
{
short i;
rpnp_t *rpnp;
{
short i;
rpnp_t *rpnp;
@@
-93,8
+94,8
@@
rpnp_t *rpn_expand(
* str: out string, memory is allocated by the function, must be freed by the
* the caller */
void rpn_compact2str(
* str: out string, memory is allocated by the function, must be freed by the
* the caller */
void rpn_compact2str(
- rpn_cdefds_t *
rpnc,
- ds_def_t *
ds_def,
+ rpn_cdefds_t *rpnc,
+ ds_def_t *ds_def,
char **str)
{
unsigned short i, offset = 0;
char **str)
{
unsigned short i, offset = 0;
@@
-172,6
+173,7
@@
void rpn_compact2str(
add_op(OP_SORT, SORT)
add_op(OP_REV, REV)
add_op(OP_TREND, TREND)
add_op(OP_SORT, SORT)
add_op(OP_REV, REV)
add_op(OP_TREND, TREND)
+ add_op(OP_TRENDNAN, TRENDNAN)
add_op(OP_RAD2DEG, RAD2DEG)
add_op(OP_DEG2RAD, DEG2RAD)
add_op(OP_AVG, AVG)
add_op(OP_RAD2DEG, RAD2DEG)
add_op(OP_DEG2RAD, DEG2RAD)
add_op(OP_AVG, AVG)
@@
-278,14
+280,17
@@
long lookup_DS(
rpnp_t *rpn_parse(
void *key_hash,
const char *const expr_const,
rpnp_t *rpn_parse(
void *key_hash,
const char *const expr_const,
- long (*lookup) (void *,
- char *))
+ long
(*lookup) (void *,
+
char *))
{
int pos = 0;
char *expr;
long steps = -1;
rpnp_t *rpnp;
char vname[MAX_VNAME_LEN + 10];
{
int pos = 0;
char *expr;
long steps = -1;
rpnp_t *rpnp;
char vname[MAX_VNAME_LEN + 10];
+ char *old_locale;
+
+ old_locale = setlocale(LC_NUMERIC, "C");
rpnp = NULL;
expr = (char *) expr_const;
rpnp = NULL;
expr = (char *) expr_const;
@@
-293,6
+298,7
@@
rpnp_t *rpn_parse(
while (*expr) {
if ((rpnp = (rpnp_t *) rrd_realloc(rpnp, (++steps + 2) *
sizeof(rpnp_t))) == NULL) {
while (*expr) {
if ((rpnp = (rpnp_t *) rrd_realloc(rpnp, (++steps + 2) *
sizeof(rpnp_t))) == NULL) {
+ setlocale(LC_NUMERIC, old_locale);
return NULL;
}
return NULL;
}
@@
-305,8
+311,7
@@
rpnp_t *rpn_parse(
else if (strncmp(expr, #VVV, strlen(#VVV))==0 && ( expr[strlen(#VVV)] == ',' || expr[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); \
- }
-
+ }
#define match_op_param(VV,VVV) \
else if (sscanf(expr, #VVV "(" DEF_NAM_FMT ")",vname) == 1) { \
#define match_op_param(VV,VVV) \
else if (sscanf(expr, #VVV "(" DEF_NAM_FMT ")",vname) == 1) { \
@@
-364,6
+369,7
@@
rpnp_t *rpn_parse(
match_op(OP_SORT, SORT)
match_op(OP_REV, REV)
match_op(OP_TREND, TREND)
match_op(OP_SORT, SORT)
match_op(OP_REV, REV)
match_op(OP_TREND, TREND)
+ match_op(OP_TRENDNAN, TRENDNAN)
match_op(OP_RAD2DEG, RAD2DEG)
match_op(OP_DEG2RAD, DEG2RAD)
match_op(OP_AVG, AVG)
match_op(OP_RAD2DEG, RAD2DEG)
match_op(OP_DEG2RAD, DEG2RAD)
match_op(OP_AVG, AVG)
@@
-377,24
+383,28
@@
rpnp_t *rpn_parse(
}
else {
}
else {
+ setlocale(LC_NUMERIC, old_locale);
free(rpnp);
return NULL;
}
free(rpnp);
return NULL;
}
+
if (*expr == 0)
break;
if (*expr == ',')
expr++;
else {
if (*expr == 0)
break;
if (*expr == ',')
expr++;
else {
+ setlocale(LC_NUMERIC, old_locale);
free(rpnp);
return NULL;
}
}
rpnp[steps + 1].op = OP_END;
free(rpnp);
return NULL;
}
}
rpnp[steps + 1].op = OP_END;
+ setlocale(LC_NUMERIC, old_locale);
return rpnp;
}
void rpnstack_init(
return rpnp;
}
void rpnstack_init(
- rpnstack_t *
rpnstack)
+ rpnstack_t *rpnstack)
{
rpnstack->s = NULL;
rpnstack->dc_stacksize = 0;
{
rpnstack->s = NULL;
rpnstack->dc_stacksize = 0;
@@
-402,7
+412,7
@@
void rpnstack_init(
}
void rpnstack_free(
}
void rpnstack_free(
- rpnstack_t *
rpnstack)
+ rpnstack_t *rpnstack)
{
if (rpnstack->s != NULL)
free(rpnstack->s);
{
if (rpnstack->s != NULL)
free(rpnstack->s);
@@
-434,10
+444,10
@@
static int rpn_compare_double(
* 0 on success
*/
short rpn_calc(
* 0 on success
*/
short rpn_calc(
- rpnp_t *
rpnp,
- rpnstack_t *
rpnstack,
+ rpnp_t *rpnp,
+ rpnstack_t *rpnstack,
long data_idx,
long data_idx,
- rrd_value_t *
output,
+ rrd_value_t *output,
int output_idx)
{
int rpi;
int output_idx)
{
int rpi;
@@
-757,6
+767,7
@@
short rpn_calc(
}
break;
case OP_TREND:
}
break;
case OP_TREND:
+ case OP_TRENDNAN:
stackunderflow(1);
if ((rpi < 2) || (rpnp[rpi - 2].op != OP_VARIABLE)) {
rrd_set_error("malformed trend arguments");
stackunderflow(1);
if ((rpi < 2) || (rpnp[rpi - 2].op != OP_VARIABLE)) {
rrd_set_error("malformed trend arguments");
@@
-766,16
+777,24
@@
short rpn_calc(
time_t step = (time_t) rpnp[rpi - 2].step;
if (output_idx > (int) ceil((float) dur / (float) step)) {
time_t step = (time_t) rpnp[rpi - 2].step;
if (output_idx > (int) ceil((float) dur / (float) step)) {
+ int ignorenan = (rpnp[rpi].op == OP_TREND);
double accum = 0.0;
int i = 0;
double accum = 0.0;
int i = 0;
+ int count = 0;
do {
do {
-
accum +
=
+
double val
=
rpnp[rpi - 2].data[rpnp[rpi - 2].ds_cnt * i--];
rpnp[rpi - 2].data[rpnp[rpi - 2].ds_cnt * i--];
+ if (ignorenan || !isnan(val)) {
+ accum += val;
+ ++count;
+ }
+
dur -= step;
} while (dur > 0);
dur -= step;
} while (dur > 0);
- rpnstack->s[--stptr] = (accum / -i);
+ rpnstack->s[--stptr] =
+ (count == 0) ? DNAN : (accum / count);
} else
rpnstack->s[--stptr] = DNAN;
}
} else
rpnstack->s[--stptr] = DNAN;
}