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.src"; import "!mem.src"; let slice = struct { data: *void, data_len: i64, }; import "tokenizer.src"; import "parser.src"; import "codegen.src"; 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; };