diff --git a/BaseLib/FileTools.cpp b/BaseLib/FileTools.cpp index 88ec37f123a80a91036ffbdfac6f06eb4ffe99a9..9a0d28b3bc1f144d1983dc553531bd30f9702077 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 3153fc6bc1a69298a0a2a3481d223e5fd81bf571..113298dd311f66db1ad5ef9eadc2d0e17411457d 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 03952bdabe74dae4be1edd997bb5768129d69025..44d7f8d99a016f26e9b0a68dd52c88bf3ca05493 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" );