diff options
Diffstat (limited to 'builtin.c')
-rw-r--r-- | builtin.c | 136 |
1 files changed, 136 insertions, 0 deletions
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 <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <stdbool.h> +#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; +} |