forked from akjmicro/dclang
-
Notifications
You must be signed in to change notification settings - Fork 0
/
logic_ops.c
133 lines (120 loc) · 2.45 KB
/
logic_ops.c
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* logical words */
void andfunc()
{
if (data_stack_ptr < 2)
{
printf("'and' needs two elements on the stack!\n");
return;
}
push((DCLANG_INT) dclang_pop() & (DCLANG_INT) dclang_pop());
}
void orfunc()
{
if (data_stack_ptr < 2)
{
printf("'or' needs two elements on the stack!\n");
return;
}
push((DCLANG_INT) dclang_pop() | (DCLANG_INT) dclang_pop());
}
void xorfunc()
{
if (data_stack_ptr < 2)
{
printf("'xor' needs two elements on the stack!\n");
return;
}
push((DCLANG_INT) dclang_pop() ^ (DCLANG_INT) dclang_pop());
}
void notfunc()
{
if (data_stack_ptr < 1)
{
printf("'not' needs an element on the stack!\n");
return;
}
push(~(DCLANG_INT) dclang_pop());
}
/* comparison booleans */
void eqfunc()
{
if (data_stack_ptr < 2)
{
printf("'=' needs two elements on the stack!\n");
return;
}
push(((DCLANG_FLT) dclang_pop() == (DCLANG_FLT) dclang_pop()) * -1);
}
void noteqfunc()
{
if (data_stack_ptr < 2)
{
printf("'!=' needs two elements on the stack!\n");
return;
}
push(((DCLANG_FLT) dclang_pop() != (DCLANG_FLT) dclang_pop()) * -1);
}
void gtfunc()
{
if (data_stack_ptr < 2)
{
printf("'>' needs two elements on the stack!\n");
return;
}
push(((DCLANG_FLT) dclang_pop() < (DCLANG_FLT) dclang_pop()) * -1);
}
void ltfunc()
{
if (data_stack_ptr < 2)
{
printf("'<' needs two elements on the stack!\n");
return;
}
push(((DCLANG_FLT) dclang_pop() > (DCLANG_FLT) dclang_pop()) * -1);
}
void gtefunc()
{
if (data_stack_ptr < 2)
{
printf("'>=' needs two elements on the stack!\n");
return;
}
push(((DCLANG_FLT) dclang_pop() <= (DCLANG_FLT) dclang_pop()) * -1);
}
void ltefunc()
{
if (data_stack_ptr < 2)
{
printf("'<=' needs two elements on the stack!\n");
return;
}
push(((DCLANG_FLT) dclang_pop() >= (DCLANG_FLT) dclang_pop()) * -1);
}
// assertions
void assertfunc()
{
if (data_stack_ptr < 1)
{
printf("'assert' needs an element on the stack!\n");
return;
}
DCLANG_INT truth = dclang_pop();
if (truth == 0) {
printf("ASSERT FAIL!\n");
}
}
// true/false syntactic sugar
void truefunc()
{
push(-1);
}
void falsefunc()
{
push(0);
}
// null (synonymous with 0)
void nullfunc()
{
void *ptr = NULL;
push((DCLANG_INT)ptr);
}