Mercurial > repos > rhope
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 |