projects
/
rrdtool.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
vnames can be up to MAX_VNAME_LEN long ... not only 30 chars ... -- Ulf Harnhammar...
[rrdtool.git]
/
src
/
rrd_rpncalc.c
diff --git
a/src/rrd_rpncalc.c
b/src/rrd_rpncalc.c
index
25c6b1c
..
f17c788
100644
(file)
--- a/
src/rrd_rpncalc.c
+++ b/
src/rrd_rpncalc.c
@@
-1,5
+1,5
@@
/****************************************************************************
/****************************************************************************
- * RRDtool 1.2
rc8
Copyright by Tobi Oetiker, 1997-2005
+ * RRDtool 1.2
.12
Copyright by Tobi Oetiker, 1997-2005
****************************************************************************
* rrd_rpncalc.c RPN calculator functions
****************************************************************************/
****************************************************************************
* rrd_rpncalc.c RPN calculator functions
****************************************************************************/
@@
-97,7
+97,7
@@
void rpn_compact2str(rpn_cdefds_t *rpnc,ds_def_t *ds_def,char **str)
if (rpnc[i].op == OP_NUMBER) {
/* convert a short into a string */
if (rpnc[i].op == OP_NUMBER) {
/* convert a short into a string */
-#if defined(WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__)
+#if defined(
_
WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__)
_itoa(rpnc[i].val,buffer,10);
#else
sprintf(buffer,"%d",rpnc[i].val);
_itoa(rpnc[i].val,buffer,10);
#else
sprintf(buffer,"%d",rpnc[i].val);
@@
-153,11
+153,14
@@
void rpn_compact2str(rpn_cdefds_t *rpnc,ds_def_t *ds_def,char **str)
add_op(OP_NOW,NOW)
add_op(OP_LTIME,LTIME)
add_op(OP_TIME,TIME)
add_op(OP_NOW,NOW)
add_op(OP_LTIME,LTIME)
add_op(OP_TIME,TIME)
+ add_op(OP_ATAN2,ATAN2)
add_op(OP_ATAN,ATAN)
add_op(OP_SQRT,SQRT)
add_op(OP_SORT,SORT)
add_op(OP_REV,REV)
add_op(OP_TREND,TREND)
add_op(OP_ATAN,ATAN)
add_op(OP_SQRT,SQRT)
add_op(OP_SORT,SORT)
add_op(OP_REV,REV)
add_op(OP_TREND,TREND)
+ add_op(OP_RAD2DEG,RAD2DEG)
+ add_op(OP_DEG2RAD,DEG2RAD)
#undef add_op
}
(*str)[offset] = '\0';
#undef add_op
}
(*str)[offset] = '\0';
@@
-249,13
+252,15
@@
long lookup_DS(void *rrd_vptr,char *ds_name)
* lookup(): a function that retrieves a numeric key given a variable name
*/
rpnp_t *
* lookup(): a function that retrieves a numeric key given a variable name
*/
rpnp_t *
-rpn_parse(void *key_hash,c
har *expr
,long (*lookup)(void *,char*)){
+rpn_parse(void *key_hash,c
onst char *const expr_const
,long (*lookup)(void *,char*)){
int pos=0;
int pos=0;
+ char *expr;
long steps=-1;
rpnp_t *rpnp;
long steps=-1;
rpnp_t *rpnp;
- char vname[
3
0];
+ char vname[
MAX_VNAME_LEN+1
0];
rpnp=NULL;
rpnp=NULL;
+ expr=(char *)expr_const;
while(*expr){
if ((rpnp = (rpnp_t *) rrd_realloc(rpnp, (++steps + 2)*
while(*expr){
if ((rpnp = (rpnp_t *) rrd_realloc(rpnp, (++steps + 2)*
@@
-325,11
+330,14
@@
rpn_parse(void *key_hash,char *expr,long (*lookup)(void *,char*)){
match_op(OP_ISINF,ISINF)
match_op(OP_NOW,NOW)
match_op(OP_TIME,TIME)
match_op(OP_ISINF,ISINF)
match_op(OP_NOW,NOW)
match_op(OP_TIME,TIME)
+ match_op(OP_ATAN2,ATAN2)
match_op(OP_ATAN,ATAN)
match_op(OP_SQRT,SQRT)
match_op(OP_SORT,SORT)
match_op(OP_REV,REV)
match_op(OP_TREND,TREND)
match_op(OP_ATAN,ATAN)
match_op(OP_SQRT,SQRT)
match_op(OP_SORT,SORT)
match_op(OP_REV,REV)
match_op(OP_TREND,TREND)
+ match_op(OP_RAD2DEG,RAD2DEG)
+ match_op(OP_DEG2RAD,DEG2RAD)
#undef match_op
#undef match_op
@@
-428,7
+436,8
@@
rpn_calc(rpnp_t *rpnp, rpnstack_t *rpnstack, long data_idx,
rpnstack -> s[++stptr] = rpnp[rpi].val;
break;
case OP_VARIABLE:
rpnstack -> s[++stptr] = rpnp[rpi].val;
break;
case OP_VARIABLE:
- /* Sanity check: VDEFs shouldn't make it here */
+ case OP_PREV_OTHER:
+ /* Sanity check: VDEFs shouldn't make it here */
if (rpnp[rpi].ds_cnt == 0) {
rrd_set_error("VDEF made it into rpn_calc... aborting");
return -1;
if (rpnp[rpi].ds_cnt == 0) {
rrd_set_error("VDEF made it into rpn_calc... aborting");
return -1;
@@
-439,7
+448,16
@@
rpn_calc(rpnp_t *rpnp, rpnstack_t *rpnstack, long data_idx,
* row in the rra (skip over non-relevant
* data sources)
*/
* row in the rra (skip over non-relevant
* data sources)
*/
- rpnstack -> s[++stptr] = *(rpnp[rpi].data);
+ if (rpnp[rpi].op == OP_VARIABLE) {
+ rpnstack -> s[++stptr] = *(rpnp[rpi].data);
+ } else {
+ if ((output_idx) <= 0) {
+ rpnstack -> s[++stptr] = DNAN;
+ } else {
+ rpnstack -> s[++stptr] = *(rpnp[rpi].data-rpnp[rpi].ds_cnt);
+ }
+
+ }
if (data_idx % rpnp[rpi].step == 0){
rpnp[rpi].data += rpnp[rpi].ds_cnt;
}
if (data_idx % rpnp[rpi].step == 0){
rpnp[rpi].data += rpnp[rpi].ds_cnt;
}
@@
-454,15
+472,8
@@
rpn_calc(rpnp_t *rpnp, rpnstack_t *rpnstack, long data_idx,
} else {
rpnstack -> s[++stptr] = output[output_idx-1];
}
} else {
rpnstack -> s[++stptr] = output[output_idx-1];
}
- break;
- case OP_PREV_OTHER:
- if ((output_idx) <= 0) {
- rpnstack -> s[++stptr] = DNAN;
- } else {
- rpnstack -> s[++stptr] = rpnp[rpnp[rpi].ptr].data[output_idx-1];
- }
- break;
- case OP_UNKN:
+ break;
+ case OP_UNKN:
rpnstack -> s[++stptr] = DNAN;
break;
case OP_INF:
rpnstack -> s[++stptr] = DNAN;
break;
case OP_INF:
@@
-521,6
+532,21
@@
rpn_calc(rpnp_t *rpnp, rpnstack_t *rpnstack, long data_idx,
stackunderflow(0);
rpnstack -> s[stptr] = atan(rpnstack -> s[stptr]);
break;
stackunderflow(0);
rpnstack -> s[stptr] = atan(rpnstack -> s[stptr]);
break;
+ case OP_RAD2DEG:
+ stackunderflow(0);
+ rpnstack -> s[stptr] = 57.29577951 * rpnstack -> s[stptr];
+ break;
+ case OP_DEG2RAD:
+ stackunderflow(0);
+ rpnstack -> s[stptr] = 0.0174532952 * rpnstack -> s[stptr];
+ break;
+ case OP_ATAN2:
+ stackunderflow(1);
+ rpnstack -> s[stptr-1]= atan2(
+ rpnstack -> s[stptr-1],
+ rpnstack -> s[stptr]);
+ stptr--;
+ break;
case OP_COS:
stackunderflow(0);
rpnstack -> s[stptr] = cos(rpnstack -> s[stptr]);
case OP_COS:
stackunderflow(0);
rpnstack -> s[stptr] = cos(rpnstack -> s[stptr]);