master
h 127 lines 4.11 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #ifndef NETDATA_EVAL_INTERNAL_H
4 #define NETDATA_EVAL_INTERNAL_H
5
6 #include "eval.h"
7
8 typedef enum __attribute__((packed)) {
9 EVAL_VALUE_INVALID = 0,
10 EVAL_VALUE_NUMBER,
11 EVAL_VALUE_VARIABLE,
12 EVAL_VALUE_EXPRESSION
13 } EVAL_VALUE_TYPE;
14
15 // ----------------------------------------------------------------------------
16 // data structures for storing the parsed expression in memory
17
18 typedef struct eval_variable {
19 STRING *name;
20 struct eval_variable *next;
21 } EVAL_VARIABLE;
22
23 typedef struct eval_value {
24 EVAL_VALUE_TYPE type;
25
26 union {
27 NETDATA_DOUBLE number;
28 EVAL_VARIABLE *variable;
29 struct eval_node *expression;
30 };
31 } EVAL_VALUE;
32
33 typedef struct eval_node {
34 int id;
35 unsigned char operator;
36 int precedence;
37
38 int count;
39 EVAL_VALUE ops[];
40 } EVAL_NODE;
41
42 // Definition of operators structure
43 struct operator {
44 const char *print_as;
45 char precedence;
46 char parameters;
47 char isfunction;
48 NETDATA_DOUBLE (*eval)(struct eval_expression *exp, EVAL_NODE *op, int *error);
49 };
50
51 // External declaration of operators array (defined in eval-execute.c)
52 extern struct operator operators[256];
53
54 struct eval_expression {
55 STRING *source;
56 STRING *parsed_as;
57
58 NETDATA_DOUBLE result;
59
60 int error;
61 BUFFER *error_msg;
62
63 EVAL_NODE *nodes;
64
65 void *variable_lookup_cb_data;
66 eval_expression_variable_lookup_t variable_lookup_cb;
67 };
68
69 // these are used for EVAL_NODE.operator
70 // they are used as internal IDs to identify an operator
71 // THEY ARE NOT USED FOR PARSING OPERATORS LIKE THAT
72 #define EVAL_OPERATOR_NOP '\0'
73 #define EVAL_OPERATOR_EXPRESSION_OPEN '('
74 #define EVAL_OPERATOR_EXPRESSION_CLOSE ')'
75 #define EVAL_OPERATOR_NOT '!'
76 #define EVAL_OPERATOR_PLUS '+'
77 #define EVAL_OPERATOR_MINUS '-'
78 #define EVAL_OPERATOR_AND '&'
79 #define EVAL_OPERATOR_OR '|'
80 #define EVAL_OPERATOR_GREATER_THAN_OR_EQUAL 'G'
81 #define EVAL_OPERATOR_LESS_THAN_OR_EQUAL 'L'
82 #define EVAL_OPERATOR_NOT_EQUAL '~'
83 #define EVAL_OPERATOR_EQUAL '='
84 #define EVAL_OPERATOR_LESS '<'
85 #define EVAL_OPERATOR_GREATER '>'
86 #define EVAL_OPERATOR_MULTIPLY '*'
87 #define EVAL_OPERATOR_DIVIDE '/'
88 #define EVAL_OPERATOR_MODULO '%'
89 #define EVAL_OPERATOR_SIGN_PLUS 'P'
90 #define EVAL_OPERATOR_SIGN_MINUS 'M'
91 #define EVAL_OPERATOR_ABS 'A'
92 #define EVAL_OPERATOR_IF_THEN_ELSE '?'
93
94 // Function identifiers for parsing
95 typedef struct eval_function {
96 const char *name; // Function name (lower case)
97 unsigned char op; // Operator ID
98 int precedence; // Operator precedence
99 } EVAL_FUNCTION;
100
101 // Function declarations for shared functions
102
103 // From eval-utils.c
104 extern EVAL_NODE *eval_node_alloc(int count);
105 extern void eval_node_set_value_to_node(EVAL_NODE *op, int pos, EVAL_NODE *value);
106 extern void eval_node_set_value_to_constant(EVAL_NODE *op, int pos, NETDATA_DOUBLE value);
107 extern void eval_node_set_value_to_variable(EVAL_NODE *op, int pos, const char *variable);
108 extern void eval_variable_free(EVAL_VARIABLE *v);
109 extern void eval_value_free(EVAL_VALUE *v);
110 extern void eval_node_free(EVAL_NODE *op);
111 extern void print_parsed_as_variable(BUFFER *out, EVAL_VARIABLE *v, int *error);
112 extern void print_parsed_as_constant(BUFFER *out, NETDATA_DOUBLE n);
113 extern void print_parsed_as_value(BUFFER *out, EVAL_VALUE *v, int *error);
114 extern void print_parsed_as_node(BUFFER *out, EVAL_NODE *op, int *error);
115
116 // From eval-execute.c
117 extern NETDATA_DOUBLE eval_node(EVAL_EXPRESSION *exp, EVAL_NODE *op, int *error);
118 extern int eval_precedence(unsigned char operator);
119
120 // Functions for other parsers
121 extern EVAL_NODE *parse_expression_with_bison(const char *string, const char **failed_at, int *error);
122 extern EVAL_NODE *parse_expression_with_re2c_lemon(const char *string, const char **failed_at, int *error);
123
124 // Parser selection - comment/uncomment to switch between implementations
125 #define USE_RE2C_LEMON_PARSER
126
127 #endif //NETDATA_EVAL_INTERNAL_H