aboutsummaryrefslogtreecommitdiffstats
path: root/ops.c
blob: 5267b6ff150f59b458a5ec68e63dbd4fd3a3fc8f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "ops.h"

#include <string.h>

void iop_add(variable *, variable *, variable *);
void iop_sub(variable *, variable *, variable *);
void iop_mult(variable *, variable *, variable *);
void iop_div(variable *, variable *, variable *);
void iop_and(variable *, variable *, variable *);
void iop_or(variable *, variable *, variable *);
void iop_xor(variable *, variable *, variable *);
void iop_shr(variable *, variable *, variable *);
void iop_shl(variable *, variable *, variable *);
void iop_eq(variable *, variable *, variable *);
void iop_lt(variable *, variable *, variable *);
void iop_gt(variable *, variable *, variable *);
void iop_lte(variable *, variable *, variable *);
void iop_gte(variable *, variable *, variable *);
void iop_ne(variable *, variable *, variable *);
void iop_mod(variable *, variable *, variable *);

char *iops[IOPS_COUNT] = {
	"*", "/", "%", "+", "-", "<<", ">>", "<=",
	"<", ">=", ">", "==", "!=", "&", "^", "|"
};

operation_t iopfuncs[IOPS_COUNT] = {
	iop_mult, iop_div, iop_mod, iop_add, iop_sub,
	iop_shl, iop_shr, iop_lte, iop_lt, iop_gte,
	iop_gt, iop_eq, iop_ne, iop_and, iop_xor,
	iop_or
};


void iop_add(variable *r, variable *a, variable *b)
{
	r->value.f = a->value.f + b->value.f;
}

void iop_sub(variable *r, variable *a, variable *b)
{
	r->value.f = a->value.f - b->value.f;
}

void iop_mult(variable *r, variable *a, variable *b)
{
	r->value.f = a->value.f * b->value.f;
}

void iop_div(variable *r, variable *a, variable *b)
{
	r->value.f = a->value.f / b->value.f;
}

void iop_and(variable *r, variable *a, variable *b)
{
	r->value.f = (float)((int)a->value.f & (int)b->value.f);
}

void iop_or(variable *r, variable *a, variable *b)
{
	r->value.f = (float)((int)a->value.f | (int)b->value.f);
}

void iop_xor(variable *r, variable *a, variable *b)
{
	r->value.f = (float)((int)a->value.f ^ (int)b->value.f);
}

void iop_shr(variable *r, variable *a, variable *b)
{
	r->value.f = (float)((int)a->value.f >> (int)b->value.f);
}

void iop_shl(variable *r, variable *a, variable *b)
{
	r->value.f = (float)((int)a->value.f << (int)b->value.f);
}

void iop_eq(variable *r, variable *a, variable *b)
{
	if (a->valtype == STRING && b->valtype == STRING)
		r->value.f = (float)!strcmp((char *)a->value.p, (char *)b->value.p);
	else
		r->value.f = a->value.f == b->value.f;
}

void iop_lt(variable *r, variable *a, variable *b)
{
	r->value.f = a->value.f < b->value.f;
}

void iop_gt(variable *r, variable *a, variable *b)
{
	r->value.f = a->value.f > b->value.f;
}

void iop_lte(variable *r, variable *a, variable *b)
{
	r->value.f = a->value.f <= b->value.f;
}

void iop_gte(variable *r, variable *a, variable *b)
{
	r->value.f = a->value.f >= b->value.f;
}

void iop_ne(variable *r, variable *a, variable *b)
{
	r->value.f = a->value.f != b->value.f;
}

void iop_mod(variable *r, variable *a, variable *b)
{
	r->value.f = (float)((int)a->value.f % (int)b->value.f);
}