From b9315017119d1650141da00f71f3a8a4dacb0d8a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Oct 2020 20:12:03 -0400 Subject: [PATCH] add utils::path_dirname() to complement utils::path_basename() --- src/utils.cpp | 16 ++++++++++++++++ src/utils.h | 7 +++++++ unittest/utils/test_utils.cpp | 15 +++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/src/utils.cpp b/src/utils.cpp index 40fc87ca01..5ae76ed00d 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -772,6 +772,22 @@ std::string utils::path_basename(const std::string &path) { return path.substr(start); } +/* ---------------------------------------------------------------------- + Return only the leading part of a path, return just the directory +------------------------------------------------------------------------- */ + +std::string utils::path_dirname(const std::string &path) { +#if defined(_WIN32) + size_t start = path.find_last_of("/\\"); +#else + size_t start = path.find_last_of("/"); +#endif + + if (start == std::string::npos) return "."; + + return path.substr(0,start); +} + /* ---------------------------------------------------------------------- join two paths ------------------------------------------------------------------------- */ diff --git a/src/utils.h b/src/utils.h index 7515f1f21b..52f7933caf 100644 --- a/src/utils.h +++ b/src/utils.h @@ -291,6 +291,13 @@ namespace LAMMPS_NS { std::string path_basename(const std::string &path); + /** Return the directory part of a path. Return "." if empty + * + * \param path file path + * \return directory name */ + + std::string path_dirname(const std::string &path); + /** Join two pathname segments * * This uses the forward slash '/' character unless LAMMPS is compiled diff --git a/unittest/utils/test_utils.cpp b/unittest/utils/test_utils.cpp index 796ce0f8c7..2c3da7b9df 100644 --- a/unittest/utils/test_utils.cpp +++ b/unittest/utils/test_utils.cpp @@ -525,11 +525,26 @@ TEST(Utils, path_basename) { #if defined(_WIN32) ASSERT_THAT(utils::path_basename("c:\\parent\\folder\\filename"), Eq("filename")); + ASSERT_THAT(utils::path_basename("folder\\"), Eq("")); + ASSERT_THAT(utils::path_basename("c:/parent/folder/filename"), Eq("filename")); #else ASSERT_THAT(utils::path_basename("/parent/folder/filename"), Eq("filename")); + ASSERT_THAT(utils::path_basename("/parent/folder/"), Eq("")); #endif } +TEST(Utils, path_dirname) +{ +#if defined(_WIN32) + ASSERT_THAT(utils::path_dirname("c:/parent/folder/filename"), Eq("c:/parent/folder")); + ASSERT_THAT(utils::path_dirname("c:\\parent\\folder\\filename"), Eq("c:\\parent\\folder")); + ASSERT_THAT(utils::path_dirname("c:filename"), Eq(".")); +#else + ASSERT_THAT(utils::path_dirname("/parent/folder/filename"), Eq("/parent/folder")); +#endif + ASSERT_THAT(utils::path_dirname("filename"), Eq(".")); +} + TEST(Utils, getsyserror) { #if defined(__linux__)