@cryptotaxi247 / netdata-1 / commits / a9fa6571e

allow expressions to test for inf and nan values

Costa Tsaousis committed Aug 15, 2016 at 19:27 UTC a9fa6571e2c069052722c3e661515ba45edcca14
2 files changed +21 -7
profile/test-eval.c
+11 -2
@@ -259,6 +259,15 @@ void print_expression(EVAL_NODE *op, const char *failed_at, int error) {
259 }
260 */
261
262 +int health_variable_lookup(const char *variable, uint32_t hash, RRDCALC *rc, calculated_number *result) {
263 + (void)variable;
264 + (void)hash;
265 + (void)rc;
266 + (void)result;
267 +
268 + return 0;
269 +}
270 +
271 int main(int argc, char **argv) {
272 if(argc != 2) {
273 fprintf(stderr, "I need an epxression (enclose it in single-quotes (') as a single parameter)\n");
@@ -270,10 +279,10 @@ int main(int argc, char **argv) {
279
280 EVAL_EXPRESSION *exp = expression_parse(argv[1], &failed_at, &error);
281 if(!exp)
273 - printf("\nFAILED\nExpression: '%s'\nParsing stopped at: '%s'\nError code: %d (%s)\n", argv[1], (failed_at)?((*failed_at)?failed_at:"<END OF EXPRESSION>"):"<NONE>", error, expression_strerror(error));
282 + 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));
283
284 else {
276 - printf("\nOK\nExpression: '%s'\nParsed as : '%s'\nError code: %d (%s)\n", argv[1], exp->parsed_as, error, expression_strerror(error));
285 + printf("\nPARSING OK\nExpression: '%s'\nParsed as : '%s'\nParsing error code: %d (%s)\n", argv[1], exp->parsed_as, error, expression_strerror(error));
286
287 if(expression_evaluate(exp)) {
288 printf("\nEvaluates to: %Lf\n\n", exp->result);
src/eval.c
+10 -5
@@ -119,7 +119,8 @@ static inline calculated_number eval_value(EVAL_EXPRESSION *exp, EVAL_VALUE *v,
119 break;
120 }
121
122 - return eval_check_number(n, error);
122 + // return eval_check_number(n, error);
123 + return n;
124 }
125
126 calculated_number eval_and(EVAL_EXPRESSION *exp, EVAL_NODE *op, int *error) {
@@ -212,7 +213,8 @@ static inline calculated_number eval_node(EVAL_EXPRESSION *exp, EVAL_NODE *op, i
213
214 calculated_number n = operators[op->operator].eval(exp, op, error);
215
215 - return eval_check_number(n, error);
216 + // return eval_check_number(n, error);
217 + return n;
218 }
219
220 // ----------------------------------------------------------------------------
@@ -225,12 +227,12 @@ static inline void print_parsed_as_variable(BUFFER *out, EVAL_VARIABLE *v, int *
227
228 static inline void print_parsed_as_constant(BUFFER *out, calculated_number n) {
229 if(unlikely(isnan(n))) {
228 - buffer_strcat(out, "NaN");
230 + buffer_strcat(out, "nan");
231 return;
232 }
233
234 if(unlikely(isinf(n))) {
233 - buffer_strcat(out, "INFINITE");
235 + buffer_strcat(out, "inf");
236 return;
237 }
238
@@ -572,7 +574,7 @@ static inline int parse_variable(const char **string, char *buffer, size_t len)
574 static inline int parse_constant(const char **string, calculated_number *number) {
575 char *end = NULL;
576 calculated_number n = strtold(*string, &end);
575 - if(unlikely(!end || *string == end || isnan(n) || isinf(n))) {
577 + if(unlikely(!end || *string == end)) {
578 *number = 0;
579 return 0;
580 }
@@ -844,6 +846,9 @@ int expression_evaluate(EVAL_EXPRESSION *exp) {
846 buffer_reset(exp->error_msg);
847 exp->result = eval_node(exp, (EVAL_NODE *)exp->nodes, &exp->error);
848
849 + if(exp->error == EVAL_ERROR_OK)
850 + exp->result = eval_check_number(exp->result, &exp->error);
851 +
852 if(exp->error != EVAL_ERROR_OK) {
853 exp->result = NAN;
854