diff --git a/src/utils.cpp b/src/utils.cpp index 36675f2bd0..acdec2b77b 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -397,6 +397,51 @@ bool utils::is_double(const std::string & str) { return true; } +/* ---------------------------------------------------------------------- + strip off leading part of path, return just the filename +------------------------------------------------------------------------- */ + +std::string utils::path_basename(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) { + start = 0; + } else { + start += 1; + } + + return path.substr(start); +} + +/* ---------------------------------------------------------------------- + join two paths +------------------------------------------------------------------------- */ + +std::string utils::path_join(const std::string & a, const std::string & b) { + #if defined(_WIN32) + return fmt::format("{}\\{}", a, b); + #else + return fmt::format("{}/{}", a, b); + #endif +} + +/* ---------------------------------------------------------------------- + try to open file for reading +------------------------------------------------------------------------- */ + +bool utils::file_is_readable(const std::string & path) { + FILE * fp = fopen(path.c_str(), "r"); + if(fp) { + fclose(fp); + return true; + } + return false; +} + /* ------------------------------------------------------------------ */ extern "C" { diff --git a/src/utils.h b/src/utils.h index 37991648a6..601ec1a031 100644 --- a/src/utils.h +++ b/src/utils.h @@ -163,6 +163,28 @@ namespace LAMMPS_NS { * \return true, if string contains valid floating-point number, false otherwise */ bool is_double(const std::string & str); + + /** + * \brief Strip off leading part of path, return just the filename + * \param path file path + * \return file name + */ + std::string path_basename(const std::string & path); + + /** + * \brief Join two paths + * \param a first path + * \param b second path + * \return combined path + */ + std::string path_join(const std::string & a, const std::string & b); + + /** + * \brief Check if file exists and is readable + * \param path file path + * \return true if file exists and is readable + */ + bool file_is_readable(const std::string & path); } } diff --git a/unittest/utils/test_utils.cpp b/unittest/utils/test_utils.cpp index 0ae469f085..2d5e020533 100644 --- a/unittest/utils/test_utils.cpp +++ b/unittest/utils/test_utils.cpp @@ -182,3 +182,19 @@ TEST(Utils, strmatch_char_range) { TEST(Utils, strmatch_opt_range) { ASSERT_TRUE(utils::strmatch("rigid","^[0-9]*[p-s]igid")); } + +TEST(Utils, path_join) { +#if defined(_WIN32) + ASSERT_THAT(utils::path_join("c:\\parent\\folder", "filename"), Eq("c:\\parent\\folder\\filename")); +#else + ASSERT_THAT(utils::path_join("/parent/folder", "filename"), Eq("/parent/folder/filename")); +#endif +} + +TEST(Utils, path_basename) { +#if defined(_WIN32) + ASSERT_THAT(utils::path_basename("c:\\parent\\folder\\filename"), Eq("filename")); +#else + ASSERT_THAT(utils::path_basename("/parent/folder/filename"), Eq("filename")); +#endif +}