diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2019-11-28 04:53:29 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2019-11-28 04:53:29 +0000 |
commit | 17c93e2be4ad7b3af0cd6878bdd5d8a4a3e6da99 (patch) | |
tree | 3e0c96613972e8bb4afdeeb97a034806363ddfa9 /tests/profile/test-eval.c | |
parent | Releasing debian version 1.18.1-1. (diff) | |
download | netdata-17c93e2be4ad7b3af0cd6878bdd5d8a4a3e6da99.tar.xz netdata-17c93e2be4ad7b3af0cd6878bdd5d8a4a3e6da99.zip |
Merging upstream version 1.19.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/profile/test-eval.c')
-rw-r--r-- | tests/profile/test-eval.c | 299 |
1 files changed, 0 insertions, 299 deletions
diff --git a/tests/profile/test-eval.c b/tests/profile/test-eval.c deleted file mode 100644 index 144381cf..00000000 --- a/tests/profile/test-eval.c +++ /dev/null @@ -1,299 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ - -/* - * 1. build netdata (as normally) - * 2. cd profile/ - * 3. compile with: - * gcc -O1 -ggdb -Wall -Wextra -I ../src/ -I ../ -o test-eval test-eval.c ../src/log.o ../src/eval.o ../src/common.o ../src/clocks.o ../src/web_buffer.o ../src/storage_number.o -pthread -lm - */ - -#include "config.h" -#include "libnetdata/libnetdata.h" -#include "database/rrdcalc.h" - -void netdata_cleanup_and_exit(int ret) { exit(ret); } - -/* -void indent(int level, int show) { - int i = level; - while(i--) printf(" | "); - if(show) printf(" \\_ "); - else printf(" \\_ "); -} - -void print_node(EVAL_NODE *op, int level); - -void print_value(EVAL_VALUE *v, int level) { - indent(level, 0); - - switch(v->type) { - case EVAL_VALUE_INVALID: - printf("value (NOP)\n"); - break; - - case EVAL_VALUE_NUMBER: - printf("value %Lf (NUMBER)\n", v->number); - break; - - case EVAL_VALUE_EXPRESSION: - printf("value (SUB-EXPRESSION)\n"); - print_node(v->expression, level+1); - break; - - default: - printf("value (INVALID type %d)\n", v->type); - break; - - } -} - -void print_node(EVAL_NODE *op, int level) { - -// if(op->operator != EVAL_OPERATOR_NOP) { - indent(level, 1); - if(op->operator) printf("%c (node %d, precedence: %d)\n", op->operator, op->id, op->precedence); - else printf("NOP (node %d, precedence: %d)\n", op->id, op->precedence); -// } - - int i = op->count; - while(i--) print_value(&op->ops[i], level + 1); -} - -calculated_number evaluate(EVAL_NODE *op, int depth); - -calculated_number evaluate_value(EVAL_VALUE *v, int depth) { - switch(v->type) { - case EVAL_VALUE_NUMBER: - return v->number; - - case EVAL_VALUE_EXPRESSION: - return evaluate(v->expression, depth); - - default: - fatal("I don't know how to handle EVAL_VALUE type %d", v->type); - } -} - -void print_depth(int depth) { - static int count = 0; - - printf("%d. ", ++count); - while(depth--) printf(" "); -} - -calculated_number evaluate(EVAL_NODE *op, int depth) { - calculated_number n1, n2, r; - - switch(op->operator) { - case EVAL_OPERATOR_SIGN_PLUS: - r = evaluate_value(&op->ops[0], depth); - break; - - case EVAL_OPERATOR_SIGN_MINUS: - r = -evaluate_value(&op->ops[0], depth); - break; - - case EVAL_OPERATOR_PLUS: - if(op->count != 2) - fatal("Operator '%c' requires 2 values, but we have %d", op->operator, op->count); - n1 = evaluate_value(&op->ops[0], depth); - n2 = evaluate_value(&op->ops[1], depth); - r = n1 + n2; - print_depth(depth); - printf("%Lf = %Lf + %Lf\n", r, n1, n2); - break; - - case EVAL_OPERATOR_MINUS: - if(op->count != 2) - fatal("Operator '%c' requires 2 values, but we have %d", op->operator, op->count); - n1 = evaluate_value(&op->ops[0], depth); - n2 = evaluate_value(&op->ops[1], depth); - r = n1 - n2; - print_depth(depth); - printf("%Lf = %Lf - %Lf\n", r, n1, n2); - break; - - case EVAL_OPERATOR_MULTIPLY: - if(op->count != 2) - fatal("Operator '%c' requires 2 values, but we have %d", op->operator, op->count); - n1 = evaluate_value(&op->ops[0], depth); - n2 = evaluate_value(&op->ops[1], depth); - r = n1 * n2; - print_depth(depth); - printf("%Lf = %Lf * %Lf\n", r, n1, n2); - break; - - case EVAL_OPERATOR_DIVIDE: - if(op->count != 2) - fatal("Operator '%c' requires 2 values, but we have %d", op->operator, op->count); - n1 = evaluate_value(&op->ops[0], depth); - n2 = evaluate_value(&op->ops[1], depth); - r = n1 / n2; - print_depth(depth); - printf("%Lf = %Lf / %Lf\n", r, n1, n2); - break; - - case EVAL_OPERATOR_NOT: - n1 = evaluate_value(&op->ops[0], depth); - r = !n1; - print_depth(depth); - printf("%Lf = NOT %Lf\n", r, n1); - break; - - case EVAL_OPERATOR_AND: - if(op->count != 2) - fatal("Operator '%c' requires 2 values, but we have %d", op->operator, op->count); - n1 = evaluate_value(&op->ops[0], depth); - n2 = evaluate_value(&op->ops[1], depth); - r = n1 && n2; - print_depth(depth); - printf("%Lf = %Lf AND %Lf\n", r, n1, n2); - break; - - case EVAL_OPERATOR_OR: - if(op->count != 2) - fatal("Operator '%c' requires 2 values, but we have %d", op->operator, op->count); - n1 = evaluate_value(&op->ops[0], depth); - n2 = evaluate_value(&op->ops[1], depth); - r = n1 || n2; - print_depth(depth); - printf("%Lf = %Lf OR %Lf\n", r, n1, n2); - break; - - case EVAL_OPERATOR_GREATER_THAN_OR_EQUAL: - if(op->count != 2) - fatal("Operator '%c' requires 2 values, but we have %d", op->operator, op->count); - n1 = evaluate_value(&op->ops[0], depth); - n2 = evaluate_value(&op->ops[1], depth); - r = n1 >= n2; - print_depth(depth); - printf("%Lf = %Lf >= %Lf\n", r, n1, n2); - break; - - case EVAL_OPERATOR_LESS_THAN_OR_EQUAL: - if(op->count != 2) - fatal("Operator '%c' requires 2 values, but we have %d", op->operator, op->count); - n1 = evaluate_value(&op->ops[0], depth); - n2 = evaluate_value(&op->ops[1], depth); - r = n1 <= n2; - print_depth(depth); - printf("%Lf = %Lf <= %Lf\n", r, n1, n2); - break; - - case EVAL_OPERATOR_GREATER: - if(op->count != 2) - fatal("Operator '%c' requires 2 values, but we have %d", op->operator, op->count); - n1 = evaluate_value(&op->ops[0], depth); - n2 = evaluate_value(&op->ops[1], depth); - r = n1 > n2; - print_depth(depth); - printf("%Lf = %Lf > %Lf\n", r, n1, n2); - break; - - case EVAL_OPERATOR_LESS: - if(op->count != 2) - fatal("Operator '%c' requires 2 values, but we have %d", op->operator, op->count); - n1 = evaluate_value(&op->ops[0], depth); - n2 = evaluate_value(&op->ops[1], depth); - r = n1 < n2; - print_depth(depth); - printf("%Lf = %Lf < %Lf\n", r, n1, n2); - break; - - case EVAL_OPERATOR_NOT_EQUAL: - if(op->count != 2) - fatal("Operator '%c' requires 2 values, but we have %d", op->operator, op->count); - n1 = evaluate_value(&op->ops[0], depth); - n2 = evaluate_value(&op->ops[1], depth); - r = n1 != n2; - print_depth(depth); - printf("%Lf = %Lf <> %Lf\n", r, n1, n2); - break; - - case EVAL_OPERATOR_EQUAL: - if(op->count != 2) - fatal("Operator '%c' requires 2 values, but we have %d", op->operator, op->count); - n1 = evaluate_value(&op->ops[0], depth); - n2 = evaluate_value(&op->ops[1], depth); - r = n1 == n2; - print_depth(depth); - printf("%Lf = %Lf == %Lf\n", r, n1, n2); - break; - - case EVAL_OPERATOR_EXPRESSION_OPEN: - printf("BEGIN SUB-EXPRESSION\n"); - r = evaluate_value(&op->ops[0], depth + 1); - printf("END SUB-EXPRESSION\n"); - break; - - case EVAL_OPERATOR_NOP: - case EVAL_OPERATOR_VALUE: - r = evaluate_value(&op->ops[0], depth); - break; - - default: - error("I don't know how to handle operator '%c'", op->operator); - r = 0; - break; - } - - return r; -} - - -void print_expression(EVAL_NODE *op, const char *failed_at, int error) { - if(op) { - printf("expression tree:\n"); - print_node(op, 0); - - printf("\nevaluation steps:\n"); - evaluate(op, 0); - - int error; - calculated_number ret = expression_evaluate(op, &error); - printf("\ninternal evaluator:\nSTATUS: %d, RESULT = %Lf\n", error, ret); - - expression_free(op); - } - else { - printf("error: %d, failed_at: '%s'\n", error, (failed_at)?failed_at:"<NONE>"); - } -} -*/ - -int health_variable_lookup(const char *variable, uint32_t hash, RRDCALC *rc, calculated_number *result) { - (void)variable; - (void)hash; - (void)rc; - (void)result; - - return 0; -} - -int main(int argc, char **argv) { - if(argc != 2) { - fprintf(stderr, "I need an epxression (enclose it in single-quotes (') as a single parameter)\n"); - exit(1); - } - - const char *failed_at = NULL; - int error; - - EVAL_EXPRESSION *exp = expression_parse(argv[1], &failed_at, &error); - if(!exp) - printf("\nPARSING FAILED\nExpression: '%s'\nParsing stopped at: '%s'\nParsing error code: %d (%s)\n", argv[1], (failed_at)?((*failed_at)?failed_at:"<END OF EXPRESSION>"):"<NONE>", error, expression_strerror(error)); - - else { - printf("\nPARSING OK\nExpression: '%s'\nParsed as : '%s'\nParsing error code: %d (%s)\n", argv[1], exp->parsed_as, error, expression_strerror(error)); - - if(expression_evaluate(exp)) { - printf("\nEvaluates to: %Lf\n\n", exp->result); - } - else { - printf("\nEvaluation failed with code %d and message: %s\n\n", exp->error, buffer_tostring(exp->error_msg)); - } - expression_free(exp); - } - - return 0; -} |