C_TP_Forth/cmpop.c
2022-12-08 06:11:40 +01:00

93 lines
1.8 KiB
C

#include "cmpop.h"
#include "num.h"
#include "pile.h"
int equali(int i, int j) {
if ( i == j ) {
return -1;
} else {
return 0;
}
}
int equalf(float i, float j) {
if ( i == j ) {
return -1;
} else {
return 0;
}
}
int lessThani(int i, int j) {
if ( i < j ) {
return -1;
} else {
return 0;
}
}
int lessThanf(float i, float j) {
if ( i < j ) {
return -1;
} else {
return 0;
}
}
int greaterThani(int i, int j) {
if ( i > j ) {
return -1;
} else {
return 0;
}
}
int greaterThanf(float i, float j) {
if ( i > j ) {
return -1;
} else {
return 0;
}
}
void cmpop( int (*opint)(int,int), int (*opfloat)(float,float), struct Pile* pile ) {
struct NumContainer res;
struct NumContainer num1;
struct NumContainer num2;
getlastnums(&num1, &num2, pile);
push(pile, num1);
/* getlastnums(&num1, &num2, pile); */
res.t = INT;
if ( num1.t == INT ) {
if ( num2.t == INT ) {
res.n.vali = opint( num1.n.vali, num2.n.vali );
} else {
res.n.valf = opfloat((float)num1.n.vali, num2.n.valf);
}
} else {
if ( num2.t == INT ) {
res.n.valf = opfloat(num1.n.valf, (float)num2.n.vali);
} else {
res.n.valf = opfloat(num1.n.valf, num2.n.valf);
}
}
push(pile, res);
}
void equal(struct State* state) {
if (state->mode == EXECUTE) {
cmpop(equali, equalf, &state->pile);
}
}
void less(struct State* state) {
if (state->mode == EXECUTE) {
cmpop(lessThani, lessThanf, &state->pile);
}
}
void greater(struct State* state) {
if (state->mode == EXECUTE) {
cmpop(greaterThani, greaterThanf, &state->pile);
}
}