Skip to content

Commit 8b51faf

Browse files
author
Daniel Kroening
committed
fix get_base_name
1 parent d42054a commit 8b51faf

File tree

3 files changed

+53
-16
lines changed

3 files changed

+53
-16
lines changed

src/util/get_base_name.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,31 @@ Author: CM Wintersteiger
88
99
\*******************************************************************/
1010

11-
1211
#include "get_base_name.h"
1312

1413
/// cleans a filename from path and extension
1514
/// \par parameters: a string
1615
/// \return a new string
1716
std::string get_base_name(const std::string &in, bool strip_suffix)
1817
{
19-
size_t r=std::string::npos;
20-
if(strip_suffix)
21-
r=in.rfind('.', in.length()-1);
22-
if(r==std::string::npos)
23-
r=in.length();
18+
#ifdef _WIN32
19+
// Windows now allows both '/' and '\\'
20+
const std::size_t slash_pos = in.find_last_of("\\/");
21+
#else
22+
const std::size_t slash_pos = in.rfind('/');
23+
#endif
2424

25-
size_t f=in.rfind('/', in.length()-1);
26-
if(f==std::string::npos)
27-
f=0;
25+
std::size_t start_pos =
26+
(slash_pos == std::string::npos) ? 0 : slash_pos + 1;
2827

29-
size_t fw=in.rfind('\\', in.length()-1);
30-
if(fw==std::string::npos)
31-
fw=0;
28+
std::size_t char_count = std::string::npos;
3229

33-
f = (fw>f)?fw:f;
30+
if(strip_suffix)
31+
{
32+
std::size_t dot_pos = in.rfind('.');
33+
if(dot_pos != std::string::npos && dot_pos >= start_pos)
34+
char_count = dot_pos - start_pos;
35+
}
3436

35-
if(in[f]=='/' || in[f]=='\\')
36-
f++;
37-
return in.substr(f, r-f);
37+
return std::string(in, start_pos, char_count);
3838
}

unit/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ SRC += unit_tests.cpp \
2828
solvers/refinement/string_refinement/union_find_replace.cpp \
2929
util/expr.cpp \
3030
util/expr_cast/expr_cast.cpp \
31+
util/get_base_name.cpp \
3132
util/graph.cpp \
3233
util/irep.cpp \
3334
util/irep_sharing.cpp \

unit/util/get_base_name.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*******************************************************************\
2+
3+
Module: Unit test for get_base_name.h
4+
5+
Author: Daniel Kroening
6+
7+
\*******************************************************************/
8+
9+
#include <testing-utils/catch.hpp>
10+
11+
#include <util/get_base_name.h>
12+
13+
TEST_CASE("get_base_name basic functionality", "[core][util][get_base_name]")
14+
{
15+
REQUIRE(get_base_name(".exe", true) == "");
16+
REQUIRE(get_base_name(".exe", false) == ".exe");
17+
REQUIRE(get_base_name(".", true) == "");
18+
REQUIRE(get_base_name(".", false) == ".");
19+
REQUIRE(get_base_name("some.file.ext", true) == "some.file");
20+
REQUIRE(get_base_name("some.file.ext", false) == "some.file.ext");
21+
REQUIRE(get_base_name("/.exe", true) == "");
22+
REQUIRE(get_base_name("/.exe", false) == ".exe");
23+
REQUIRE(get_base_name("/file.exe", true) == "file");
24+
REQUIRE(get_base_name("/file.exe", false) == "file.exe");
25+
REQUIRE(get_base_name("some.dir/file", true) == "file");
26+
REQUIRE(get_base_name("some.dir/file", false) == "file");
27+
REQUIRE(get_base_name("/some.dir/file", true) == "file");
28+
REQUIRE(get_base_name("/some.dir/file", false) == "file");
29+
#ifdef _WIN32
30+
REQUIRE(get_base_name("dir\\file", true) == "file");
31+
REQUIRE(get_base_name("some.dir\\file", true) == "file");
32+
#else
33+
REQUIRE(get_base_name("dir\\file", true) == "dir\\file");
34+
REQUIRE(get_base_name("some.dir\\file", true) == "some");
35+
#endif
36+
}

0 commit comments

Comments
 (0)