summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.cpp')
-rw-r--r--Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.cpp388
1 files changed, 0 insertions, 388 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.cpp
deleted file mode 100644
index 476c0c8e58e..00000000000
--- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FileSystem.cpp
+++ /dev/null
@@ -1,388 +0,0 @@
-/*************************************************************************
-** FileSystem.cpp **
-** **
-** This file is part of dvisvgm -- a fast DVI to SVG converter **
-** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> **
-** **
-** This program is free software; you can redistribute it and/or **
-** modify it under the terms of the GNU General Public License as **
-** published by the Free Software Foundation; either version 3 of **
-** the License, or (at your option) any later version. **
-** **
-** This program 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 General Public License for more details. **
-** **
-** You should have received a copy of the GNU General Public License **
-** along with this program; if not, see <http://www.gnu.org/licenses/>. **
-*************************************************************************/
-
-#include <config.h>
-#include <algorithm>
-#include <chrono>
-#include <cstdlib>
-#include <cstring>
-#include <fstream>
-#include "FileSystem.hpp"
-#include "utility.hpp"
-#include "version.hpp"
-#include "XXHashFunction.hpp"
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-
-using namespace std;
-
-#ifdef _WIN32
- #include <direct.h>
- #include "windows.hpp"
- const char *FileSystem::DEVNULL = "nul";
- const char FileSystem::PATHSEP = '\\';
- #define unlink _unlink
-#else
- #include <dirent.h>
- #include <pwd.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- const char *FileSystem::DEVNULL = "/dev/null";
- const char FileSystem::PATHSEP = '/';
-#endif
-
-
-string FileSystem::TMPDIR;
-FileSystem::TemporaryDirectory FileSystem::_tmpdir;
-
-
-/** Private wrapper function for mkdir: creates a single folder.
- * @param[in] dir folder name
- * @return true on success */
-static bool s_mkdir (const string &dirname) {
- bool success = true;
- if (!FileSystem::exists(dirname)) {
-#ifdef _WIN32
- success = (_mkdir(dirname.c_str()) == 0);
-#else
- success = (::mkdir(dirname.c_str(), 0775) == 0);
-#endif
- }
- return success;
-}
-
-
-static bool inline s_rmdir (const string &dirname) {
-#ifdef _WIN32
- return (_rmdir(dirname.c_str()) == 0);
-#else
- return (::rmdir(dirname.c_str()) == 0);
-#endif
-}
-
-
-bool FileSystem::remove (const string &fname) {
- return unlink(fname.c_str()) == 0;
-}
-
-
-/** Copies a file.
- * @param[in] src path of file to copy
- * @param[in] dest path of target file
- * @param[in] remove_src remove file 'src' if true
- * @return true on success */
-bool FileSystem::copy (const string &src, const string &dest, bool remove_src) {
- ifstream ifs(src, ios::in|ios::binary);
- ofstream ofs(dest, ios::out|ios::binary);
- if (ifs && ofs) {
- ofs << ifs.rdbuf();
- if (!ifs.fail() && !ofs.fail() && remove_src) {
- ofs.close();
- ifs.close();
- return remove(src);
- }
- else
- return !remove_src;
- }
- return false;
-}
-
-
-bool FileSystem::rename (const string &oldname, const string &newname) {
- return ::rename(oldname.c_str(), newname.c_str()) == 0;
-}
-
-
-uint64_t FileSystem::filesize (const string &fname) {
-#ifdef _WIN32
- // unfortunately, stat doesn't work properly under Windows
- // so we have to use this freaky code
- WIN32_FILE_ATTRIBUTE_DATA attr;
- GetFileAttributesExA(fname.c_str(), GetFileExInfoStandard, &attr);
- return (static_cast<uint64_t>(attr.nFileSizeHigh) << (8*sizeof(attr.nFileSizeLow))) | attr.nFileSizeLow;
-#else
- struct stat attr;
- return (stat(fname.c_str(), &attr) == 0) ? attr.st_size : 0;
-#endif
-}
-
-
-string FileSystem::ensureForwardSlashes (string path) {
-#ifdef _WIN32
- std::replace(path.begin(), path.end(), PATHSEP, '/');
-#endif
- return path;
-}
-
-
-string FileSystem::getcwd () {
- char buf[1024];
-#ifdef _WIN32
- return ensureForwardSlashes(_getcwd(buf, 1024));
-#else
- return ::getcwd(buf, 1024);
-#endif
-}
-
-
-/** Changes the work directory.
- * @param[in] dir path to new work directory
- * @return true on success */
-bool FileSystem::chdir (const std::string &dirname) {
- bool success = false;
- if (const char *cdirname = dirname.c_str()) {
-#ifdef _WIN32
- success = (_chdir(cdirname) == 0);
-#else
- success = (::chdir(cdirname) == 0);
-#endif
- }
- return success;
-}
-
-
-/** Returns the user's home directory. */
-const char* FileSystem::userdir () {
-#ifdef _WIN32
- const char *drive=getenv("HOMEDRIVE");
- const char *path=getenv("HOMEPATH");
- if (drive && path) {
- static string ret = string(drive)+path;
- if (!ret.empty())
- return ret.c_str();
- }
- return nullptr;
-#else
- const char *dir=getenv("HOME");
- if (!dir) {
- if (const char *user=getenv("USER")) {
- if (struct passwd *pw=getpwnam(user))
- dir = pw->pw_dir;
- }
- }
- return dir;
-#endif
-}
-
-
-/** Returns the path of the temporary folder. */
-string FileSystem::tmpdir () {
- if (_tmpdir.path().empty()) {
- string basedir;
- if (!TMPDIR.empty())
- basedir = TMPDIR;
- else {
-#ifdef _WIN32
- char buf[MAX_PATH];
- if (GetTempPath(MAX_PATH, buf))
- basedir = ensureForwardSlashes(buf);
- else
- basedir = ".";
-#else
- if (const char *path = getenv("TMPDIR"))
- basedir = path;
- else
- basedir = "/tmp";
-#endif
- if (basedir.back() == '/')
- basedir.pop_back();
- }
- _tmpdir = TemporaryDirectory(basedir, PROGRAM_NAME);
- }
- return _tmpdir.path();
-}
-
-
-/** Creates a new folder relative to the current work directory. If necessary,
- * the parent folders are also created.
- * @param[in] dir single folder name or path to folder
- * @return true if folder(s) could be created */
-bool FileSystem::mkdir (const string &dirname) {
- bool success = false;
- if (const char *cdirname = dirname.c_str()) {
- success = true;
- const string dirstr = ensureForwardSlashes(util::trim(cdirname));
- for (size_t pos=1; success && (pos = dirstr.find('/', pos)) != string::npos; pos++)
- success &= s_mkdir(dirstr.substr(0, pos));
- success &= s_mkdir(dirstr);
- }
- return success;
-}
-
-
-/** Removes a directory and its contents.
- * @param[in] dirname path to directory
- * @return true on success */
-bool FileSystem::rmdir (const string &dirname) {
- bool ok = false;
- if (isDirectory(dirname)) {
- ok = true;
-#ifdef _WIN32
- string pattern = dirname + "/*";
- WIN32_FIND_DATA data;
- HANDLE h = FindFirstFile(pattern.c_str(), &data);
- bool ready = (h == INVALID_HANDLE_VALUE);
- while (!ready && ok) {
- const char *fname = data.cFileName;
- string path = dirname + "/" + fname;
- if (isDirectory(path)) {
- if (strcmp(fname, ".") != 0 && strcmp(fname, "..") != 0)
- ok = rmdir(path) && s_rmdir(path);
- }
- else if (isFile(path))
- ok = remove(path);
- else
- ok = false;
- ready = !FindNextFile(h, &data);
- }
- FindClose(h);
-#else
- if (DIR *dir = opendir(dirname.c_str())) {
- struct dirent *ent;
- while ((ent = readdir(dir)) && ok) {
- const char *fname = ent->d_name;
- string path = dirname + "/" + fname;
- if (isDirectory(path)) {
- if (strcmp(fname, ".") != 0 && strcmp(fname, "..") != 0)
- ok = rmdir(path) && s_rmdir(path);
- }
- else if (isFile(path))
- ok = remove(path);
- else
- ok = false;
- }
- closedir(dir);
- }
-#endif
- ok = s_rmdir(dirname);
- }
- return ok;
-}
-
-
-/** Checks if a file or directory exits. */
-bool FileSystem::exists (const string &fname) {
- if (const char *cfname = fname.c_str()) {
-
-#ifdef _WIN32
- return GetFileAttributes(cfname) != INVALID_FILE_ATTRIBUTES;
-#else
- struct stat attr;
- return stat(cfname, &attr) == 0;
-#endif
- }
- return false;
-}
-
-
-/** Returns true if 'fname' references a directory. */
-bool FileSystem::isDirectory (const string &fname) {
- if (const char *cfname = fname.c_str()) {
-#ifdef _WIN32
- auto attr = GetFileAttributes(cfname);
- return attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY);
-#else
- struct stat attr;
- return stat(cfname, &attr) == 0 && S_ISDIR(attr.st_mode);
-#endif
- }
- return false;
-}
-
-
-/** Returns true if 'fname' references a file. */
-bool FileSystem::isFile (const string &fname) {
- if (const char *cfname = fname.c_str()) {
-#ifdef _WIN32
- ifstream ifs(cfname);
- return (bool)ifs;
-#else
- struct stat attr;
- return stat(cfname, &attr) == 0 && S_ISREG(attr.st_mode);
-#endif
- }
- return false;
-}
-
-
-int FileSystem::collect (const std::string &dirname, vector<string> &entries) {
- entries.clear();
-#ifdef _WIN32
- string pattern = dirname + "/*";
- WIN32_FIND_DATA data;
- HANDLE h = FindFirstFile(pattern.c_str(), &data);
- bool ready = (h == INVALID_HANDLE_VALUE);
- while (!ready) {
- string fname = data.cFileName;
- string path = dirname+"/"+fname;
- string typechar = isFile(path) ? "f" : isDirectory(path) ? "d" : "?";
- if (fname != "." && fname != "..")
- entries.emplace_back(typechar+fname);
- ready = !FindNextFile(h, &data);
- }
- FindClose(h);
-#else
- if (DIR *dir = opendir(dirname.c_str())) {
- struct dirent *ent;
- while ((ent = readdir(dir))) {
- string fname = ent->d_name;
- string path = dirname+"/"+fname;
- string typechar = isFile(path) ? "f" : isDirectory(path) ? "d" : "?";
- if (fname != "." && fname != "..")
- entries.emplace_back(typechar+fname);
- }
- closedir(dir);
- }
-#endif
- return entries.size();
-}
-
-
-/** Creates a temporary directory in a given folder.
- * @param[in] folder folder path in which the directory is to be created
- * @param[in] prefix initial string of the directory name */
-FileSystem::TemporaryDirectory::TemporaryDirectory (const std::string &folder, string prefix) {
- using namespace std::chrono;
- auto now = system_clock::now().time_since_epoch();
- auto now_ms = duration_cast<milliseconds>(now).count();
- auto hash = XXH64HashFunction(to_string(now_ms)).digestValue();
- if (!prefix.empty() && prefix.back() != '-')
- prefix += "-";
- for (int i=0; i < 10 && _path.empty(); i++) {
- hash++;
- stringstream oss;
- oss << folder << '/' << prefix << hex << hash;
- if (exists(oss.str()))
- continue;
- if (s_mkdir(oss.str()))
- _path = oss.str() + "/";
- else
- break;
- }
-}
-
-
-FileSystem::TemporaryDirectory::~TemporaryDirectory () {
- if (!_path.empty())
- s_rmdir(_path);
-}