comparison number.c @ 0:76568becd6d6

Rhope Alpha 2a source import
author Mike Pavone <pavone@retrodev.com>
date Tue, 28 Apr 2009 23:06:07 +0000
parents
children 94c885692eb5
comparison
equal deleted inserted replaced
-1:000000000000 0:76568becd6d6
1 #include <stdlib.h>
2 #include "datum.h"
3 #include "structs.h"
4 #ifdef SEGA
5 long atol(const char * string)
6 {
7 int i = 0;
8 BOOL neg_flag = FALSE;
9 long value = 0.0;
10 while(string[i] != '\0')
11 {
12 if(string[i] >= '0' && string[i] <= '9')
13 {
14 value *= 10;
15 value += string[i] - '0';
16 }
17 else if(string[i] == '-')
18 neg_flag = TRUE;
19 else if(string[i] != ' ' && string[i] != '\n' && string[i] != '\r' && string[i] != '\t')
20 {
21 break;
22 }
23 ++i;
24 }
25 if(neg_flag)
26 value = 0-value;
27 return value;
28 }
29 #endif
30
31 int vis_stringtoint(datum ** inputlist, queue_entry * worker_entry)
32 {
33 datum * output;
34 int result = atol(inputlist[0]->c.generic.data);
35 VIS_EnterCriticalSection(inputlist[0]->lock);
36 if(inputlist[0]->ref_count == 1)
37 {
38 VIS_LeaveCriticalSection(inputlist[0]->lock);
39 VIS_FREE(inputlist[0]->c.generic.data, "<String@Whole Number, Freeing string for reuse as integer object");
40 inputlist[0]->company = worker_entry->instance->def->program->companylist + BUILTIN_TYPE_WHOLE;
41 inputlist[0]->union_type = 2;
42 }
43 else
44 {
45 VIS_LeaveCriticalSection(inputlist[0]->lock);
46 release_ref(inputlist[0]);
47 inputlist[0] = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, worker_entry->instance->def->program);
48 }
49 inputlist[0]->c.integers.num_a = result;
50 return 0;
51 }
52
53 int vis_whole_fromhex(datum ** inputlist, queue_entry * worker_entry)
54 {
55 int i;
56 int result = 0;
57 char * data = inputlist[0]->c.generic.data;
58 for(i = 0; i < inputlist[0]->c.generic.len-1; ++i)
59 {
60 result <<= 4;
61 if(data[i] >= '0' && data[i] <= '9')
62 result |= data[i] - '0';
63 else if(data[i] >= 'A' && data[i] <= 'F')
64 result |= data[i] - 'A' + 0xA;
65 else if(data[i] >= 'a' && data[i] <= 'f')
66 result |= data[i] - 'a' + 0xA;
67 }
68 release_ref(inputlist[0]);
69 inputlist[0] = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, worker_entry->instance->def->program);
70 inputlist[0]->c.integers.num_a = result;
71 return 0;
72 }
73
74 int vis_whole_add(datum ** inputlist, queue_entry * worker_entry)
75 {
76 datum * output;
77 int ref_count;
78 //VIS_PROFILE_START(PROF_ADDWHOLE);
79 VIS_EnterCriticalSection(inputlist[0]->lock);
80 ref_count = inputlist[0]->ref_count;
81 VIS_LeaveCriticalSection(inputlist[0]->lock);
82 if(ref_count == 1)
83 output = inputlist[0];
84 else
85 {
86 VIS_EnterCriticalSection(inputlist[1]->lock);
87 ref_count = inputlist[1]->ref_count;
88 VIS_LeaveCriticalSection(inputlist[1]->lock);
89 if(ref_count == 1)
90 output = inputlist[1];
91 else
92 output = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, worker_entry->instance->def->program);
93 }
94
95 output->c.integers.num_a = inputlist[0]->c.integers.num_a + inputlist[1]->c.integers.num_a;
96 if(output == inputlist[0])
97 release_ref(inputlist[1]);
98 else if(output == inputlist[1])
99 release_ref(inputlist[0]);
100 else
101 {
102 release_ref(inputlist[0]);
103 release_ref(inputlist[1]);
104 }
105 inputlist[0] = output;
106 //VIS_PROFILE_END(PROF_ADDWHOLE);
107 return 0;
108 }
109
110 int vis_whole_subtract(datum ** inputlist, queue_entry * worker_entry)
111 {
112 datum * output;
113 output = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, worker_entry->instance->def->program);
114 output->c.integers.num_a = inputlist[0]->c.integers.num_a - inputlist[1]->c.integers.num_a;
115 release_ref(inputlist[0]);
116 release_ref(inputlist[1]);
117 inputlist[0] = output;
118 return 0;
119 }
120
121 int vis_whole_mult(datum ** inputlist, queue_entry * worker_entry)
122 {
123 inputlist[0] = copy_datum(inputlist[0], 0);
124 inputlist[0]->c.integers.num_a *= inputlist[1]->c.integers.num_a;
125 release_ref(inputlist[1]);
126 return 0;
127 }
128
129 int vis_whole_div(datum ** inputlist, queue_entry * worker_entry)
130 {
131 inputlist[0] = copy_datum(inputlist[0], 0);
132 inputlist[0]->c.integers.num_a /= inputlist[1]->c.integers.num_a;
133 release_ref(inputlist[1]);
134 return 0;
135 }
136
137 int vis_wholeequal(datum ** inputlist, queue_entry * worker_entry)
138 {
139 datum * output;
140 //VIS_PROFILE_START(PROF_EQUALWHOLE);
141 output = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program);
142 datum_set_yesno(output, inputlist[0]->c.integers.num_a == inputlist[1]->c.integers.num_a);
143 release_ref(inputlist[0]);
144 release_ref(inputlist[1]);
145 //VIS_PROFILE_END(PROF_EQUALWHOLE);
146 inputlist[0] = output;
147 return 0;
148 }
149
150 int vis_whole_or(datum ** inputlist, queue_entry * worker_entry)
151 {
152 inputlist[0] = copy_datum(inputlist[0], 0);
153 inputlist[0]->c.integers.num_a |= inputlist[1]->c.integers.num_a;
154 release_ref(inputlist[1]);
155 return 0;
156 }
157
158 int vis_whole_and(datum ** inputlist, queue_entry * worker_entry)
159 {
160 inputlist[0] = copy_datum(inputlist[0], 0);
161 inputlist[0]->c.integers.num_a &= inputlist[1]->c.integers.num_a;
162 release_ref(inputlist[1]);
163 return 0;
164 }
165
166 int vis_whole_lsh(datum ** inputlist, queue_entry * worker_entry)
167 {
168 inputlist[0] = copy_datum(inputlist[0], 0);
169 inputlist[0]->c.integers.num_a <<= inputlist[1]->c.integers.num_a;
170 release_ref(inputlist[1]);
171 return 0;
172 }
173
174 int vis_whole_rsh(datum ** inputlist, queue_entry * worker_entry)
175 {
176 inputlist[0] = copy_datum(inputlist[0], 0);
177 inputlist[0]->c.integers.num_a >>= inputlist[1]->c.integers.num_a;
178 release_ref(inputlist[1]);
179 return 0;
180 }
181
182
183 int vis_greaterint(datum ** inputlist, queue_entry * worker_entry)
184 {
185 int result;
186 if(inputlist[0]->c.integers.num_a > inputlist[1]->c.integers.num_a)
187 result = 1;
188 else
189 result = 0;
190
191 release_ref(inputlist[0]);
192 release_ref(inputlist[1]);
193 inputlist[0] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program);
194 datum_set_yesno(inputlist[0], result);
195 return 0;
196 }
197
198 int vis_lesserint(datum ** inputlist, queue_entry * worker_entry)
199 {
200 int result, ref_count;
201 //VIS_PROFILE_START(PROF_LESSERWHOLE);
202 if(inputlist[0]->c.integers.num_a < inputlist[1]->c.integers.num_a)
203 result = 1;
204 else
205 result = 0;
206 VIS_EnterCriticalSection(inputlist[0]->lock);
207 ref_count = inputlist[0]->ref_count;
208 VIS_LeaveCriticalSection(inputlist[0]->lock);
209 if(ref_count == 1)
210 {
211 release_ref(inputlist[1]);
212 inputlist[0]->company = worker_entry->instance->def->program->companylist + BUILTIN_TYPE_YESNO;
213 inputlist[0]->union_type = 2;
214 }
215 else
216 {
217 VIS_EnterCriticalSection(inputlist[1]->lock);
218 ref_count = inputlist[1]->ref_count;
219 VIS_LeaveCriticalSection(inputlist[1]->lock);
220 if(ref_count == 1)
221 {
222 release_ref(inputlist[0]);
223 inputlist[0] = inputlist[1];
224 inputlist[0]->company = worker_entry->instance->def->program->companylist + BUILTIN_TYPE_YESNO;
225 inputlist[0]->union_type = 2;
226 }
227 else
228 {
229 release_ref(inputlist[0]);
230 release_ref(inputlist[1]);
231 inputlist[0] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program);
232 }
233 }
234 //datum_set_yesno(inputlist[0], result);
235 inputlist[0]->c.integers.num_a = result;
236 //VIS_PROFILE_END(PROF_LESSERWHOLE);
237 return 0;
238 }
239 #ifndef WIN32
240 double atof(const char * string)
241 {
242 int i = 0;
243 BOOL neg_flag = FALSE;
244 double value = 0.0;
245 double divisor = 10;
246 while(string[i] != '\0' && string[i] != '.')
247 {
248 if(string[i] >= '0' && string[i] <= '9')
249 {
250 value *= 10.0;
251 value += string[i] - '0';
252 }
253 else if(string[i] == '-')
254 neg_flag = TRUE;
255 else if(string[i] != ' ' && string[i] != '\n' && string[i] != '\r' && string[i] != '\t')
256 return value;
257 ++i;
258 }
259 if(string[i] != '\0')
260 {
261 ++i;
262 while(string[i] != '\0' && string[i] >= 0 && string[i] <= 9)
263 {
264 value += ((double)(string[i] - '0'))/divisor;
265 divisor *= 10;
266 }
267 }
268 return value;
269 }
270 #endif
271
272 int vis_stringtoreal(datum ** inputlist, queue_entry * worker_entry)
273 {
274 datum * output;
275 output = new_datum(BUILTIN_TYPE_REAL, 3, 0, worker_entry->instance->def->program);
276 output->c.real = atof(inputlist[0]->c.generic.data);
277 release_ref(inputlist[0]);
278 inputlist[0] = output;
279 return 0;
280 }
281
282 int vis_real_add(datum ** inputlist, queue_entry * worker_entry)
283 {
284 datum * output;
285 output = new_datum(BUILTIN_TYPE_REAL, 3, 0, worker_entry->instance->def->program);
286 output->c.real = inputlist[0]->c.real + inputlist[1]->c.real;
287 release_ref(inputlist[0]);
288 release_ref(inputlist[1]);
289 inputlist[0] = output;
290 return 0;
291 }
292
293 int vis_real_subtract(datum ** inputlist, queue_entry * worker_entry)
294 {
295 datum * output;
296 output = new_datum(BUILTIN_TYPE_REAL, 3, 0, worker_entry->instance->def->program);
297 output->c.real = inputlist[0]->c.real - inputlist[1]->c.real;
298 release_ref(inputlist[0]);
299 release_ref(inputlist[1]);
300 inputlist[0] = output;
301 return 0;
302 }
303
304
305 int vis_realequal(datum ** inputlist, queue_entry * worker_entry)
306 {
307 datum * output = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program);
308 datum_set_yesno(output, inputlist[0]->c.real == inputlist[1]->c.real);
309 release_ref(inputlist[0]);
310 release_ref(inputlist[1]);
311 inputlist[0] = output;
312 return 0;
313 }
314
315 int vis_greaterreal(datum ** inputlist, queue_entry * worker_entry)
316 {
317 int result;
318 if(inputlist[0]->c.real > inputlist[1]->c.real)
319 result = 1;
320 else
321 result = 0;
322 release_ref(inputlist[0]);
323 release_ref(inputlist[1]);
324 inputlist[0] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program);
325 datum_set_yesno(inputlist[0], result);
326 return 0;
327 }
328
329 int vis_lesserreal(datum ** inputlist, queue_entry * worker_entry)
330 {
331 int result;
332 if(inputlist[0]->c.real < inputlist[1]->c.real)
333 result = 1;
334 else
335 result = 0;
336 release_ref(inputlist[0]);
337 release_ref(inputlist[1]);
338 inputlist[0] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program);
339 datum_set_yesno(inputlist[0], result);
340 return 0;
341 }
342
343 int vis_real_div(datum ** inputlist, queue_entry * worker_entry)
344 {
345 inputlist[0] = copy_datum(inputlist[0], 0);
346 inputlist[0]->c.real /= inputlist[1]->c.real;
347 release_ref(inputlist[1]);
348 return 0;
349 }
350