Browse Source

Only allow .odin files to be parsed

gingerBill 9 years ago
parent
commit
51d0532c3e
3 changed files with 36 additions and 3 deletions
  1. 2 0
      examples/other.odin
  2. 29 0
      src/common.cpp
  3. 5 3
      src/parser.cpp

+ 2 - 0
examples/other.odin

@@ -1,3 +1,5 @@
+import "test"
+
 add :: proc(a, b: int) -> int {
 	return a + b;
 }

+ 29 - 0
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) {

+ 5 - 3
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);