Little fix after the last commit (mostly a git fail)
[eigenmath-fx.git] / test.cpp
blob36125a19800f6d687eaca53e37c4d26731848a18
1 // If the number of args is odd then the last arg is the default result.
3 #include "stdafx.h"
4 #include "defs.h"
6 void
7 eval_test(void)
9 p1 = cdr(p1);
10 while (iscons(p1)) {
11 if (cdr(p1) == symbol(NIL)) {
12 push(car(p1)); // default case
13 eval();
14 return;
16 push(car(p1));
17 eval_predicate();
18 p2 = pop();
19 if (!iszero(p2)) {
20 push(cadr(p1));
21 eval();
22 return;
24 p1 = cddr(p1);
26 push_integer(0);
29 // The test for equality is weaker than the other relational operators.
31 // For example, A<=B causes a stop when the result of A minus B is not a
32 // numerical value.
34 // However, A==B never causes a stop.
36 // For A==B, any nonzero result for A minus B indicates inequality.
38 void
39 eval_testeq(void)
41 push(cadr(p1));
42 eval();
43 push(caddr(p1));
44 eval();
45 subtract();
46 p1 = pop();
47 if (iszero(p1))
48 push_integer(1);
49 else
50 push_integer(0);
53 // Relational operators expect a numeric result for operand difference.
55 void
56 eval_testge(void)
58 if (cmp_args() >= 0)
59 push_integer(1);
60 else
61 push_integer(0);
64 void
65 eval_testgt(void)
67 if (cmp_args() > 0)
68 push_integer(1);
69 else
70 push_integer(0);
73 void
74 eval_testle(void)
76 if (cmp_args() <= 0)
77 push_integer(1);
78 else
79 push_integer(0);
82 void
83 eval_testlt(void)
85 if (cmp_args() < 0)
86 push_integer(1);
87 else
88 push_integer(0);
91 void
92 eval_not(void)
94 push(cadr(p1));
95 eval_predicate();
96 p1 = pop();
97 if (iszero(p1))
98 push_integer(1);
99 else
100 push_integer(0);
103 void
104 eval_and(void)
106 p1 = cdr(p1);
107 while (iscons(p1)) {
108 push(car(p1));
109 eval_predicate();
110 p2 = pop();
111 if (iszero(p2)) {
112 push_integer(0);
113 return;
115 p1 = cdr(p1);
117 push_integer(1);
120 void
121 eval_or(void)
123 p1 = cdr(p1);
124 while (iscons(p1)) {
125 push(car(p1));
126 eval_predicate();
127 p2 = pop();
128 if (!iszero(p2)) {
129 push_integer(1);
130 return;
132 p1 = cdr(p1);
134 push_integer(0);
137 // use subtract for cases like A < A + 1
140 cmp_args(void)
142 int t;
144 push(cadr(p1));
145 eval();
146 push(caddr(p1));
147 eval();
148 subtract();
149 p1 = pop();
151 // try floating point if necessary
153 if (p1->k != NUM && p1->k != DOUBLE) {
154 push(p1);
155 yyfloat();
156 eval();
157 p1 = pop();
160 if (iszero(p1))
161 return 0;
163 switch (p1->k) {
164 case NUM:
165 if (MSIGN(p1->u.q.a) == -1)
166 t = -1;
167 else
168 t = 1;
169 break;
170 case DOUBLE:
171 if (p1->u.d < 0.0)
172 t = -1;
173 else
174 t = 1;
175 break;
176 default:
177 stop("relational operator: cannot determine due to non-numerical comparison");
178 t = 0;
181 return t;