From 51d0532c3e56ca0816da20f6f3e59d2d0f2c55c9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 21 Jul 2016 00:38:15 +0100 Subject: [PATCH] Only allow .odin files to be parsed --- examples/other.odin | 2 ++ src/common.cpp | 29 +++++++++++++++++++++++++++++ src/parser.cpp | 8 +++++--- 3 files changed, 36 insertions(+), 3 deletions(-) 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);