diff --git a/examples/other.odin b/examples/other.odin index cdea3c675..380e96bd7 100644 --- a/examples/other.odin +++ b/examples/other.odin @@ -1,3 +1,5 @@ +import "test" + add :: proc(a, b: int) -> int { return a + b; } diff --git a/src/common.cpp b/src/common.cpp index 7d7bed316..e5b674c3b 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -31,6 +31,35 @@ gb_inline b32 are_strings_equal(String a, String b) { return false; } + +gb_inline isize string_has_any_extension(String str) { + isize dot_pos = -1; + isize i = str.len; + b32 seen_dot = false; + while (i --> 0) { + if (str.text[i] == GB_PATH_SEPARATOR) + break; + if (str.text[i] == '.') { + dot_pos = i; + break; + } + } + + return dot_pos; +} + +gb_inline b32 string_has_extension(String str, String ext) { + if (str.len > ext.len+1) { + u8 *s = str.text+str.len - ext.len-1; + if (s[0] == '.') { + s++; + return gb_memcompare(s, ext.text, ext.len) == 0; + } + return false; + } + return false; +} + // Hasing gb_inline u64 hashing_proc(void const *data, isize len) { diff --git a/src/parser.cpp b/src/parser.cpp index 223229f03..a1d08666e 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1670,10 +1670,12 @@ AstNode *parse_statement_list(AstFile *f, isize *list_count_) { } -// void parse_file(AstFile *f, ) - b32 init_ast_file(AstFile *f, String fullpath) { + if (!string_has_extension(fullpath, make_string("odin"))) { + gb_printf_err("Only `.odin` files are allowed\n"); + return false; + } if (init_tokenizer(&f->tokenizer, fullpath)) { gb_array_init(f->tokens, gb_heap_allocator()); for (;;) { @@ -1804,7 +1806,7 @@ void parse_files(Parser *p, char *init_filename) { AstFile file = {}; b32 ok = init_ast_file(&file, import_path); if (!ok) { - gb_printf_err("Failed to parse file: %.*s", LIT(import_path)); + gb_printf_err("Failed to parse file: %.*s\n", LIT(import_path)); return; } parse_file(p, &file);