diff options
Diffstat (limited to 'src/bootstrap/main.pry')
| -rw-r--r-- | src/bootstrap/main.pry | 69 |
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; +}; |