From ee148fdb98736e76c4816d32efcb2d9db9cb7eba Mon Sep 17 00:00:00 2001
From: Clemens Paumgarten <clemenspaumgarten@gmail.com>
Date: Sat, 1 Jun 2019 11:08:09 +0200
Subject: [PATCH] Change mcc_ast_program to dynamic_array structure

---
 include/mcc/ast.h        |  4 +---
 src/ast.c                | 37 +++++++++++++------------------------
 src/ast_print.c          |  6 +++---
 src/ast_visit.c          |  4 ++--
 src/symbol_table_parse.c |  8 ++++----
 src/utils/mcc_scope.c    |  4 ++--
 6 files changed, 25 insertions(+), 38 deletions(-)

diff --git a/include/mcc/ast.h b/include/mcc/ast.h
index 9a7aedd..5ca073c 100644
--- a/include/mcc/ast.h
+++ b/include/mcc/ast.h
@@ -386,9 +386,7 @@ void mcc_ast_delete_function(struct mcc_ast_function *function);
 
 struct mcc_ast_program {
 	struct mcc_ast_node node;
-	int max;
-	int size;
-	struct mcc_ast_function* function_def[];
+	Dynamic_Array *function_def;
 };
 
 struct mcc_ast_program *mcc_ast_new_program(struct mcc_ast_function *function_def);
diff --git a/src/ast.c b/src/ast.c
index ab2d5f7..51c36aa 100644
--- a/src/ast.c
+++ b/src/ast.c
@@ -612,11 +612,10 @@ void mcc_ast_delete_function(struct mcc_ast_function *function) {
 struct mcc_ast_program *mcc_ast_new_program(struct mcc_ast_function *function_def) {
 	assert(function_def);
 
-	struct mcc_ast_program *p = malloc(sizeof(*p) + sizeof(struct mcc_ast_function*) * MCC_PROGRAM_FUNCTION_DEF_SIZE);
+	struct mcc_ast_program *p = malloc(sizeof(*p));
 
-	p -> size = 1;
-	p -> max = MCC_PROGRAM_FUNCTION_DEF_SIZE;
-	p -> function_def[0] = function_def;
+	p -> function_def = mcc_create_dynamic_array(MCC_PROGRAM_FUNCTION_DEF_SIZE);
+	mcc_add_to_array(p -> function_def, function_def);
 
 	return p;
 }
@@ -626,33 +625,23 @@ struct mcc_ast_program *mcc_ast_add_function(struct mcc_ast_function *function_d
 	assert(program);
 	assert(function_def);
 
-	int size = program -> size;
-	if (program -> size < program -> max) {
-		program -> function_def[size] = function_def;
-		program -> size += 1;
-	} else {
-
-		program = realloc(program, sizeof(*program) + sizeof(struct mcc_ast_function*) * MCC_PROGRAM_FUNCTION_DEF_SIZE);
-		if(program == NULL ){
-			mcc_ast_delete_program(program);
-			return NULL;
-		}
-		program -> max += MCC_PROGRAM_FUNCTION_DEF_SIZE;
-		program -> function_def[size] = function_def;
-		program -> size += 1;
-	}
+	if (mcc_add_to_array(program -> function_def, function_def) == 1) {
+		perror("Function def add error");
+	};
 
 	return program;
 }
 
+static void delete_func(void *function_def) {
+	struct mcc_ast_function *f = (struct mcc_ast_function*) function_def;
+
+	mcc_ast_delete_function(f);
+}
+
 void mcc_ast_delete_program(struct mcc_ast_program *program)
 {
 	assert(program);
 
-	for (int i = 0; i < program -> size; i++) {
-		mcc_ast_delete_function(program -> function_def[i]);
-
-	}
-
+	mcc_delete_array(program -> function_def, delete_func);
 	free(program);
 }
diff --git a/src/ast_print.c b/src/ast_print.c
index 4860101..00590b4 100644
--- a/src/ast_print.c
+++ b/src/ast_print.c
@@ -460,15 +460,15 @@ static void print_dot_function(struct mcc_ast_function *function, void *data)
 
 // ------------------------------------------------------------------- Program
 
-static void print_dot_program(struct mcc_ast_program *program, void *data)
+static void print_dot_program(struct  mcc_ast_program *program, void *data)
 {
 	assert(program);
 	assert(data);
 
 	FILE *out = data;
 	print_dot_node(out, program, "program");
-	for (int i = 0; i < program->size; i++) {
-		print_dot_edge(out, program, program->function_def[i],
+	for (int i = 0; i < program-> function_def -> size; i++) {
+		print_dot_edge(out, program, program->function_def -> arr[i],
 					   "function_definition");
 	}
 }
diff --git a/src/ast_visit.c b/src/ast_visit.c
index 7578012..2f873b6 100644
--- a/src/ast_visit.c
+++ b/src/ast_visit.c
@@ -296,8 +296,8 @@ void mcc_ast_visit_program(struct mcc_ast_program *program, struct mcc_ast_visit
 	assert(visitor);
 
 	visit_if_pre_order(program, visitor->program, visitor);
-	for (int i = 0; i < program->size; i++) {
-		mcc_ast_visit_function(program->function_def[i], visitor);
+	for (int i = 0; i < program-> function_def -> size; i++) {
+		mcc_ast_visit_function(program->function_def -> arr [i], visitor);
 	}
 	visit_if_post_order(program, visitor->program, visitor);
 }
diff --git a/src/symbol_table_parse.c b/src/symbol_table_parse.c
index 12671fe..a1456da 100644
--- a/src/symbol_table_parse.c
+++ b/src/symbol_table_parse.c
@@ -319,8 +319,8 @@ int mcc_symbol_table_parse_program(
     assert(program);
 
     int function_parse = 0;
-    for(int i = 0; i < program->size; i++) {
-        function_parse = mcc_symbol_table_add_function_declaration(program->function_def[i], symbol_table, ec);
+    for(int i = 0; i < program -> function_def -> size; i++) {
+        function_parse = mcc_symbol_table_add_function_declaration(program->function_def -> arr[i], symbol_table, ec);
 
         if (function_parse) break;
     }
@@ -329,8 +329,8 @@ int mcc_symbol_table_parse_program(
     if (function_parse == 0) {
 
         // parse all functions
-        for(int i = 0; i < program->size; i++) {
-            function_parse = mcc_symbol_table_parse_function(program->function_def[i], symbol_table, ec);
+        for(int i = 0; i < program-> function_def -> size; i++) {
+            function_parse = mcc_symbol_table_parse_function(program->function_def -> arr[i], symbol_table, ec);
 
             if (function_parse) break;
         }
diff --git a/src/utils/mcc_scope.c b/src/utils/mcc_scope.c
index 5152578..1cae124 100644
--- a/src/utils/mcc_scope.c
+++ b/src/utils/mcc_scope.c
@@ -9,8 +9,8 @@ struct mcc_ast_function *mcc_limit_scope_to_function(char* function_name, struct
     assert(p);
 
     struct mcc_ast_function *f;
-    for (int i = 0; i < p -> size; i++) {
-        f = p -> function_def[i];
+    for (int i = 0; i < p -> function_def -> size; i++) {
+        f = p -> function_def -> arr[i];
 
         if (f != NULL) {
             if (strcmp(function_name, f -> identifier ->i_value) == 0) {
-- 
GitLab