]> arthur.barton.de Git - netdata.git/blobdiff - profile/test-eval.c
Merge pull request #2020 from ktsaou/master
[netdata.git] / profile / test-eval.c
index f471234a3565ce8bec47c7ef246d2e228a4542bc..ad521b7d84292ea12884dd3f442ed0d9da15d0fd 100644 (file)
@@ -3,7 +3,7 @@
  * 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 -pthread
+ *    gcc -O1 -ggdb -Wall -Wextra -I ../src/ -I ../ -o test-eval test-eval.c ../src/log.o ../src/eval.o ../src/common.o ../src/web_buffer.o ../src/storage_number.o -pthread -lm
  *
  */
 
@@ -11,6 +11,7 @@
 
 void netdata_cleanup_and_exit(int ret) { exit(ret); }
 
+/*
 void indent(int level, int show) {
        int i = level;
        while(i--) printf(" |  ");
@@ -18,45 +19,45 @@ void indent(int level, int show) {
        else printf(" \\_  ");
 }
 
-void print_operand(EVAL_OPERAND *op, int level);
+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");
+                       printf("value (NOP)\n");
                        break;
 
                case EVAL_VALUE_NUMBER:
-                       printf("VALUE %Lf (NUMBER)\n", v->number);
+                       printf("value %Lf (NUMBER)\n", v->number);
                        break;
 
                case EVAL_VALUE_EXPRESSION:
-                       printf("VALUE (SUB-EXPRESSION)\n");
-                       print_operand(v->expression, level+1);
+                       printf("value (SUB-EXPRESSION)\n");
+                       print_node(v->expression, level+1);
                        break;
 
                default:
-                       printf("VALUE (INVALID type %d)\n", v->type);
+                       printf("value (INVALID type %d)\n", v->type);
                        break;
 
        }
 }
 
-void print_operand(EVAL_OPERAND *op, int level) {
+void print_node(EVAL_NODE *op, int level) {
 
 //     if(op->operator != EVAL_OPERATOR_NOP) {
                indent(level, 1);
-               if(op->operator) printf("%c (OPERATOR %d, prec: %d)\n", op->operator, op->id, op->precedence);
-               else printf("NOP (OPERATOR %d, prec: %d)\n", op->id, op->precedence);
+               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_OPERAND *op, int depth);
+calculated_number evaluate(EVAL_NODE *op, int depth);
 
 calculated_number evaluate_value(EVAL_VALUE *v, int depth) {
        switch(v->type) {
@@ -78,7 +79,7 @@ void print_depth(int depth) {
        while(depth--) printf("    ");
 }
 
-calculated_number evaluate(EVAL_OPERAND *op, int depth) {
+calculated_number evaluate(EVAL_NODE *op, int depth) {
        calculated_number n1, n2, r;
 
        switch(op->operator) {
@@ -237,35 +238,60 @@ calculated_number evaluate(EVAL_OPERAND *op, int depth) {
        return r;
 }
 
-void print_expression(EVAL_OPERAND *op, const char *failed_at, int error) {
+
+void print_expression(EVAL_NODE *op, const char *failed_at, int error) {
        if(op) {
                printf("expression tree:\n");
-               print_operand(op, 0);
+               print_node(op, 0);
 
                printf("\nevaluation steps:\n");
                evaluate(op, 0);
                
                int error;
-               calculated_number ret = evaluate_expression(op, &error);
+               calculated_number ret = expression_evaluate(op, &error);
                printf("\ninternal evaluator:\nSTATUS: %d, RESULT = %Lf\n", error, ret);
 
-               free_expression(op);
+               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\n");
+               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_OPERAND *op = parse_expression(argv[1], &failed_at, &error);
-       print_expression(op, failed_at, 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;
 }