school

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

commit 4e3b919602046dd22d69c8d58839cb33b62b1a85
parent 1f5da5a858d1dfe1052b9f0ba8daef827b3e0c9e
Author: Thing1 <thing1@seacrossedlovers.xyz>
Date:   Fri, 13 Sep 2024 15:48:02 +0100

implemeted an allocator and defering memory manager

Diffstat:
Mcomp/lucas-standen-NEA/code2/Makefile | 2+-
Mcomp/lucas-standen-NEA/code2/comp.c | 31++++++++++++++++++++++++++++---
Mcomp/lucas-standen-NEA/code2/sample | 0
Mcomp/lucas-standen-NEA/code2/sample.zpy | 25++++++++++++++++++-------
Mcomp/lucas-standen-NEA/code2/zpy | 0
Mcomp/lucas-standen-NEA/code2/zpy.sh | 3++-
6 files changed, 49 insertions(+), 12 deletions(-)

diff --git a/comp/lucas-standen-NEA/code2/Makefile b/comp/lucas-standen-NEA/code2/Makefile @@ -1,5 +1,5 @@ CC = cc -CFLAGS = -O3 +CFLAGS = -O0 -ggdb all: _zpy _parser _tokenizer _comp _appendsnprintf _util _debug ${CC} zpy.o parser.o tokenizer.o comp.o appendsnprintf.o util.o debug.o -o zpy ${CFLAGS} diff --git a/comp/lucas-standen-NEA/code2/comp.c b/comp/lucas-standen-NEA/code2/comp.c @@ -35,10 +35,16 @@ char *names[] = { "exit", // 21 "return", // 22 + + "alloc", // takes a size and allocates a block of it // 23 }; char *compile(astNode *node); +char *tofree[256]; +int freeptr = 0; +bool neededmemptr = false; + char *vartypeToC(char *str, char *out){ char *name = malloc(strlen(str)); char *type = malloc(strlen(str)); @@ -112,16 +118,25 @@ char *compile(astNode *node){ out = appendsnprintf(out, MAXOUTLEN, "){\n"); } else if (strcmp(names[1], node->func) == 0){ + for (int i = 0; i < 256; i++){ + if (tofree[i] != NULL){ + out = appendsnprintf(out, MAXOUTLEN, "free(%s);\n", tofree[i]); + } else{ + for (int j = 0; j < 256; j++){ + tofree[j] = NULL; + } + freeptr = 0; + break; + } + } out = appendsnprintf(out, MAXOUTLEN, "}\n"); } else if (strcmp(names[2], node->func) == 0){ - out = appendsnprintf(out, MAXOUTLEN, "const "); out = vartypeToC(node->args[0], out); out = appendsnprintf(out, MAXOUTLEN, " = %s;\n", node->args[1]); } else if (strcmp(names[3], node->func) == 0){ - out = vartypeToC(node->args[0], out); - out = appendsnprintf(out, MAXOUTLEN, " = %s;\n", node->args[1]); + out = appendsnprintf(out, MAXOUTLEN, "%s = %s;\n", node->args[0], node->args[1]); } else if (strcmp(names[4], node->func) == 0){ out = appendsnprintf(out, MAXOUTLEN, "if (%s", node->args[0]); @@ -152,6 +167,7 @@ char *compile(astNode *node){ out = appendsnprintf(out, MAXOUTLEN, "%s %s(", node->args[1], node->args[0]); int i = 2; while (node->args[i] != NULL){ + if (i != 2) out = appendsnprintf(out, MAXOUTLEN, ",", node->args[i]); out = vartypeToC(node->args[i], out); i++; } @@ -163,6 +179,10 @@ char *compile(astNode *node){ else if (strcmp(names[22], node->func) == 0){ out = appendsnprintf(out, MAXOUTLEN, "return %s;\n", node->args[0]); } + else if (strcmp(names[23], node->func) == 0){ + out = appendsnprintf(out, MAXOUTLEN, "calloc(0, %s)", node->args[0]); + neededmemptr = true; + } else { // arithmetic operators and comparitors @@ -188,6 +208,11 @@ end: void Compile(astNode *line, FILE *f){ char *code = compile(line); + if (neededmemptr == true){ + tofree[freeptr] = getVarName(line->args[0]); + freeptr++; + neededmemptr = false; + } int len = strlen(code); if (code[len-2] == ';' || code[len-2] == '{' || code[len-2] == '}') fprintf(f, "%s", code); else fprintf(f, "%s;\n", code); diff --git a/comp/lucas-standen-NEA/code2/sample b/comp/lucas-standen-NEA/code2/sample Binary files differ. diff --git a/comp/lucas-standen-NEA/code2/sample.zpy b/comp/lucas-standen-NEA/code2/sample.zpy @@ -1,11 +1,22 @@ -(defun fib int n:int) - (if (<= n 1)) - (return n) - (endif) - (return (+ (fib (- n 1)) (fib (- n 2)))) +(symbol putchar int c:int) +(symbol getchar int) + +(defun read char* str:char*) + (let count:int 0) + (for c:char (getchar) (!= c '\n') 0) + (set str[count] c) + (set c (getchar)) + (set count (+ count 1)) + (endfor) + (return str) (endfun) (defun main int) - (fib 43) - (return 0) + (let str:char* (alloc 10)) + + (set str (read str)) + + (for i:int 0 (< i 10) 1) + (putchar str[i]) + (endfor) (endfun) diff --git a/comp/lucas-standen-NEA/code2/zpy b/comp/lucas-standen-NEA/code2/zpy Binary files differ. diff --git a/comp/lucas-standen-NEA/code2/zpy.sh b/comp/lucas-standen-NEA/code2/zpy.sh @@ -1,3 +1,4 @@ #!/bin/sh CC=cc -./zpy $1 | ${CC} -O3 -x c - -Wno-implicit -Wno-missing-declarations -o $2 +warnings="-Wno-builtin-declaration-mismatch -Wno-implicit -Wno-missing-declarations" +./zpy $1 | ${CC} ${warnings} -x c - -o $2