* remove some experimental code from rrd_open
[rrdtool.git] / src / rrd_rpncalc.h
1 /****************************************************************************
2  * RRDtool 1.2.23  Copyright by Tobi Oetiker, 1997-2007
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, OP_TRENDNAN,
20     OP_ATAN2, OP_RAD2DEG, OP_DEG2RAD,
21     OP_AVG, OP_ABS
22 };
23
24 typedef struct rpnp_t {
25     enum op_en op;
26     double    val;      /* value for a OP_NUMBER */
27     long      ptr;      /* pointer into the gdes array for OP_VAR */
28     double   *data;     /* pointer to the current value from OP_VAR DAS */
29     long      ds_cnt;   /* data source count for data pointer */
30     long      step;     /* time step for OP_VAR das */
31 } rpnp_t;
32
33 /* a compact representation of rpnp_t for computed data sources */
34 typedef struct rpn_cdefds_t {
35     char      op;       /* rpn operator type */
36     short     val;      /* used by OP_NUMBER and OP_VARIABLE */
37 } rpn_cdefds_t;
38
39 /* limit imposed by sizeof(rpn_cdefs_t) and rrd.ds_def.par */
40 #define DS_CDEF_MAX_RPN_NODES 26
41
42 typedef struct rpnstack_t {
43     double   *s;
44     long      dc_stacksize;
45     long      dc_stackblock;
46 } rpnstack_t;
47
48 void      rpnstack_init(
49     rpnstack_t *rpnstack);
50 void      rpnstack_free(
51     rpnstack_t *rpnstack);
52
53 void      parseCDEF_DS(
54     const char *def,
55     rrd_t *rrd,
56     int ds_idx);
57 long      lookup_DS(
58     void *rrd_vptr,
59     char *ds_name);
60
61 short     rpn_compact(
62     rpnp_t *rpnp,
63     rpn_cdefds_t **rpnc,
64     short *count);
65 rpnp_t   *rpn_expand(
66     rpn_cdefds_t *rpnc);
67 void      rpn_compact2str(
68     rpn_cdefds_t *rpnc,
69     ds_def_t *ds_def,
70     char **str);
71 rpnp_t   *rpn_parse(
72     void *key_hash,
73     const char *const expr,
74     long      (*lookup) (void *,
75                          char *));
76 short     rpn_calc(
77     rpnp_t *rpnp,
78     rpnstack_t *rpnstack,
79     long data_idx,
80     rrd_value_t *output,
81     int output_idx);
82
83 #endif