diff --git a/src/util/get_base_name.cpp b/src/util/get_base_name.cpp index 79d72618a61..5035095ac9d 100644 --- a/src/util/get_base_name.cpp +++ b/src/util/get_base_name.cpp @@ -8,7 +8,6 @@ Author: CM Wintersteiger \*******************************************************************/ - #include "get_base_name.h" /// cleans a filename from path and extension @@ -16,23 +15,24 @@ Author: CM Wintersteiger /// \return a new string std::string get_base_name(const std::string &in, bool strip_suffix) { - size_t r=std::string::npos; - if(strip_suffix) - r=in.rfind('.', in.length()-1); - if(r==std::string::npos) - r=in.length(); +#ifdef _WIN32 + // Windows now allows both '/' and '\\' + const std::size_t slash_pos = in.find_last_of("\\/"); +#else + const std::size_t slash_pos = in.rfind('/'); +#endif - size_t f=in.rfind('/', in.length()-1); - if(f==std::string::npos) - f=0; + std::size_t start_pos = + (slash_pos == std::string::npos) ? 0 : slash_pos + 1; - size_t fw=in.rfind('\\', in.length()-1); - if(fw==std::string::npos) - fw=0; + std::size_t char_count = std::string::npos; - f = (fw>f)?fw:f; + if(strip_suffix) + { + std::size_t dot_pos = in.rfind('.'); + if(dot_pos != std::string::npos && dot_pos >= start_pos) + char_count = dot_pos - start_pos; + } - if(in[f]=='/' || in[f]=='\\') - f++; - return in.substr(f, r-f); + return std::string(in, start_pos, char_count); } diff --git a/unit/Makefile b/unit/Makefile index 1e4dc900bdd..53a17feda52 100644 --- a/unit/Makefile +++ b/unit/Makefile @@ -28,6 +28,7 @@ SRC += unit_tests.cpp \ solvers/refinement/string_refinement/union_find_replace.cpp \ util/expr.cpp \ util/expr_cast/expr_cast.cpp \ + util/get_base_name.cpp \ util/graph.cpp \ util/irep.cpp \ util/irep_sharing.cpp \ diff --git a/unit/util/get_base_name.cpp b/unit/util/get_base_name.cpp new file mode 100644 index 00000000000..43c40c3c03c --- /dev/null +++ b/unit/util/get_base_name.cpp @@ -0,0 +1,36 @@ +/*******************************************************************\ + +Module: Unit test for get_base_name.h + +Author: Daniel Kroening + +\*******************************************************************/ + +#include + +#include + +TEST_CASE("get_base_name basic functionality", "[core][util][get_base_name]") +{ + REQUIRE(get_base_name(".exe", true) == ""); + REQUIRE(get_base_name(".exe", false) == ".exe"); + REQUIRE(get_base_name(".", true) == ""); + REQUIRE(get_base_name(".", false) == "."); + REQUIRE(get_base_name("some.file.ext", true) == "some.file"); + REQUIRE(get_base_name("some.file.ext", false) == "some.file.ext"); + REQUIRE(get_base_name("/.exe", true) == ""); + REQUIRE(get_base_name("/.exe", false) == ".exe"); + REQUIRE(get_base_name("/file.exe", true) == "file"); + REQUIRE(get_base_name("/file.exe", false) == "file.exe"); + REQUIRE(get_base_name("some.dir/file", true) == "file"); + REQUIRE(get_base_name("some.dir/file", false) == "file"); + REQUIRE(get_base_name("/some.dir/file", true) == "file"); + REQUIRE(get_base_name("/some.dir/file", false) == "file"); +#ifdef _WIN32 + REQUIRE(get_base_name("dir\\file", true) == "file"); + REQUIRE(get_base_name("some.dir\\file", true) == "file"); +#else + REQUIRE(get_base_name("dir\\file", true) == "dir\\file"); + REQUIRE(get_base_name("some.dir\\file", true) == "some"); +#endif +}