Daniele Bartolini 9 лет назад
Родитель
Сommit
a8fbe84ebe
2 измененных файлов с 16 добавлено и 11 удалено
  1. 6 11
      src/core/strings/dynamic_string.h
  2. 10 0
      src/core/unit_tests.cpp

+ 6 - 11
src/core/strings/dynamic_string.h

@@ -202,22 +202,17 @@ inline void DynamicString::trim()
 inline bool DynamicString::has_prefix(const char* str) const
 {
 	CE_ASSERT_NOT_NULL(str);
-	return strncmp(c_str(), str, strlen32(str)) == 0;
+	const u32 ml = strlen32(c_str());
+	const u32 sl = strlen32(str);
+	return sl <= ml && strncmp(&_data[0], str, sl) == 0;
 }
 
 inline bool DynamicString::has_suffix(const char* str) const
 {
 	CE_ASSERT_NOT_NULL(str);
-
-	const u32 my_len = strlen32(c_str());
-	const u32 s_len = strlen32(str);
-
-	if (my_len >= s_len)
-	{
-		return strncmp(array::begin(_data) + (my_len - s_len), str, s_len) == 0;
-	}
-
-	return false;
+	const u32 ml = strlen32(c_str());
+	const u32 sl = strlen32(str);
+	return sl <= ml && strncmp(&_data[ml-sl], str, sl) == 0;
 }
 
 inline StringId32 DynamicString::to_string_id() const

+ 10 - 0
src/core/unit_tests.cpp

@@ -882,6 +882,16 @@ static void test_dynamic_string()
 		str.trim();
 		ENSURE(strcmp(str.c_str(), "Sushi") == 0);
 	}
+	{
+		TempAllocator1024 ta;
+		DynamicString str("Hello everyone!", ta);
+		ENSURE(str.has_prefix("Hello"));
+		ENSURE(!str.has_prefix("hello"));
+		ENSURE(str.has_suffix("one!"));
+		ENSURE(!str.has_suffix("one"));
+		ENSURE(!str.has_prefix("Hello everyone!!!"));
+		ENSURE(!str.has_suffix("Hello everyone!!!"));
+	}
 	memory_globals::shutdown();
 }