about summary refs log tree commit diff
path: root/src/bootstrap/main.pry
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/main.pry')
-rw-r--r--src/bootstrap/main.pry69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/bootstrap/main.pry b/src/bootstrap/main.pry
new file mode 100644
index 0000000..29e41ff
--- /dev/null
+++ b/src/bootstrap/main.pry
@@ -0,0 +1,69 @@
+extern fopen = (*i8, *i8) => *i8;
+extern fgets = (*i8, i64, *i8) => void;
+extern feof = (*i8) => bool;
+extern fseek = (*i8, i64, i64) => i64;
+extern ftell = (*i8) => i64;
+extern fread = (*i8, i64, i64, *i8) => i64;
+extern fclose = (*i8) => *i8;
+
+import "!stdlib.pry";
+import "!mem.pry";
+
+let slice = struct {
+	data: *void,
+	data_len: i64,
+};
+
+import "tokenizer.pry";
+import "parser.pry";
+import "codegen.pry";
+
+let read_file = (filename: *i8, alloc: *arena) => slice {
+	let file = fopen(filename, "r");
+
+	fseek(file, 0, 2);
+	let file_size = ftell(file);
+	fseek(file, 0, 0);
+
+	let buf = cast(*i8, arena_alloc(alloc, file_size + 1));
+
+	let bytes_read = fread(buf, 1, file_size, file);
+	(*(buf + cast(*i8, bytes_read))) = '\0';
+
+	fclose(file);
+
+	let sl = slice{};
+	sl.data = cast(*void, buf);
+	sl.data_len = file_size;
+	return sl;
+};
+
+let main = (argc: i64, argv: **i8) => i64 {
+	if argc < 2 {
+		printf("Need filename!\n");
+		return 1;
+	};
+
+	let filename = *(argv + cast(**i8, 1));
+
+	printf("%s\n", filename);
+
+	let alloc = arena_init(999999999);
+
+	let file = read_file(filename, alloc);
+
+	let t = tokenizer_init(alloc, file);
+	let ts = tokenizer_tokenize(t);
+
+	let p = parser_init(cast(*token, ts.data), ts.data_len, alloc);
+	let ast = parse(p);
+
+	let c = codegen_init(alloc);
+	let res = codegen_generate(c, ast);
+	let res = codegen_compile(c);
+	codegen_deinit(c);
+
+	arena_free(alloc);
+
+	return 0;
+};