aboutsummaryrefslogtreecommitdiff
path: root/src/compiler/source_code/source_code.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/source_code/source_code.c')
-rw-r--r--src/compiler/source_code/source_code.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/compiler/source_code/source_code.c b/src/compiler/source_code/source_code.c
new file mode 100644
index 0000000..7f1c8fa
--- /dev/null
+++ b/src/compiler/source_code/source_code.c
@@ -0,0 +1,57 @@
+#include "source_code.h"
+
+#include <stdlib.h>
+#include <utils/memory/memory.h>
+
+Code makeCode(char *filePath, char *code) {
+ const Code result = {
+ .filePath = filePath,
+ .code = code,
+ };
+ return result;
+}
+
+SourceCode makeSourceCode() {
+ const SourceCode result = {
+ .codes = NULL,
+ .size = 0,
+ };
+ return result;
+}
+
+SourceCode *newSourceCode() {
+ SourceCode *result = a404m_malloc(sizeof(*result));
+ result->codes = NULL;
+ result->size = 0;
+ return result;
+}
+
+void pushToSourceCode(SourceCode *sourceCode, Code *code) {
+ size_t size = a404m_malloc_usable_size(sourceCode->codes) / sizeof(Code *);
+ if (sourceCode->size == size) {
+ size += size / 2 + 1;
+ sourceCode->codes = a404m_realloc(sourceCode->codes, size * sizeof(Code *));
+ }
+ sourceCode->codes[sourceCode->size] = code;
+ sourceCode->size += 1;
+}
+
+void deleteSourceCodeInners(SourceCode sourceCode) {
+ if (sourceCode.size != 0) {
+ for (size_t i = 0; i < sourceCode.size; ++i) {
+ deleteCode(sourceCode.codes[i]);
+ }
+ free(sourceCode.codes);
+ }
+}
+
+void deleteSourceCode(SourceCode *sourceCode) {
+ deleteSourceCodeInners(*sourceCode);
+ free(sourceCode);
+}
+
+void deleteCode(Code *code) {
+ free(code->filePath);
+ free(code->code);
+ free(code);
+}