Get rid of static vars in VALUE LABELS, ADD VALUE LABELS.
[pspp] / src / expr-evl.c
index 3a6abca6eba41af508b1080a37c39bb05991c135..62a9f6b2eae6b9768c6d990111f829fb7ff40932 100644 (file)
 #include <math.h>
 #include <errno.h>
 #include <stdio.h>
-#include "approx.h"
 #include "data-in.h"
 #include "error.h"
 #include "julcal/julcal.h"
 #include "magic.h"
+#include "misc.h"
 #include "pool.h"
 #include "random.h"
 #include "stats.h"
@@ -51,7 +51,8 @@
 #include "vfmP.h"
 
 double
-expr_evaluate (struct expression *e, struct ccase *c, union value *v)
+expr_evaluate (struct expression *e, const struct ccase *c, int case_num,
+               union value *v)
 {
   unsigned char *op = e->op;
   double *dbl = e->num;
@@ -102,7 +103,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v)
          sp--;
          if (sp[0].f == SYSMIS)
            {
-             if (approx_eq (sp[1].f, 0.0))
+             if (sp[1].f == 0.0)
                sp->f = 1.0;
            }
          else if (sp[1].f == SYSMIS)
@@ -113,16 +114,14 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v)
              else
                sp->f = SYSMIS;
            }
-         else if (approx_eq (sp[0].f, 0.0) && approx_eq (sp[1].f, 0.0))
+         else if (sp[0].f == 0.0 && sp[1].f == 0.0)
            sp->f = SYSMIS;
          else
            sp->f = pow (sp[0].f, sp[1].f);
          break;
 
        case OP_AND:
-         /* Note that the equality operator (==) may be used here
-            (instead of approx_eq) because booleans are always
-            *exactly* 0, 1, or SYSMIS.
+         /* Note that booleans are always one of 0, 1, or SYSMIS.
 
             Truth table (in order of detection):
 
@@ -193,7 +192,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v)
              if (sp[1].f == SYSMIS)
                sp->f = SYSMIS;
              else
-               sp->f = approx_eq (sp[0].f, sp[1].f);
+               sp->f = sp[0].f == sp[1].f;
            }
          break;
        case OP_GE:
@@ -203,7 +202,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v)
              if (sp[1].f == SYSMIS)
                sp->f = SYSMIS;
              else
-               sp->f = approx_ge (sp[0].f, sp[1].f);
+               sp->f = sp[0].f >= sp[1].f;
            }
          break;
        case OP_GT:
@@ -213,7 +212,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v)
              if (sp[1].f == SYSMIS)
                sp->f = SYSMIS;
              else
-               sp->f = approx_gt (sp[0].f, sp[1].f);
+               sp->f = sp[0].f > sp[1].f;
            }
          break;
        case OP_LE:
@@ -223,7 +222,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v)
              if (sp[1].f == SYSMIS)
                sp->f = SYSMIS;
              else
-               sp->f = approx_le (sp[0].f, sp[1].f);
+               sp->f = sp[0].f <= sp[1].f;
            }
          break;
        case OP_LT:
@@ -233,7 +232,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v)
              if (sp[1].f == SYSMIS)
                sp->f = SYSMIS;
              else
-               sp->f = approx_lt (sp[0].f, sp[1].f);
+               sp->f = sp[0].f < sp[1].f;
            }
          break;
        case OP_NE:
@@ -243,7 +242,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v)
              if (sp[1].f == SYSMIS)
                sp->f = SYSMIS;
              else
-               sp->f = approx_ne (sp[0].f, sp[1].f);
+               sp->f = sp[0].f != sp[1].f;
            }
          break;
 
@@ -396,7 +395,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v)
            if (sp->f == SYSMIS)
              break;
            for (i = 1; i <= n_args; i++)
-             if (approx_eq (sp[0].f, sp[i].f))
+             if (sp[0].f == sp[i].f)
                {
                  sp->f = 1.0;
                  goto main_loop;
@@ -537,8 +536,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v)
            for (i = 1; i <= n_args; i += 2)
              if (sp[i].f == SYSMIS || sp[i + 1].f == SYSMIS)
                continue;
-             else if (approx_ge (sp[0].f, sp[i].f)
-                      && approx_le (sp[0].f, sp[i + 1].f))
+             else if (sp[0].f >= sp[i].f && sp[0].f <= sp[i + 1].f)
                {
                  sp->f = 1.0;
                  goto main_loop;
@@ -1109,9 +1107,9 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v)
            sp->f *= sp->f;
          break;
        case OP_NUM_TO_BOOL:
-         if (approx_eq (sp->f, 0.0))
+         if (sp->f == 0.0)
            sp->f = 0.0;
-         else if (approx_eq (sp->f, 1.0))
+         else if (sp->f == 1.0)
            sp->f = 1.0;
          else if (sp->f != SYSMIS)
            {
@@ -1130,7 +1128,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v)
            {
              if (sp[1].f == SYSMIS)
                {
-                 if (approx_ne (sp[0].f, 0.0))
+                 if (sp[0].f != 0.0)
                    sp->f = SYSMIS;
                }
              else
@@ -1278,7 +1276,7 @@ expr_evaluate (struct expression *e, struct ccase *c, union value *v)
          break;
        case OP_CASENUM:
          sp++;
-         sp->f = vfm_sink_info.ncases + 1;
+         sp->f = case_num;
          break;
 
        case OP_SENTINEL: