builtin.c (1448B)
1 #include <stdlib.h> 2 #include <stdio.h> 3 4 #include "vars.h" 5 6 #include "../global/util.h" 7 8 #define MAXARGS 8 9 10 void *doCall(ast_node *node){ 11 builtInFuncs id = node->func->builtInFunc; 12 for (int i = 0; i < MAXARGS; i++){ 13 if (node->args[i] != NULL){ 14 node->literalArgs[i] = doCall(node->args[i]); 15 } 16 } 17 18 literal *out = CheckedMalloc(sizeof(literal)); 19 switch (id){ 20 case ADD: 21 out->i64 = CheckedMalloc(sizeof(I64)); 22 out->i64->data = node->literalArgs[0]->i64->data + node->literalArgs[1]->i64->data; 23 return out; 24 break; 25 26 case SUB: 27 out->i64 = CheckedMalloc(sizeof(I64)); 28 out->i64->data = node->literalArgs[0]->i64->data - node->literalArgs[1]->i64->data; 29 return out; 30 break; 31 case DIV: 32 out->i64 = CheckedMalloc(sizeof(I64)); 33 out->i64->data = node->literalArgs[0]->i64->data / node->literalArgs[1]->i64->data; 34 return out; 35 break; 36 case MUL: 37 out->i64 = CheckedMalloc(sizeof(I64)); 38 out->i64->data = node->literalArgs[0]->i64->data * node->literalArgs[1]->i64->data; 39 return out; 40 break; 41 42 case WRITE: 43 for (int i = 0; i < node->literalArgs[0]->arr->len; i++) 44 fputc(node->literalArgs[0]->arr->arr[i].ch->data, stdout); 45 break; 46 47 case LET: 48 newVar(node->literalArgs[0]->vdef, node->literalArgs[1]); 49 break; 50 51 case EXIT: 52 exit((int)node->literalArgs[0]->i64->data); 53 break; 54 55 default: 56 fprintf(stderr, "command not implemented"); 57 exit(1); 58 break; 59 } 60 }