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