Mercurial > repos > rhope
view number.c @ 75:0083b2f7b3c7
Partially working implementation of List. Modified build scripts to allow use of other compilers. Fixed some bugs involving method implementations on different types returning different numbers of outputs. Added Fold to the 'builtins' in the comipler.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 06 Jul 2010 07:52:59 -0400 |
parents | 429b5f441381 |
children |
line wrap: on
line source
#include <math.h> #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_whole_modulus(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; ++i; } } if(neg_flag) value = 0.0-value; 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; } int vis_real_mult(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; } #define PI 3.14159265 int vis_real_cos(datum ** inputlist, queue_entry * worker_entry) { inputlist[0] = copy_datum(inputlist[0], 0); inputlist[0]->c.real = cos(inputlist[0]->c.real * PI/180.0); return 0; } int vis_real_sin(datum ** inputlist, queue_entry * worker_entry) { inputlist[0] = copy_datum(inputlist[0], 0); inputlist[0]->c.real = sin(inputlist[0]->c.real * PI/180.0); return 0; } int vis_real_tan(datum ** inputlist, queue_entry * worker_entry) { inputlist[0] = copy_datum(inputlist[0], 0); inputlist[0]->c.real = tan(inputlist[0]->c.real * PI/180.0); return 0; } int vis_real_arccos(datum ** inputlist, queue_entry * worker_entry) { inputlist[0] = copy_datum(inputlist[0], 0); inputlist[0]->c.real = acos(inputlist[0]->c.real)*180.0/PI; return 0; } int vis_real_arcsin(datum ** inputlist, queue_entry * worker_entry) { inputlist[0] = copy_datum(inputlist[0], 0); inputlist[0]->c.real = asin(inputlist[0]->c.real)*180.0/PI; return 0; } int vis_real_arctan(datum ** inputlist, queue_entry * worker_entry) { inputlist[0] = copy_datum(inputlist[0], 0); inputlist[0]->c.real = atan(inputlist[0]->c.real)*180.0/PI; return 0; } int vis_real_exp(datum ** inputlist, queue_entry * worker_entry) { inputlist[0] = copy_datum(inputlist[0], 0); inputlist[0]->c.real = pow(inputlist[0]->c.real, inputlist[1]->c.real); release_ref(inputlist[1]); return 0; } int vis_real_sqrt(datum ** inputlist, queue_entry * worker_entry) { inputlist[0] = copy_datum(inputlist[0], 0); inputlist[0]->c.real = sqrt(inputlist[0]->c.real); return 0; } int vis_whole_fromreal(datum ** inputlist, queue_entry * worker_entry) { datum * output = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, worker_entry->instance->def->program); output->c.integers.num_a = inputlist[0]->c.real; release_ref(inputlist[0]); inputlist[0] = output; return 0; } int vis_real_fromwhole(datum ** inputlist, queue_entry * worker_entry) { datum * output = new_datum(BUILTIN_TYPE_REAL, 3, 0, worker_entry->instance->def->program); output->c.real = inputlist[0]->c.integers.num_a; release_ref(inputlist[0]); inputlist[0] = output; return 0; }