89 lines
2.8 KiB
C
89 lines
2.8 KiB
C
|
/****************************************************************************
|
||
|
* RRDtool 1.4.9 Copyright by Tobi Oetiker, 1997-2014
|
||
|
****************************************************************************
|
||
|
* rrd_rpncalc.h RPN calculator functions
|
||
|
****************************************************************************/
|
||
|
#ifndef _RRD_RPNCALC_H
|
||
|
#define _RRD_RPNCALC_H
|
||
|
|
||
|
/* WARNING: if new operators are added, they MUST be added at the very end of the list.
|
||
|
* This is because COMPUTE (CDEF) DS store OP nodes by number (name is not
|
||
|
* an option due to limited par array size). OP nodes must have the same
|
||
|
* numeric values, otherwise the stored numbers will mean something different. */
|
||
|
enum op_en { OP_NUMBER = 0, OP_VARIABLE, OP_INF, OP_PREV, OP_NEGINF,
|
||
|
OP_UNKN, OP_NOW, OP_TIME, OP_ADD, OP_MOD, OP_SUB, OP_MUL,
|
||
|
OP_DIV, OP_SIN, OP_DUP, OP_EXC, OP_POP,
|
||
|
OP_COS, OP_LOG, OP_EXP, OP_LT, OP_LE, OP_GT, OP_GE, OP_EQ, OP_IF,
|
||
|
OP_MIN, OP_MAX, OP_LIMIT, OP_FLOOR, OP_CEIL,
|
||
|
OP_UN, OP_END, OP_LTIME, OP_NE, OP_ISINF, OP_PREV_OTHER, OP_COUNT,
|
||
|
OP_ATAN, OP_SQRT, OP_SORT, OP_REV, OP_TREND, OP_TRENDNAN,
|
||
|
OP_ATAN2, OP_RAD2DEG, OP_DEG2RAD,
|
||
|
OP_PREDICT,OP_PREDICTSIGMA,
|
||
|
OP_AVG, OP_ABS, OP_ADDNAN,
|
||
|
OP_MINNAN, OP_MAXNAN
|
||
|
};
|
||
|
|
||
|
typedef struct rpnp_t {
|
||
|
enum op_en op;
|
||
|
double val; /* value for a OP_NUMBER */
|
||
|
long ptr; /* pointer into the gdes array for OP_VAR */
|
||
|
double *data; /* pointer to the current value from OP_VAR DAS */
|
||
|
long ds_cnt; /* data source count for data pointer */
|
||
|
long step; /* time step for OP_VAR das */
|
||
|
} rpnp_t;
|
||
|
|
||
|
/* a compact representation of rpnp_t for computed data sources */
|
||
|
typedef struct rpn_cdefds_t {
|
||
|
char op; /* rpn operator type */
|
||
|
short val; /* used by OP_NUMBER and OP_VARIABLE */
|
||
|
} rpn_cdefds_t;
|
||
|
|
||
|
#define MAX_VNAME_LEN 255
|
||
|
#define DEF_NAM_FMT "%255[-_A-Za-z0-9]"
|
||
|
|
||
|
/* limit imposed by sizeof(rpn_cdefs_t) and rrd.ds_def.par */
|
||
|
#define DS_CDEF_MAX_RPN_NODES (int)(sizeof(unival)*10 / sizeof(rpn_cdefds_t))
|
||
|
|
||
|
typedef struct rpnstack_t {
|
||
|
double *s;
|
||
|
long dc_stacksize;
|
||
|
long dc_stackblock;
|
||
|
} rpnstack_t;
|
||
|
|
||
|
void rpnstack_init(
|
||
|
rpnstack_t *rpnstack);
|
||
|
void rpnstack_free(
|
||
|
rpnstack_t *rpnstack);
|
||
|
|
||
|
int parseCDEF_DS(
|
||
|
const char *def,
|
||
|
rrd_t *rrd,
|
||
|
int ds_idx);
|
||
|
long lookup_DS(
|
||
|
void *rrd_vptr,
|
||
|
char *ds_name);
|
||
|
|
||
|
short rpn_compact(
|
||
|
rpnp_t *rpnp,
|
||
|
rpn_cdefds_t **rpnc,
|
||
|
short *count);
|
||
|
rpnp_t *rpn_expand(
|
||
|
rpn_cdefds_t *rpnc);
|
||
|
void rpn_compact2str(
|
||
|
rpn_cdefds_t *rpnc,
|
||
|
ds_def_t *ds_def,
|
||
|
char **str);
|
||
|
rpnp_t *rpn_parse(
|
||
|
void *key_hash,
|
||
|
const char *const expr,
|
||
|
long (*lookup) (void *,
|
||
|
char *));
|
||
|
short rpn_calc(
|
||
|
rpnp_t *rpnp,
|
||
|
rpnstack_t *rpnstack,
|
||
|
long data_idx,
|
||
|
rrd_value_t *output,
|
||
|
int output_idx);
|
||
|
|
||
|
#endif
|