diff options
Diffstat (limited to 'functions.c')
-rw-r--r-- | functions.c | 102 |
1 files changed, 83 insertions, 19 deletions
diff --git a/functions.c b/functions.c index 5fa9305..411f90b 100644 --- a/functions.c +++ b/functions.c @@ -191,7 +191,7 @@ fnIndexGenerator(Array *right) vlong n = right->intdata[0]; Array *res = allocarray(AtypeInt, 1, n); res->shape[0] = n; - vlong io = globalIO(); + vlong io = currentsymtab->io; for(vlong i = 0; i < n; i++) res->intdata[i] = i + io; return res; @@ -239,11 +239,23 @@ fnPlus(Array *left, Array *right) exits(nil); } - Array *res = duparray(leftarr); - for(int i = 0; i < leftarr->size; i++) - res->intdata[i] += rightarr->intdata[i]; + int typeok = commontype(leftarr, rightarr, &left, &right, 0); + if(!typeok){ + print("Types don't match lol\n"); + exits(nil); + } + + Array *res = duparray(left); + for(int i = 0; i < left->size; i++){ + if(res->type == AtypeFloat) + res->floatdata[i] += right->floatdata[i]; + else if(res->type == AtypeInt) + res->intdata[i] += right->intdata[i]; + } freearray(leftarr); freearray(rightarr); + freearray(left); + freearray(right); return res; } @@ -258,11 +270,23 @@ fnMinus(Array *left, Array *right) exits(nil); } - Array *res = duparray(leftarr); - for(int i = 0; i < leftarr->size; i++) - res->intdata[i] -= rightarr->intdata[i]; + int typeok = commontype(leftarr, rightarr, &left, &right, 0); + if(!typeok){ + print("Types don't match lol\n"); + exits(nil); + } + + Array *res = duparray(left); + for(int i = 0; i < left->size; i++){ + if(res->type == AtypeFloat) + res->floatdata[i] -= right->floatdata[i]; + else if(res->type == AtypeInt) + res->intdata[i] -= right->intdata[i]; + } freearray(leftarr); freearray(rightarr); + freearray(left); + freearray(right); return res; } @@ -277,11 +301,23 @@ fnTimes(Array *left, Array *right) exits(nil); } - Array *res = duparray(leftarr); - for(int i = 0; i < leftarr->size; i++) - res->intdata[i] *= rightarr->intdata[i]; + int typeok = commontype(leftarr, rightarr, &left, &right, 0); + if(!typeok){ + print("Types don't match lol\n"); + exits(nil); + } + + Array *res = duparray(left); + for(int i = 0; i < left->size; i++){ + if(res->type == AtypeFloat) + res->floatdata[i] *= right->floatdata[i]; + else if(res->type == AtypeInt) + res->intdata[i] *= right->intdata[i]; + } freearray(leftarr); freearray(rightarr); + freearray(left); + freearray(right); return res; } @@ -296,11 +332,19 @@ fnDivide(Array *left, Array *right) exits(nil); } - Array *res = duparray(leftarr); - for(int i = 0; i < leftarr->size; i++) - res->intdata[i] /= rightarr->intdata[i]; + int typeok = commontype(leftarr, rightarr, &left, &right, 1); + if(!typeok){ + print("Types don't match lol\n"); + exits(nil); + } + + Array *res = duparray(left); + for(int i = 0; i < left->size; i++) + res->floatdata[i] /= right->floatdata[i]; freearray(leftarr); freearray(rightarr); + freearray(left); + freearray(right); return res; } @@ -315,11 +359,23 @@ fnPower(Array *left, Array *right) exits(nil); } - Array *res = duparray(leftarr); - for(int i = 0; i < leftarr->size; i++) - res->intdata[i] = pow(res->intdata[i], rightarr->intdata[i]); + int typeok = commontype(leftarr, rightarr, &left, &right, 0); + if(!typeok){ + print("Types don't match lol\n"); + exits(nil); + } + + Array *res = duparray(left); + for(int i = 0; i < left->size; i++){ + if(res->type == AtypeFloat) + res->floatdata[i] = pow(res->floatdata[i], right->floatdata[i]); + else if(res->type == AtypeInt) + res->intdata[i] = pow(res->intdata[i], right->intdata[i]); + } freearray(leftarr); freearray(rightarr); + freearray(left); + freearray(right); return res; } @@ -334,11 +390,19 @@ fnLogarithm(Array *left, Array *right) exits(nil); } - Array *res = duparray(leftarr); - for(int i = 0; i < leftarr->size; i++) - res->intdata[i] = log(rightarr->intdata[i])/log(res->intdata[i]); + int typeok = commontype(leftarr, rightarr, &left, &right, 1); + if(!typeok){ + print("Types don't match lol\n"); + exits(nil); + } + + Array *res = duparray(left); + for(int i = 0; i < left->size; i++) + res->floatdata[i] = log(right->floatdata[i])/log(res->floatdata[i]); freearray(leftarr); freearray(rightarr); + freearray(left); + freearray(right); return res; } |