diff src/core/filesystem.cc @ 81:9b2b41f83a5e

boring: mass rename to cc because this is a very unix-y project, it makes more sense to use the 'cc' extension
author Paper <mrpapersonic@gmail.com>
date Mon, 23 Oct 2023 12:07:27 -0400
parents src/core/filesystem.cpp@3364fadc8a36
children c8c72278f6fd
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/filesystem.cc	Mon Oct 23 12:07:27 2023 -0400
@@ -0,0 +1,139 @@
+#ifdef WIN32
+#	include <shlobj.h>
+#elif defined(MACOSX)
+#	include "sys/osx/filesystem.h"
+#elif defined(__linux__)
+#	include <pwd.h>
+#	include <sys/types.h>
+#endif
+
+#ifdef WIN32
+#	define DELIM "\\"
+#else
+#	define DELIM "/"
+#	include <errno.h>
+#	include <unistd.h>
+#	include <sys/stat.h>
+#endif
+
+#include "core/filesystem.h"
+#include "core/config.h"
+#include "core/strings.h"
+#include <limits.h>
+
+namespace Filesystem {
+
+Path::Path() {
+	_path = "";
+}
+Path::Path(const std::string& path) {
+	_path = path;
+}
+Path::Path(const Path& path) {
+	_path = path.GetPath();
+}
+
+bool Path::CreateDirectories() const {
+	std::string temp = "";
+	size_t start;
+	size_t end = 0;
+	temp.append(_path.substr(0, _path.find_first_not_of(DELIM, end)));
+
+	while ((start = _path.find_first_not_of(DELIM, end)) != std::string::npos) {
+		end = _path.find(DELIM, start);
+		temp.append(_path.substr(start, end - start));
+#ifdef WIN32
+		if (!CreateDirectoryW(Strings::ToWstring(temp).c_str(), NULL) && GetLastError() == ERROR_PATH_NOT_FOUND)
+			/* ERROR_PATH_NOT_FOUND should NOT happen here */
+			return false;
+#else
+		struct stat st;
+		if (stat(temp.c_str(), &st) == -1)
+			mkdir(temp.c_str(), 0755);
+#endif
+		temp.append(DELIM);
+	}
+	return true;
+}
+
+bool Path::Exists() const {
+#if WIN32
+	std::wstring buf = Strings::ToWstring(_path);
+	return GetFileAttributesW(buf.c_str()) != INVALID_FILE_ATTRIBUTES;
+#else
+	struct stat st;
+	return stat(_path.c_str(), &st) == 0;
+#endif
+}
+
+std::string Path::Basename() const {
+	unsigned long long pos = _path.find_last_of(DELIM);
+	return pos != std::string::npos ? _path.substr(pos + 1, _path.length()) : "";
+}
+
+std::string Path::Stem() const {
+	std::string basename = Basename();
+	unsigned long long pos = basename.find_last_of(".");
+	return pos != std::string::npos ? basename.substr(0, pos) : "";
+}
+
+std::string Path::Extension() const {
+	std::string basename = Basename();
+	unsigned long long pos = basename.find_last_of(".");
+	return pos != std::string::npos ? basename.substr(pos + 1, basename.length()) : "";
+}
+
+Path Path::GetParent() const {
+	return _path.substr(0, _path.find_last_of(DELIM));
+}
+
+void Path::SetPath(const std::string& path) {
+	_path = path;
+}
+
+std::string Path::GetPath() const {
+	return _path;
+}
+
+Path GetDotPath(void) {
+	std::string ret = "";
+#ifdef WIN32
+	std::wstring buf(MAX_PATH, '\0');
+	if (SHGetFolderPathAndSubDirW(NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, CONFIG_WDIR, &buf.front()) ==
+	    S_OK) {
+		buf.resize(buf.find('\0'));
+		ret += Strings::ToUtf8String(buf);
+	}
+#elif defined(MACOSX)
+	ret += osx::GetApplicationSupportDirectory();
+	ret += DELIM CONFIG_DIR;
+#else // just assume POSIX
+	if (getenv("HOME") != NULL)
+		ret += getenv("HOME");
+#	ifdef __linux__
+	else
+		ret += getpwuid(getuid())->pw_dir;
+#	endif // __linux__
+	if (!ret.empty())
+		ret += DELIM ".config" DELIM CONFIG_DIR;
+#endif     // !WIN32 && !MACOSX
+	return ret;
+}
+
+Path GetConfigPath(void) {
+	std::string ret = "";
+	ret += GetDotPath().GetPath();
+	if (!ret.empty())
+		ret += DELIM CONFIG_NAME;
+	return ret;
+}
+
+Path GetAnimeDBPath(void) {
+	std::string ret = "";
+	ret += GetDotPath().GetPath();
+	if (!ret.empty())
+		ret += DELIM "anime" DELIM "db.json";
+	return ret;
+}
+
+} // namespace Filesystem