10c8edd4b3244d9abd41d378400aebb02fb83a1b
1 /****************************************************************************
2 * RRDtool 1.3.2 Copyright by Tobi Oetiker, 1997-2008
3 ****************************************************************************
4 * rrd_rpncalc.h RPN calculator functions
5 ****************************************************************************/
6 #ifndef _RRD_RPNCALC_H
7 #define _RRD_RPNCALC_H
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_PREDICT,OP_PREDICTSIGMA,
22 OP_AVG, OP_ABS, OP_ADDNAN
23 };
25 typedef struct rpnp_t {
26 enum op_en op;
27 double val; /* value for a OP_NUMBER */
28 long ptr; /* pointer into the gdes array for OP_VAR */
29 double *data; /* pointer to the current value from OP_VAR DAS */
30 long ds_cnt; /* data source count for data pointer */
31 long step; /* time step for OP_VAR das */
32 } rpnp_t;
34 /* a compact representation of rpnp_t for computed data sources */
35 typedef struct rpn_cdefds_t {
36 char op; /* rpn operator type */
37 short val; /* used by OP_NUMBER and OP_VARIABLE */
38 } rpn_cdefds_t;
40 #define MAX_VNAME_LEN 255
41 #define DEF_NAM_FMT "%255[-_A-Za-z0-9]"
43 /* limit imposed by sizeof(rpn_cdefs_t) and rrd.ds_def.par */
44 #define DS_CDEF_MAX_RPN_NODES 26
46 typedef struct rpnstack_t {
47 double *s;
48 long dc_stacksize;
49 long dc_stackblock;
50 } rpnstack_t;
52 void rpnstack_init(
53 rpnstack_t *rpnstack);
54 void rpnstack_free(
55 rpnstack_t *rpnstack);
57 void parseCDEF_DS(
58 const char *def,
59 rrd_t *rrd,
60 int ds_idx);
61 long lookup_DS(
62 void *rrd_vptr,
63 char *ds_name);
65 short rpn_compact(
66 rpnp_t *rpnp,
67 rpn_cdefds_t **rpnc,
68 short *count);
69 rpnp_t *rpn_expand(
70 rpn_cdefds_t *rpnc);
71 void rpn_compact2str(
72 rpn_cdefds_t *rpnc,
73 ds_def_t *ds_def,
74 char **str);
75 rpnp_t *rpn_parse(
76 void *key_hash,
77 const char *const expr,
78 long (*lookup) (void *,
79 char *));
80 short rpn_calc(
81 rpnp_t *rpnp,
82 rpnstack_t *rpnstack,
83 long data_idx,
84 rrd_value_t *output,
85 int output_idx);
87 #endif