]> arthur.barton.de Git - netdata.git/blob - src/eval.h
infix notation parser almost done; preparing the evaluator and variables lookup
[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 #define EVAL_ERROR_MISSING_CLOSE_SUBEXPRESSION 1
38 #define EVAL_ERROR_UNKNOWN_OPERAND 2
39 #define EVAL_ERROR_MISSING_OPERAND 3
40 #define EVAL_ERROR_MISSING_OPERATOR 4
41
42 typedef struct eval_value {
43     int type;
44
45     union {
46         calculated_number number;
47         VARIABLE *variable;
48         struct eval_operand *expression;
49     };
50 } EVAL_VALUE;
51
52 typedef struct eval_operand {
53     int id;
54     char operator;
55     int precedence;
56
57     int count;
58     EVAL_VALUE ops[];
59 } EVAL_OPERAND;
60
61 extern EVAL_OPERAND *parse_expression(const char *string, const char **failed_at, int *error);
62 extern void free_expression(EVAL_OPERAND *op);
63
64 #endif //NETDATA_EVAL_H