From c0f567d3232cbe165e56cb2684cda52df7cfb90f Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 1 Aug 2020 22:41:11 +0200 Subject: Move public headers to a separate include directory This is more conventional and probably best practice (since it avoids polluting the include path with non-headers), and is supported by the clang-tidy llvm-header-guard check. --- include/ingen/filesystem.hpp | 85 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 include/ingen/filesystem.hpp (limited to 'include/ingen/filesystem.hpp') diff --git a/include/ingen/filesystem.hpp b/include/ingen/filesystem.hpp new file mode 100644 index 00000000..44b9148e --- /dev/null +++ b/include/ingen/filesystem.hpp @@ -0,0 +1,85 @@ +/* + This file is part of Ingen. + Copyright 2007-2017 David Robillard + + Ingen is free software: you can redistribute it and/or modify it under the + terms of the GNU Affero General Public License as published by the Free + Software Foundation, either version 3 of the License, or any later version. + + Ingen is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU Affero General Public License for details. + + You should have received a copy of the GNU Affero General Public License + along with Ingen. If not, see . +*/ + +#ifndef INGEN_FILESYSTEM_HPP +#define INGEN_FILESYSTEM_HPP + +#define _BSD_SOURCE 1 +#define _DEFAULT_SOURCE 1 + +#include "ingen/FilePath.hpp" + +#ifdef _WIN32 +# include +# include +# define F_OK 0 +# define mkdir(path, flags) _mkdir(path) +#endif + +#include +#include +#include +#include +#include +#include +#include + +/* A minimal subset of the std::filesystem API from C++17. */ + +namespace ingen { +namespace filesystem { + +inline bool exists(const FilePath& path) +{ + return !access(path.c_str(), F_OK); +} + +inline bool is_directory(const FilePath& path) +{ + struct stat info{}; + stat(path.c_str(), &info); + return S_ISDIR(info.st_mode); +} + +inline bool create_directories(const FilePath& path) +{ + std::vector paths; + for (FilePath p = path; p != path.root_directory(); p = p.parent_path()) { + paths.emplace_back(p); + } + + for (auto p = paths.rbegin(); p != paths.rend(); ++p) { + if (mkdir(p->c_str(), 0755) && errno != EEXIST) { + return false; + } + } + + return true; +} + +inline FilePath current_path() +{ + struct Freer { void operator()(char* const ptr) { free(ptr); } }; + + std::unique_ptr cpath(realpath(".", nullptr)); + + return FilePath(cpath.get()); +} + +} // namespace filesystem +} // namespace ingen + +#endif // INGEN_FILESYSTEM_HPP -- cgit v1.2.1