summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThing1 <thing1@seacrossedlovers.xyz>2024-09-13 15:48:02 +0100
committerThing1 <thing1@seacrossedlovers.xyz>2024-09-13 15:48:02 +0100
commit4e3b919602046dd22d69c8d58839cb33b62b1a85 (patch)
tree3f405017b6b9b56b2e45eaf0c0f935fa59b18d41
parent1f5da5a858d1dfe1052b9f0ba8daef827b3e0c9e (diff)
implemeted an allocator and defering memory manager
-rw-r--r--comp/lucas-standen-NEA/code2/Makefile2
-rw-r--r--comp/lucas-standen-NEA/code2/comp.c31
-rwxr-xr-xcomp/lucas-standen-NEA/code2/samplebin15256 -> 15624 bytes
-rw-r--r--comp/lucas-standen-NEA/code2/sample.zpy25
-rwxr-xr-xcomp/lucas-standen-NEA/code2/zpybin21336 -> 34792 bytes
-rwxr-xr-xcomp/lucas-standen-NEA/code2/zpy.sh3
6 files changed, 49 insertions, 12 deletions
diff --git a/comp/lucas-standen-NEA/code2/Makefile b/comp/lucas-standen-NEA/code2/Makefile
index a3aa9b2..728fa1d 100644
--- 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
index f37ffed..7fb975a 100644
--- 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
index 411368d..96a8c07 100755
--- 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
index 98bbf44..1eea0f4 100644
--- 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
index 2251a3f..5bbab13 100755
--- 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
index 1db747f..bd212fb 100755
--- 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