Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions simplecpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2450,7 +2450,7 @@ namespace simplecpp {

bool isAbsolutePath(const std::string &path)
{
#ifdef SIMPLECPP_WINDOWS
#if defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MSYS__)
// C:\\path\\file
// C:/path/file
if (path.length() >= 3 && std::isalpha(path[0]) && path[1] == ':' && (path[2] == '\\' || path[2] == '/'))
Expand All @@ -2460,10 +2460,12 @@ namespace simplecpp {
// //host/path/file
if (path.length() >= 2 && (path[0] == '\\' || path[0] == '/') && (path[1] == '\\' || path[1] == '/'))
return true;
#endif

return false;
#else
#if !defined(_WIN32) || defined(__MINGW32__)
return !path.empty() && path[0] == '/';
#else
return false;
#endif
}
}
Expand Down
44 changes: 26 additions & 18 deletions test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3257,36 +3257,44 @@ static void safe_api()
}

static void isAbsolutePath() {
#ifdef _WIN32
ASSERT_EQUALS(true, simplecpp::isAbsolutePath("C:\\foo\\bar"));
ASSERT_EQUALS(true, simplecpp::isAbsolutePath("C:/foo/bar"));
ASSERT_EQUALS(true, simplecpp::isAbsolutePath("\\\\foo\\bar"));
#if defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MSYS__)
constexpr bool supportsWin = true;
#else
constexpr bool supportsWin = false;
#endif

#if !defined(_WIN32) || defined(__MINGW32__)
constexpr bool supportsUnx = true;
#else
constexpr bool supportsUnx = false;
#endif

// valid Windows paths
ASSERT_EQUALS(supportsWin, simplecpp::isAbsolutePath("C:\\foo\\bar"));
ASSERT_EQUALS(supportsWin, simplecpp::isAbsolutePath("C:/foo/bar"));
ASSERT_EQUALS(supportsWin, simplecpp::isAbsolutePath("\\\\foo\\bar"));

// valid Unix paths
ASSERT_EQUALS(supportsUnx, simplecpp::isAbsolutePath("/foo/bar"));
ASSERT_EQUALS(supportsUnx, simplecpp::isAbsolutePath("/"));

// valid Windows and Unix paths
ASSERT_EQUALS(supportsWin || supportsUnx, simplecpp::isAbsolutePath("//host/foo/bar"));

// invalid paths
ASSERT_EQUALS(false, simplecpp::isAbsolutePath("foo\\bar"));
ASSERT_EQUALS(false, simplecpp::isAbsolutePath("foo/bar"));
ASSERT_EQUALS(false, simplecpp::isAbsolutePath("foo.cpp"));
ASSERT_EQUALS(false, simplecpp::isAbsolutePath("C:foo.cpp"));
ASSERT_EQUALS(false, simplecpp::isAbsolutePath("C:foo\\bar.cpp"));
ASSERT_EQUALS(false, simplecpp::isAbsolutePath("bar.cpp"));
//ASSERT_EQUALS(true, simplecpp::isAbsolutePath("\\")); // TODO
ASSERT_EQUALS(false, simplecpp::isAbsolutePath("0:\\foo\\bar"));
ASSERT_EQUALS(false, simplecpp::isAbsolutePath("0:/foo/bar"));
ASSERT_EQUALS(false, simplecpp::isAbsolutePath("\\foo\\bar"));

//ASSERT_EQUALS(true, simplecpp::isAbsolutePath("\\")); // TODO
//ASSERT_EQUALS(false, simplecpp::isAbsolutePath("\\\\")); // TODO
//ASSERT_EQUALS(false, simplecpp::isAbsolutePath("//")); // TODO
ASSERT_EQUALS(false, simplecpp::isAbsolutePath("/foo/bar"));
ASSERT_EQUALS(false, simplecpp::isAbsolutePath("/"));
#else
ASSERT_EQUALS(true, simplecpp::isAbsolutePath("/foo/bar"));
ASSERT_EQUALS(true, simplecpp::isAbsolutePath("/"));
ASSERT_EQUALS(true, simplecpp::isAbsolutePath("//host/foo/bar"));

ASSERT_EQUALS(false, simplecpp::isAbsolutePath("foo/bar"));
ASSERT_EQUALS(false, simplecpp::isAbsolutePath("foo.cpp"));
ASSERT_EQUALS(false, simplecpp::isAbsolutePath("C:\\foo\\bar"));
ASSERT_EQUALS(false, simplecpp::isAbsolutePath("C:/foo/bar"));
ASSERT_EQUALS(false, simplecpp::isAbsolutePath("\\\\foo\\bar"));
#endif
}

// crashes detected by fuzzer
Expand Down