From e46e08fceff29622399855043554635d6e33c3c4 Mon Sep 17 00:00:00 2001 From: thing 1 Date: Fri, 10 Jan 2025 17:38:56 +0000 Subject: init commit --- builtin.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 builtin.c (limited to 'builtin.c') diff --git a/builtin.c b/builtin.c new file mode 100644 index 0000000..89995a3 --- /dev/null +++ b/builtin.c @@ -0,0 +1,136 @@ +#include +#include +#include +#include +#include "parser.h" +#include "eval.h" + +bool arithmetic(luckytree *tree, luckyval *out){ + if (strcmp(tree->function, "+") == 0){ + argcounterror(tree, 2); + if (tree->arguments->type == LUCKYINT && tree->arguments->nextelement->type == LUCKYINT){ + out->i = tree->arguments->i + tree->arguments->nextelement->i; + out->type = LUCKYINT; + }else if (tree->arguments->type == LUCKYFLOAT && tree->arguments->nextelement->type == LUCKYFLOAT){ + out->f = tree->arguments->f + tree->arguments->nextelement->f; + out->type = LUCKYFLOAT; + }else if (tree->arguments->type == LUCKYFLOAT && tree->arguments->nextelement->type == LUCKYINT){ + out->f = tree->arguments->f + tree->arguments->nextelement->i; + out->type = LUCKYFLOAT; + }else if (tree->arguments->type == LUCKYINT && tree->arguments->nextelement->type == LUCKYFLOAT){ + out->f = tree->arguments->i + tree->arguments->nextelement->f; + out->type = LUCKYFLOAT; + } + else { + printf("invalid types given!\n"); + exit(1); + } + } + else if (strcmp(tree->function, "-") == 0){ + argcounterror(tree, 2); + if (tree->arguments->type == LUCKYINT && tree->arguments->nextelement->type == LUCKYINT){ + out->i = tree->arguments->i - tree->arguments->nextelement->i; + out->type = LUCKYINT; + }else if (tree->arguments->type == LUCKYFLOAT && tree->arguments->nextelement->type == LUCKYFLOAT){ + out->f = tree->arguments->f - tree->arguments->nextelement->f; + out->type = LUCKYFLOAT; + }else if (tree->arguments->type == LUCKYFLOAT && tree->arguments->nextelement->type == LUCKYINT){ + out->f = tree->arguments->f - tree->arguments->nextelement->i; + out->type = LUCKYFLOAT; + }else if (tree->arguments->type == LUCKYINT && tree->arguments->nextelement->type == LUCKYFLOAT){ + out->f = tree->arguments->i - tree->arguments->nextelement->f; + out->type = LUCKYFLOAT; + } + else { + printf("invalid types given!\n"); + exit(1); + } + } + else if (strcmp(tree->function, "*") == 0){ + argcounterror(tree, 2); + if (tree->arguments->type == LUCKYINT && tree->arguments->nextelement->type == LUCKYINT){ + out->i = tree->arguments->i * tree->arguments->nextelement->i; + out->type = LUCKYINT; + }else if (tree->arguments->type == LUCKYFLOAT && tree->arguments->nextelement->type == LUCKYFLOAT){ + out->f = tree->arguments->f * tree->arguments->nextelement->f; + out->type = LUCKYFLOAT; + }else if (tree->arguments->type == LUCKYFLOAT && tree->arguments->nextelement->type == LUCKYINT){ + out->f = tree->arguments->f * tree->arguments->nextelement->i; + out->type = LUCKYFLOAT; + }else if (tree->arguments->type == LUCKYINT && tree->arguments->nextelement->type == LUCKYFLOAT){ + out->f = tree->arguments->i * tree->arguments->nextelement->f; + out->type = LUCKYFLOAT; + } + else { + printf("invalid types given!\n"); + exit(1); + } + } + else if (strcmp(tree->function, "/") == 0){ + argcounterror(tree, 2); + if (tree->arguments->type == LUCKYINT && tree->arguments->nextelement->type == LUCKYINT){ + out->i = tree->arguments->i / tree->arguments->nextelement->i; + out->type = LUCKYINT; + }else if (tree->arguments->type == LUCKYFLOAT && tree->arguments->nextelement->type == LUCKYFLOAT){ + out->f = tree->arguments->f / tree->arguments->nextelement->f; + out->type = LUCKYFLOAT; + }else if (tree->arguments->type == LUCKYFLOAT && tree->arguments->nextelement->type == LUCKYINT){ + out->f = tree->arguments->f / tree->arguments->nextelement->i; + out->type = LUCKYFLOAT; + }else if (tree->arguments->type == LUCKYINT && tree->arguments->nextelement->type == LUCKYFLOAT){ + out->f = tree->arguments->i / tree->arguments->nextelement->f; + out->type = LUCKYFLOAT; + } + else { + printf("invalid types given!\n"); + exit(1); + } + } + else return false; + return true; +} + +bool variableops(luckytree *tree, luckyval *out){ + if (strcmp(tree->function, "let") == 0){ + argcounterror(tree, 2); + if (tree->arguments->type == LUCKYVAR) { + variables[varcount] = malloc(sizeof(luckyvar)); + variables[varcount]->name = strdup(tree->arguments->var); + + variables[varcount]->val = malloc(sizeof(luckyval)); + memcpy(variables[varcount]->val, tree->arguments->nextelement, sizeof(luckyval)); + varcount++; + } else { + printf("expected var name as the first argument!\n"); + exit(1); + } + } + else return false; + return true; +} + +bool io(luckytree *tree, luckyval *out){ + if (strcmp(tree->function, "print") == 0){ + argcounterror(tree, 1); + if (tree->arguments->type == LUCKYINT) + printf("%d\n", tree->arguments->i); + if (tree->arguments->type == LUCKYFLOAT) + printf("%f\n", tree->arguments->f); + } + else if (strcmp(tree->function, "readint") == 0){ + argcounterror(tree, 0); + int i; + scanf("%d", &i); + out->i = i; + out->type = LUCKYINT; + } + else if (strcmp(tree->function, "readfloat") == 0){ + argcounterror(tree, 0); + float f; + scanf("%f", &f); + out->f = f; + out->type = LUCKYFLOAT; + } + else return false; + return true; +} -- cgit v1.2.3