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