]> arthur.barton.de Git - netdata.git/blob - src/eval.h
157abc63bd32c4fe6eceee5b61502e70c5ded54c
[netdata.git] / src / eval.h
1 #ifndef NETDATA_EVAL_H
2 #define NETDATA_EVAL_H
3
4 typedef struct variable {
5     char *name;
6     struct rrdvar *rrdvar;
7     struct variable *next;
8 } VARIABLE;
9
10 #define EVAL_VALUE_INVALID 0
11 #define EVAL_VALUE_NUMBER 1
12 #define EVAL_VALUE_VARIABLE 2
13 #define EVAL_VALUE_EXPRESSION 3
14
15 // these are used for EVAL_OPERAND.operator
16 #define EVAL_OPERATOR_NOP                   '\0'
17 #define EVAL_OPERATOR_VALUE                 ':'
18 #define EVAL_OPERATOR_EXPRESSION_OPEN       '('
19 #define EVAL_OPERATOR_EXPRESSION_CLOSE      ')'
20 #define EVAL_OPERATOR_NOT                   '!'
21 #define EVAL_OPERATOR_PLUS                  '+'
22 #define EVAL_OPERATOR_MINUS                 '-'
23 #define EVAL_OPERATOR_AND                   '&'
24 #define EVAL_OPERATOR_OR                    '|'
25 #define EVAL_OPERATOR_GREATER_THAN_OR_EQUAL 'G'
26 #define EVAL_OPERATOR_LESS_THAN_OR_EQUAL    'L'
27 #define EVAL_OPERATOR_NOT_EQUAL             '~'
28 #define EVAL_OPERATOR_EQUAL                 '='
29 #define EVAL_OPERATOR_LESS                  '<'
30 #define EVAL_OPERATOR_GREATER               '>'
31 #define EVAL_OPERATOR_MULTIPLY              '*'
32 #define EVAL_OPERATOR_DIVIDE                '/'
33 #define EVAL_OPERATOR_SIGN_PLUS             'P'
34 #define EVAL_OPERATOR_SIGN_MINUS            'M'
35
36 #define EVAL_ERROR_OK 0
37
38 // parsing errors
39 #define EVAL_ERROR_MISSING_CLOSE_SUBEXPRESSION 1
40 #define EVAL_ERROR_UNKNOWN_OPERAND 2
41 #define EVAL_ERROR_MISSING_OPERAND 3
42 #define EVAL_ERROR_MISSING_OPERATOR 4
43
44 // evaluation errors
45 #define EVAL_ERROR_INVALID_VALUE 5
46 #define EVAL_ERROR_INVALID_NUMBER_OF_OPERANDS 6
47 #define EVAL_ERROR_VALUE_IS_NAN 7
48 #define EVAL_ERROR_VALUE_IS_INFINITE 8
49
50 typedef struct eval_value {
51     int type;
52
53     union {
54         calculated_number number;
55         VARIABLE *variable;
56         struct eval_operand *expression;
57     };
58 } EVAL_VALUE;
59
60 typedef struct eval_operand {
61     int id;
62     unsigned char operator;
63     int precedence;
64
65     int count;
66     EVAL_VALUE ops[];
67 } EVAL_OPERAND;
68
69 extern EVAL_OPERAND *parse_expression(const char *string, const char **failed_at, int *error);
70 extern calculated_number evaluate_expression(EVAL_OPERAND *expression, int *error);
71 extern void free_expression(EVAL_OPERAND *op);
72
73 #endif //NETDATA_EVAL_H