1 /**************************************************************************** 2 * RRDtool 1.2.30 Copyright by Tobi Oetiker, 1997-2009 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,OP_ABS}; 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(const 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 60