From 938d5596f63bf42d7f28547c98a5f249eb520ead Mon Sep 17 00:00:00 2001
From: Dmitrij Naumov <dmitrij@naumov.de>
Date: Wed, 31 Oct 2012 15:37:07 +0100
Subject: [PATCH] Add hasFileExtension() for case insesitive comparison.

---
 BaseLib/FileTools.cpp                         | 15 ++++
 BaseLib/FileTools.h                           |  6 ++
 .../TestFilePathStringManipulation.cpp        | 72 +++++++++++++++++++
 3 files changed, 93 insertions(+)

diff --git a/BaseLib/FileTools.cpp b/BaseLib/FileTools.cpp
index 88ec37f123a..9a0d28b3bc1 100644
--- a/BaseLib/FileTools.cpp
+++ b/BaseLib/FileTools.cpp
@@ -14,6 +14,8 @@
 #include "FileTools.h"
 
 #include <sys/stat.h>
+#include <algorithm>
+#include <cctype>
 
 namespace BaseLib
 {
@@ -99,6 +101,19 @@ std::string getFileExtension(const std::string &path)
 	return str.substr(p + 1);
 }
 
+bool hasFileExtension(std::string const& extension, std::string const& filename)
+{
+	std::string ext = extension;	// Copy for modification.
+	std::transform(ext.begin(), ext.end(), ext.begin(),
+		(int(*)(int)) std::toupper);
+
+	std::string file_ext = getFileExtension(filename);
+	std::transform(file_ext.begin(), file_ext.end(), file_ext.begin(),
+		(int(*)(int)) std::toupper);
+
+	return ext == file_ext;
+}
+
 std::string copyPathToFileName(const std::string &file_name, const std::string &source)
 {
 	// check if file_name already contains a full path
diff --git a/BaseLib/FileTools.h b/BaseLib/FileTools.h
index 3153fc6bc1a..113298dd311 100644
--- a/BaseLib/FileTools.h
+++ b/BaseLib/FileTools.h
@@ -69,6 +69,12 @@ std::string extractBaseNameWithoutExtension(std::string const& pathname);
  */
 std::string getFileExtension(std::string const& filename);
 
+/**
+ * Compares filename's extension with query extension. The comparison is case
+ * insensitive done by converting to upper case with the std::toupper()
+ * function.
+ */
+bool hasFileExtension(std::string const& extension, std::string const& filename);
 
 /**
  * Checks if file_name already contains a qualified path and if not copies the path from source.
diff --git a/Tests/BaseLib/TestFilePathStringManipulation.cpp b/Tests/BaseLib/TestFilePathStringManipulation.cpp
index 03952bdabe7..44d7f8d99a0 100644
--- a/Tests/BaseLib/TestFilePathStringManipulation.cpp
+++ b/Tests/BaseLib/TestFilePathStringManipulation.cpp
@@ -208,6 +208,78 @@ TEST(BaseLib, ExtractBaseNameWin)
 	ASSERT_EQ ( BaseLib::extractBaseName("\\path.wrong0\\path.wrong\\path.ext\\"), "" );
 }
 
+TEST(BaseLib, HasFileExtensionWin)
+{
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "file"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "\\file"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "path\\"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "\\path\\"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "path\\file"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "\\path\\file"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "\\path\\path\\file"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "\\path\\path\\path\\"));
+
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "\\file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "path.ext\\"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "\\path.ext\\"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "path\\file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "\\path\\file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "\\path\\path\\file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "\\path\\path\\path.ext\\"));
+
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "path.wrong\\file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "\\path.wrong\\file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "\\path.wrong0\\path.wrong\\file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "\\path.wrong0\\path.wrong\\path.ext\\"));
+
+	ASSERT_TRUE ( BaseLib::hasFileExtension("EXT", "file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("EXT", "file.EXT"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "file.EXT"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("Ext", "file.exT"));
+
+	ASSERT_TRUE ( BaseLib::hasFileExtension("EXT", "path\\file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("EXT", "path\\file.EXT"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "path\\file.EXT"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("Ext", "path\\file.exT"));
+}
+
+TEST(BaseLib, HasFileExtensionUnix)
+{
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "file"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "/file"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "path/"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "/path/"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "path/file"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "/path/file"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "/path/path/file"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "/path/path/path/"));
+
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "/file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "path.ext/"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "/path.ext/"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "path/file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "/path/file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "/path/path/file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "/path/path/path.ext/"));
+
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "path.wrong/file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "/path.wrong/file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "/path.wrong0/path.wrong/file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("", "/path.wrong0/path.wrong/path.ext/"));
+
+	ASSERT_TRUE ( BaseLib::hasFileExtension("EXT", "file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("EXT", "file.EXT"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "file.EXT"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("Ext", "file.exT"));
+
+	ASSERT_TRUE ( BaseLib::hasFileExtension("EXT", "path/file.ext"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("EXT", "path/file.EXT"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("ext", "path/file.EXT"));
+	ASSERT_TRUE ( BaseLib::hasFileExtension("Ext", "path/file.exT"));
+}
+
 TEST(BaseLib, ExtractBaseNameUnix)
 {
 	ASSERT_EQ ( BaseLib::extractBaseName("file"), "file" );
-- 
GitLab