summaryrefslogtreecommitdiffstats
path: root/src/eval.h
blob: ed040f6059564d14a0650da4e06e383cb0b19ea0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#ifndef NETDATA_EVAL_H
#define NETDATA_EVAL_H

typedef struct variable {
    char *name;
    struct rrdvar *rrdvar;
    struct variable *next;
} VARIABLE;

#define EVAL_VALUE_INVALID 0
#define EVAL_VALUE_NUMBER 1
#define EVAL_VALUE_VARIABLE 2
#define EVAL_VALUE_EXPRESSION 3

// these are used for EVAL_OPERAND.operator
#define EVAL_OPERATOR_NOP                   '\0'
#define EVAL_OPERATOR_VALUE                 ':'
#define EVAL_OPERATOR_EXPRESSION_OPEN       '('
#define EVAL_OPERATOR_EXPRESSION_CLOSE      ')'
#define EVAL_OPERATOR_NOT                   '!'
#define EVAL_OPERATOR_PLUS                  '+'
#define EVAL_OPERATOR_MINUS                 '-'
#define EVAL_OPERATOR_AND                   '&'
#define EVAL_OPERATOR_OR                    '|'
#define EVAL_OPERATOR_GREATER_THAN_OR_EQUAL 'G'
#define EVAL_OPERATOR_LESS_THAN_OR_EQUAL    'L'
#define EVAL_OPERATOR_NOT_EQUAL             '~'
#define EVAL_OPERATOR_EQUAL                 '='
#define EVAL_OPERATOR_LESS                  '<'
#define EVAL_OPERATOR_GREATER               '>'
#define EVAL_OPERATOR_MULTIPLY              '*'
#define EVAL_OPERATOR_DIVIDE                '/'
#define EVAL_OPERATOR_SIGN_PLUS             'P'
#define EVAL_OPERATOR_SIGN_MINUS            'M'

#define EVAL_ERROR_OK 0
#define EVAL_ERROR_MISSING_CLOSE_SUBEXPRESSION 1
#define EVAL_ERROR_UNKNOWN_OPERAND 2
#define EVAL_ERROR_MISSING_OPERAND 3
#define EVAL_ERROR_MISSING_OPERATOR 4

typedef struct eval_value {
    int type;

    union {
        calculated_number number;
        VARIABLE *variable;
        struct eval_operand *expression;
    };
} EVAL_VALUE;

typedef struct eval_operand {
    int id;
    char operator;
    int precedence;

    int count;
    EVAL_VALUE ops[];
} EVAL_OPERAND;

extern EVAL_OPERAND *parse_expression(const char *string, const char **failed_at, int *error);
extern void free_expression(EVAL_OPERAND *op);

#endif //NETDATA_EVAL_H