projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Get rid of static vars in VALUE LABELS, ADD VALUE LABELS.
[pspp]
/
src
/
expr-evl.c
diff --git
a/src/expr-evl.c
b/src/expr-evl.c
index 3a6abca6eba41af508b1080a37c39bb05991c135..62a9f6b2eae6b9768c6d990111f829fb7ff40932 100644
(file)
--- a/
src/expr-evl.c
+++ b/
src/expr-evl.c
@@
-37,11
+37,11
@@
#include <math.h>
#include <errno.h>
#include <stdio.h>
#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 "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"
#include "pool.h"
#include "random.h"
#include "stats.h"
@@
-51,7
+51,8
@@
#include "vfmP.h"
double
#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;
{
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)
{
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)
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
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:
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):
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
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:
}
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
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:
}
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
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:
}
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
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:
}
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
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:
}
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
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;
}
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 (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;
{
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;
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;
{
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:
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;
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)
{
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 (sp[1].f == SYSMIS)
{
- if (
approx_ne (sp[0].f, 0.0)
)
+ if (
sp[0].f != 0.0
)
sp->f = SYSMIS;
}
else
sp->f = SYSMIS;
}
else
@@
-1278,7
+1276,7
@@
expr_evaluate (struct expression *e, struct ccase *c, union value *v)
break;
case OP_CASENUM:
sp++;
break;
case OP_CASENUM:
sp++;
- sp->f =
vfm_sink_info.ncases + 1
;
+ sp->f =
case_num
;
break;
case OP_SENTINEL:
break;
case OP_SENTINEL: