Просмотр исходного кода

core: file extension is text after last dot of the basename of the path

Daniele Bartolini 5 лет назад
Родитель
Сommit
8731f0b9fb
3 измененных файлов с 36 добавлено и 14 удалено
  1. 3 2
      src/core/filesystem/path.cpp
  2. 3 2
      src/core/filesystem/path.h
  3. 30 10
      src/core/unit_tests.cpp

+ 3 - 2
src/core/filesystem/path.cpp

@@ -75,8 +75,9 @@ namespace path
 	const char* extension(const char* path)
 	{
 		CE_ENSURE(NULL != path);
-		const char* ld = strrchr(path, '.');
-		return ld == NULL ? NULL : ld + 1;
+		const char* bn = basename(path);
+		const char* ld = strrchr(bn, '.');
+		return (ld == NULL || ld == bn) ? NULL : ld + 1;
 	}
 
 	bool has_trailing_separator(const char* path)

+ 3 - 2
src/core/filesystem/path.h

@@ -35,8 +35,9 @@ namespace path
 
 	/// Returns the extension of the @a path or NULL.
 	/// @note
-	/// "/home/texture.tga" -> "tga"
-	/// "/home/texture" -> NULL
+	/// /home/texture.tga -> "tga"
+	/// /home/texture -> NULL
+	/// /home/.tga -> NULL
 	const char* extension(const char* path);
 
 	/// Returns whether the @a path has a trailing separator.

+ 30 - 10
src/core/unit_tests.cpp

@@ -1277,22 +1277,42 @@ static void test_path()
 	{
 		const char* p = path::basename("");
 		ENSURE(strcmp(p, "") == 0);
+	}
+	{
 		const char* q = path::basename("/");
 		ENSURE(strcmp(q, "") == 0);
-		const char* r = path::basename("boot.config");
-		ENSURE(strcmp(r, "boot.config") == 0);
-		const char* s = path::basename("foo/boot.config");
-		ENSURE(strcmp(s, "boot.config") == 0);
-		const char* t = path::basename("/foo/boot.config");
-		ENSURE(strcmp(t, "boot.config") == 0);
+	}
+	{
+		const char* p = path::basename("boot.config");
+		ENSURE(strcmp(p, "boot.config") == 0);
+	}
+	{
+		const char* p = path::basename("foo/boot.config");
+		ENSURE(strcmp(p, "boot.config") == 0);
+	}
+	{
+		const char* p = path::basename("/foo/boot.config");
+		ENSURE(strcmp(p, "boot.config") == 0);
 	}
 	{
 		const char* p = path::extension("");
 		ENSURE(p == NULL);
-		const char* q = path::extension("boot");
-		ENSURE(q == NULL);
-		const char* r = path::extension("boot.bar.config");
-		ENSURE(strcmp(r, "config") == 0);
+	}
+	{
+		const char* p = path::extension("boot");
+		ENSURE(p == NULL);
+	}
+	{
+		const char* p = path::extension("boot.bar.config");
+		ENSURE(strcmp(p, "config") == 0);
+	}
+	{
+		const char* p = path::extension(".bar");
+		ENSURE(p == NULL);
+	}
+	{
+		const char* p = path::extension("foo/.bar");
+		ENSURE(p == NULL);
 	}
 	{
 		TempAllocator128 ta;