check for fadvise all the time
[rrdtool.git] / src / rrd_rpncalc.c
index 717ad42..2fc6ca7 100644 (file)
@@ -8,6 +8,7 @@
 #include "rrd_rpncalc.h"
 #include "rrd_graph.h"
 #include <limits.h>
+#include <locale.h>
 
 short     addop2str(
     enum op_en op,
@@ -287,6 +288,8 @@ rpnp_t   *rpn_parse(
     long      steps = -1;
     rpnp_t   *rpnp;
     char      vname[MAX_VNAME_LEN + 10];
+    char *old_locale;
+    old_locale = setlocale(LC_NUMERIC,"C");
 
     rpnp = NULL;
     expr = (char *) expr_const;
@@ -294,9 +297,10 @@ rpnp_t   *rpn_parse(
     while (*expr) {
         if ((rpnp = (rpnp_t *) rrd_realloc(rpnp, (++steps + 2) *
                                            sizeof(rpnp_t))) == NULL) {
+            setlocale(LC_NUMERIC,old_locale);
             return NULL;
         }
-
+    
         else if ((sscanf(expr, "%lf%n", &rpnp[steps].val, &pos) == 1)
                  && (expr[pos] == ',')) {
             rpnp[steps].op = OP_NUMBER;
@@ -306,8 +310,7 @@ rpnp_t   *rpn_parse(
         else if (strncmp(expr, #VVV, strlen(#VVV))==0 && ( expr[strlen(#VVV)] == ',' || expr[strlen(#VVV)] == '\0' )){ \
             rpnp[steps].op = VV; \
             expr+=strlen(#VVV); \
-       }
-
+       }
 
 #define match_op_param(VV,VVV) \
         else if (sscanf(expr, #VVV "(" DEF_NAM_FMT ")",vname) == 1) { \
@@ -379,19 +382,23 @@ rpnp_t   *rpn_parse(
         }
 
         else {
+            setlocale(LC_NUMERIC,old_locale);
             free(rpnp);
             return NULL;
         }
+
         if (*expr == 0)
             break;
         if (*expr == ',')
             expr++;
         else {
+            setlocale(LC_NUMERIC,old_locale);
             free(rpnp);
             return NULL;
         }
     }
     rpnp[steps + 1].op = OP_END;
+    setlocale(LC_NUMERIC,old_locale);
     return rpnp;
 }
 
@@ -759,7 +766,7 @@ short rpn_calc(
             }
             break;
         case OP_TREND:
-               case OP_TRENDNAN:
+        case OP_TRENDNAN:
             stackunderflow(1);
             if ((rpi < 2) || (rpnp[rpi - 2].op != OP_VARIABLE)) {
                 rrd_set_error("malformed trend arguments");
@@ -769,23 +776,24 @@ short rpn_calc(
                 time_t    step = (time_t) rpnp[rpi - 2].step;
 
                 if (output_idx > (int) ceil((float) dur / (float) step)) {
-                                       int     ignorenan = (rpnp[rpi].op == OP_TREND);
-                                       double  accum = 0.0;
-                                       int     i = 0;
-                                       int     count = 0;
-
-                                       do {
-                                               double val = 
-                                                       rpnp[rpi - 2].data[rpnp[rpi - 2].ds_cnt * i--];
-                                               if (ignorenan || !isnan(val)) {
-                                                       accum += val;
-                                                       ++count;
-                                               }
-                               
-                                               dur -= step;
-                                       } while (dur > 0);
-                       
-                                       rpnstack -> s[--stptr] = (count == 0) ? DNAN : (accum / count);
+                    int       ignorenan = (rpnp[rpi].op == OP_TREND);
+                    double    accum = 0.0;
+                    int       i = 0;
+                    int       count = 0;
+
+                    do {
+                        double    val =
+                            rpnp[rpi - 2].data[rpnp[rpi - 2].ds_cnt * i--];
+                        if (ignorenan || !isnan(val)) {
+                            accum += val;
+                            ++count;
+                        }
+
+                        dur -= step;
+                    } while (dur > 0);
+
+                    rpnstack->s[--stptr] =
+                        (count == 0) ? DNAN : (accum / count);
                 } else
                     rpnstack->s[--stptr] = DNAN;
             }