4796695c20c6cdb90be6367511a5415ef7bf609a
1 /****************************************************************************
2 * RRDtool 1.0.33 Copyright Tobias Oetiker, 1997 - 2000
3 ****************************************************************************
4 * rrd_rpncalc.h RPN calculator functions
5 ****************************************************************************/
7 /* WARNING: if new operators are added, they MUST be added after OP_END.
8 * This is because COMPUTE (CDEF) DS store OP nodes by number (name is not
9 * an option due to limited par array size). OP nodes must have the same
10 * numeric values, otherwise the stored numbers will mean something different. */
11 enum op_en {OP_NUMBER=0,OP_VARIABLE,OP_INF,OP_PREV,OP_NEGINF,
12 OP_UNKN,OP_NOW,OP_TIME,OP_ADD,OP_MOD,OP_SUB,OP_MUL,
13 OP_DIV,OP_SIN, OP_DUP, OP_EXC, OP_POP,
14 OP_COS,OP_LOG,OP_EXP,OP_LT,OP_LE,OP_GT,OP_GE,OP_EQ,OP_IF,
15 OP_MIN,OP_MAX,OP_LIMIT, OP_FLOOR, OP_CEIL,
16 OP_UN,OP_END,OP_LTIME,OP_NE,OP_ISINF};
18 typedef struct rpnp_t {
19 enum op_en op;
20 double val; /* value for a OP_NUMBER */
21 long ptr; /* pointer into the gdes array for OP_VAR */
22 double *data; /* pointer to the current value from OP_VAR DAS*/
23 long ds_cnt; /* data source count for data pointer */
24 long step; /* time step for OP_VAR das */
25 } rpnp_t;
27 /* a compact representation of rpnp_t for computed data sources */
28 typedef struct rpn_cdefds_t {
29 char op; /* rpn operator type */
30 short val; /* used by OP_NUMBER and OP_VARIABLE */
31 } rpn_cdefds_t;
33 /* limit imposed by sizeof(rpn_cdefs_t) and rrd.ds_def.par */
34 #define DS_CDEF_MAX_RPN_NODES 26
36 typedef struct rpnstack_t {
37 double *s;
38 long dc_stacksize;
39 long dc_stackblock;
40 } rpnstack_t;
42 void rpnstack_init(rpnstack_t *rpnstack);
43 void rpnstack_free(rpnstack_t *rpnstack);
45 void parseCDEF_DS(char *def, rrd_t *rrd, int ds_idx);
46 long lookup_DS(void *rrd_vptr, char *ds_name);
48 short rpn_compact(rpnp_t *rpnp,rpn_cdefds_t **rpnc,short *count);
49 rpnp_t * rpn_expand(rpn_cdefds_t *rpnc);
50 void rpn_compact2str(rpn_cdefds_t *rpnc,ds_def_t *ds_def,char **str);
51 rpnp_t * rpn_parse(void *key_hash,char *expr, long (*lookup)(void *,char *));
52 short rpn_calc(rpnp_t *rpnp, rpnstack_t *rpnstack, long data_idx, rrd_value_t *output, int output_idx);