school

thing1's amazing school repo
Log | Files | Refs | Submodules | README

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 }