Mercurial > repos > rhope
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/number.c Tue Apr 28 23:06:07 2009 +0000 @@ -0,0 +1,350 @@ +#include <stdlib.h> +#include "datum.h" +#include "structs.h" +#ifdef SEGA +long atol(const char * string) +{ + int i = 0; + BOOL neg_flag = FALSE; + long value = 0.0; + while(string[i] != '\0') + { + if(string[i] >= '0' && string[i] <= '9') + { + value *= 10; + value += string[i] - '0'; + } + else if(string[i] == '-') + neg_flag = TRUE; + else if(string[i] != ' ' && string[i] != '\n' && string[i] != '\r' && string[i] != '\t') + { + break; + } + ++i; + } + if(neg_flag) + value = 0-value; + return value; +} +#endif + +int vis_stringtoint(datum ** inputlist, queue_entry * worker_entry) +{ + datum * output; + int result = atol(inputlist[0]->c.generic.data); + VIS_EnterCriticalSection(inputlist[0]->lock); + if(inputlist[0]->ref_count == 1) + { + VIS_LeaveCriticalSection(inputlist[0]->lock); + VIS_FREE(inputlist[0]->c.generic.data, "<String@Whole Number, Freeing string for reuse as integer object"); + inputlist[0]->company = worker_entry->instance->def->program->companylist + BUILTIN_TYPE_WHOLE; + inputlist[0]->union_type = 2; + } + else + { + VIS_LeaveCriticalSection(inputlist[0]->lock); + release_ref(inputlist[0]); + inputlist[0] = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, worker_entry->instance->def->program); + } + inputlist[0]->c.integers.num_a = result; + return 0; +} + +int vis_whole_fromhex(datum ** inputlist, queue_entry * worker_entry) +{ + int i; + int result = 0; + char * data = inputlist[0]->c.generic.data; + for(i = 0; i < inputlist[0]->c.generic.len-1; ++i) + { + result <<= 4; + if(data[i] >= '0' && data[i] <= '9') + result |= data[i] - '0'; + else if(data[i] >= 'A' && data[i] <= 'F') + result |= data[i] - 'A' + 0xA; + else if(data[i] >= 'a' && data[i] <= 'f') + result |= data[i] - 'a' + 0xA; + } + release_ref(inputlist[0]); + inputlist[0] = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, worker_entry->instance->def->program); + inputlist[0]->c.integers.num_a = result; + return 0; +} + +int vis_whole_add(datum ** inputlist, queue_entry * worker_entry) +{ + datum * output; + int ref_count; + //VIS_PROFILE_START(PROF_ADDWHOLE); + VIS_EnterCriticalSection(inputlist[0]->lock); + ref_count = inputlist[0]->ref_count; + VIS_LeaveCriticalSection(inputlist[0]->lock); + if(ref_count == 1) + output = inputlist[0]; + else + { + VIS_EnterCriticalSection(inputlist[1]->lock); + ref_count = inputlist[1]->ref_count; + VIS_LeaveCriticalSection(inputlist[1]->lock); + if(ref_count == 1) + output = inputlist[1]; + else + output = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, worker_entry->instance->def->program); + } + + output->c.integers.num_a = inputlist[0]->c.integers.num_a + inputlist[1]->c.integers.num_a; + if(output == inputlist[0]) + release_ref(inputlist[1]); + else if(output == inputlist[1]) + release_ref(inputlist[0]); + else + { + release_ref(inputlist[0]); + release_ref(inputlist[1]); + } + inputlist[0] = output; + //VIS_PROFILE_END(PROF_ADDWHOLE); + return 0; +} + +int vis_whole_subtract(datum ** inputlist, queue_entry * worker_entry) +{ + datum * output; + output = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, worker_entry->instance->def->program); + output->c.integers.num_a = inputlist[0]->c.integers.num_a - inputlist[1]->c.integers.num_a; + release_ref(inputlist[0]); + release_ref(inputlist[1]); + inputlist[0] = output; + return 0; +} + +int vis_whole_mult(datum ** inputlist, queue_entry * worker_entry) +{ + inputlist[0] = copy_datum(inputlist[0], 0); + inputlist[0]->c.integers.num_a *= inputlist[1]->c.integers.num_a; + release_ref(inputlist[1]); + return 0; +} + +int vis_whole_div(datum ** inputlist, queue_entry * worker_entry) +{ + inputlist[0] = copy_datum(inputlist[0], 0); + inputlist[0]->c.integers.num_a /= inputlist[1]->c.integers.num_a; + release_ref(inputlist[1]); + return 0; +} + +int vis_wholeequal(datum ** inputlist, queue_entry * worker_entry) +{ + datum * output; + //VIS_PROFILE_START(PROF_EQUALWHOLE); + output = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program); + datum_set_yesno(output, inputlist[0]->c.integers.num_a == inputlist[1]->c.integers.num_a); + release_ref(inputlist[0]); + release_ref(inputlist[1]); + //VIS_PROFILE_END(PROF_EQUALWHOLE); + inputlist[0] = output; + return 0; +} + +int vis_whole_or(datum ** inputlist, queue_entry * worker_entry) +{ + inputlist[0] = copy_datum(inputlist[0], 0); + inputlist[0]->c.integers.num_a |= inputlist[1]->c.integers.num_a; + release_ref(inputlist[1]); + return 0; +} + +int vis_whole_and(datum ** inputlist, queue_entry * worker_entry) +{ + inputlist[0] = copy_datum(inputlist[0], 0); + inputlist[0]->c.integers.num_a &= inputlist[1]->c.integers.num_a; + release_ref(inputlist[1]); + return 0; +} + +int vis_whole_lsh(datum ** inputlist, queue_entry * worker_entry) +{ + inputlist[0] = copy_datum(inputlist[0], 0); + inputlist[0]->c.integers.num_a <<= inputlist[1]->c.integers.num_a; + release_ref(inputlist[1]); + return 0; +} + +int vis_whole_rsh(datum ** inputlist, queue_entry * worker_entry) +{ + inputlist[0] = copy_datum(inputlist[0], 0); + inputlist[0]->c.integers.num_a >>= inputlist[1]->c.integers.num_a; + release_ref(inputlist[1]); + return 0; +} + + +int vis_greaterint(datum ** inputlist, queue_entry * worker_entry) +{ + int result; + if(inputlist[0]->c.integers.num_a > inputlist[1]->c.integers.num_a) + result = 1; + else + result = 0; + + release_ref(inputlist[0]); + release_ref(inputlist[1]); + inputlist[0] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program); + datum_set_yesno(inputlist[0], result); + return 0; +} + +int vis_lesserint(datum ** inputlist, queue_entry * worker_entry) +{ + int result, ref_count; + //VIS_PROFILE_START(PROF_LESSERWHOLE); + if(inputlist[0]->c.integers.num_a < inputlist[1]->c.integers.num_a) + result = 1; + else + result = 0; + VIS_EnterCriticalSection(inputlist[0]->lock); + ref_count = inputlist[0]->ref_count; + VIS_LeaveCriticalSection(inputlist[0]->lock); + if(ref_count == 1) + { + release_ref(inputlist[1]); + inputlist[0]->company = worker_entry->instance->def->program->companylist + BUILTIN_TYPE_YESNO; + inputlist[0]->union_type = 2; + } + else + { + VIS_EnterCriticalSection(inputlist[1]->lock); + ref_count = inputlist[1]->ref_count; + VIS_LeaveCriticalSection(inputlist[1]->lock); + if(ref_count == 1) + { + release_ref(inputlist[0]); + inputlist[0] = inputlist[1]; + inputlist[0]->company = worker_entry->instance->def->program->companylist + BUILTIN_TYPE_YESNO; + inputlist[0]->union_type = 2; + } + else + { + release_ref(inputlist[0]); + release_ref(inputlist[1]); + inputlist[0] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program); + } + } + //datum_set_yesno(inputlist[0], result); + inputlist[0]->c.integers.num_a = result; + //VIS_PROFILE_END(PROF_LESSERWHOLE); + return 0; +} +#ifndef WIN32 +double atof(const char * string) +{ + int i = 0; + BOOL neg_flag = FALSE; + double value = 0.0; + double divisor = 10; + while(string[i] != '\0' && string[i] != '.') + { + if(string[i] >= '0' && string[i] <= '9') + { + value *= 10.0; + value += string[i] - '0'; + } + else if(string[i] == '-') + neg_flag = TRUE; + else if(string[i] != ' ' && string[i] != '\n' && string[i] != '\r' && string[i] != '\t') + return value; + ++i; + } + if(string[i] != '\0') + { + ++i; + while(string[i] != '\0' && string[i] >= 0 && string[i] <= 9) + { + value += ((double)(string[i] - '0'))/divisor; + divisor *= 10; + } + } + return value; +} +#endif + +int vis_stringtoreal(datum ** inputlist, queue_entry * worker_entry) +{ + datum * output; + output = new_datum(BUILTIN_TYPE_REAL, 3, 0, worker_entry->instance->def->program); + output->c.real = atof(inputlist[0]->c.generic.data); + release_ref(inputlist[0]); + inputlist[0] = output; + return 0; +} + +int vis_real_add(datum ** inputlist, queue_entry * worker_entry) +{ + datum * output; + output = new_datum(BUILTIN_TYPE_REAL, 3, 0, worker_entry->instance->def->program); + output->c.real = inputlist[0]->c.real + inputlist[1]->c.real; + release_ref(inputlist[0]); + release_ref(inputlist[1]); + inputlist[0] = output; + return 0; +} + +int vis_real_subtract(datum ** inputlist, queue_entry * worker_entry) +{ + datum * output; + output = new_datum(BUILTIN_TYPE_REAL, 3, 0, worker_entry->instance->def->program); + output->c.real = inputlist[0]->c.real - inputlist[1]->c.real; + release_ref(inputlist[0]); + release_ref(inputlist[1]); + inputlist[0] = output; + return 0; +} + + +int vis_realequal(datum ** inputlist, queue_entry * worker_entry) +{ + datum * output = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program); + datum_set_yesno(output, inputlist[0]->c.real == inputlist[1]->c.real); + release_ref(inputlist[0]); + release_ref(inputlist[1]); + inputlist[0] = output; + return 0; +} + +int vis_greaterreal(datum ** inputlist, queue_entry * worker_entry) +{ + int result; + if(inputlist[0]->c.real > inputlist[1]->c.real) + result = 1; + else + result = 0; + release_ref(inputlist[0]); + release_ref(inputlist[1]); + inputlist[0] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program); + datum_set_yesno(inputlist[0], result); + return 0; +} + +int vis_lesserreal(datum ** inputlist, queue_entry * worker_entry) +{ + int result; + if(inputlist[0]->c.real < inputlist[1]->c.real) + result = 1; + else + result = 0; + release_ref(inputlist[0]); + release_ref(inputlist[1]); + inputlist[0] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program); + datum_set_yesno(inputlist[0], result); + return 0; +} + +int vis_real_div(datum ** inputlist, queue_entry * worker_entry) +{ + inputlist[0] = copy_datum(inputlist[0], 0); + inputlist[0]->c.real /= inputlist[1]->c.real; + release_ref(inputlist[1]); + return 0; +} +