diff --git a/simplecpp.cpp b/simplecpp.cpp index 7774fd29..67ea3490 100644 --- a/simplecpp.cpp +++ b/simplecpp.cpp @@ -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] == '/')) @@ -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 } } diff --git a/test.cpp b/test.cpp index 26e3b95b..3922cb38 100644 --- a/test.cpp +++ b/test.cpp @@ -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