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