Generalized arithmetic functions
to arbitrary arguments.
This commit is contained in:
parent
2ce89fb39a
commit
681e005a68
57
src/exec.c
57
src/exec.c
@ -1,3 +1,4 @@
|
|||||||
|
#include <stddef.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@ -21,32 +22,46 @@ ASTNumData exec_call(AST* ast) {
|
|||||||
log_dbg("Started call execution.");
|
log_dbg("Started call execution.");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
ASTCallData* calldata = (ASTCallData*)ast->data;
|
ASTCallData* calldata = (ASTCallData*)ast->data;
|
||||||
if (!strcmp(calldata->to, "sum") && calldata->argc == 2) {
|
if (!strcmp(calldata->to, "sum")) {
|
||||||
ASTNumData n1 = exec_expr(calldata->argv[0]);
|
double total = 0;
|
||||||
ASTNumData n2 = exec_expr(calldata->argv[1]);
|
|
||||||
|
|
||||||
return n1 + n2;
|
for (
|
||||||
} else if (!strcmp(calldata->to, "sub") && calldata->argc == 2) {
|
size_t i = 0;
|
||||||
ASTNumData n1 = exec_expr(calldata->argv[0]);
|
i < calldata->argc;
|
||||||
ASTNumData n2 = exec_expr(calldata->argv[1]);
|
total += exec_expr(calldata->argv[i++])
|
||||||
|
);
|
||||||
|
|
||||||
return n1 - n2;
|
return total;
|
||||||
} else if (!strcmp(calldata->to, "mul") && calldata->argc == 2) {
|
} else if (!strcmp(calldata->to, "sub")) {
|
||||||
ASTNumData n1 = exec_expr(calldata->argv[0]);
|
double total = 0;
|
||||||
ASTNumData n2 = exec_expr(calldata->argv[1]);
|
|
||||||
|
|
||||||
return n1 * n2;
|
for (
|
||||||
} else if (!strcmp(calldata->to, "div") && calldata->argc == 2) {
|
size_t i = 0;
|
||||||
ASTNumData n1 = exec_expr(calldata->argv[0]);
|
i < calldata->argc;
|
||||||
ASTNumData n2 = exec_expr(calldata->argv[1]);
|
total -= exec_expr(calldata->argv[i++])
|
||||||
|
);
|
||||||
|
|
||||||
return n1 / n2;
|
return total;
|
||||||
} else if (!strcmp(calldata->to, "sum") && calldata->argc == 3) {
|
} else if (!strcmp(calldata->to, "mul")) {
|
||||||
ASTNumData n1 = exec_expr(calldata->argv[0]);
|
double total = 1;
|
||||||
ASTNumData n2 = exec_expr(calldata->argv[1]);
|
|
||||||
ASTNumData n3 = exec_expr(calldata->argv[2]);
|
|
||||||
|
|
||||||
return n1 + n2 + n3;
|
for (
|
||||||
|
size_t i = 0;
|
||||||
|
i < calldata->argc;
|
||||||
|
total *= exec_expr(calldata->argv[i++])
|
||||||
|
);
|
||||||
|
|
||||||
|
return total;
|
||||||
|
} else if (!strcmp(calldata->to, "div")) {
|
||||||
|
double total = 1;
|
||||||
|
|
||||||
|
for (
|
||||||
|
size_t i = 0;
|
||||||
|
i < calldata->argc;
|
||||||
|
total /= exec_expr(calldata->argv[i++])
|
||||||
|
);
|
||||||
|
|
||||||
|
return total;
|
||||||
}
|
}
|
||||||
return -1000;
|
return -1000;
|
||||||
}
|
}
|
||||||
|
@ -11,9 +11,9 @@
|
|||||||
ArgArr* argarr_init() {
|
ArgArr* argarr_init() {
|
||||||
ArgArr* argarr = malloc(sizeof(ArgArr));
|
ArgArr* argarr = malloc(sizeof(ArgArr));
|
||||||
|
|
||||||
argarr->sz = ARLN;
|
argarr->sz = ARLN * sizeof(AST*);
|
||||||
argarr->ln = 0;
|
argarr->ln = 0;
|
||||||
argarr->buf = malloc(ARLN);
|
argarr->buf = malloc(argarr->sz);
|
||||||
|
|
||||||
return argarr;
|
return argarr;
|
||||||
}
|
}
|
||||||
@ -24,7 +24,7 @@ void argarr_destroy(ArgArr* argarr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void argarr_add(ArgArr* argarr, AST* arg) {
|
void argarr_add(ArgArr* argarr, AST* arg) {
|
||||||
if (argarr->ln + 1 > argarr->sz) {
|
if ((argarr->ln + 1) * argarr->sz > argarr->sz) {
|
||||||
argarr->sz *= 2;
|
argarr->sz *= 2;
|
||||||
argarr->buf = realloc(argarr->buf, argarr->sz);
|
argarr->buf = realloc(argarr->buf, argarr->sz);
|
||||||
log_dbgf(
|
log_dbgf(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user