summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.cpp')
-rw-r--r--Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.cpp287
1 files changed, 0 insertions, 287 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.cpp
deleted file mode 100644
index 3358d5c273c..00000000000
--- a/Build/source/texk/dvisvgm/dvisvgm-src/src/FileFinder.cpp
+++ /dev/null
@@ -1,287 +0,0 @@
-/*************************************************************************
-** FileFinder.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>
-#ifdef MIKTEX
- #include "MiKTeXCom.hpp"
- #include "utility.hpp"
-#else
- #ifdef KPSE_CXX_UNSAFE
- extern "C" {
- #endif
- #include <kpathsea/kpathsea.h>
- #ifdef KPSE_CXX_UNSAFE
- }
- #endif
-#endif
-
-#include <cstdlib>
-#include <fstream>
-#include <map>
-#include <set>
-#include "FileFinder.hpp"
-#include "FilePath.hpp"
-#include "FileSystem.hpp"
-#include "FontMap.hpp"
-#include "Message.hpp"
-#include "MessageException.hpp"
-#include "Process.hpp"
-
-std::string FileFinder::_argv0;
-std::string FileFinder::_progname;
-std::string FileFinder::_pathbuf;
-bool FileFinder::_enableMktex = false;
-
-
-/** Constructs a new file finder.
- * @param[in] argv0 argv[0] of main() function
- * @param[in] progname name of application using the FileFinder
- * @param[in] enable_mktexmf if true, tfm and mf file generation is activated */
-FileFinder::FileFinder () {
- addLookupDir("."); // always lookup files in the current working directory
-#ifdef MIKTEX
- _miktex = util::make_unique<MiKTeXCom>();
-#else
- kpse_set_program_name(_argv0.c_str(), _progname.c_str());
- // enable tfm and mf generation (actually invoked by calls of kpse_make_tex)
- kpse_set_program_enabled(kpse_tfm_format, 1, kpse_src_env);
- kpse_set_program_enabled(kpse_mf_format, 1, kpse_src_env);
- kpse_make_tex_discard_errors = true; // suppress messages from mktexFOO tools
-#endif
-}
-
-
-void FileFinder::init (const std::string &argv0, const std::string &progname, bool enable_mktexmf) {
- _argv0 = argv0;
- _progname = progname;
- _enableMktex = enable_mktexmf;
-}
-
-
-FileFinder& FileFinder::instance () {
- static FileFinder instance;
- return instance;
-}
-
-
-/** Returns the version string of the underlying file searching library (kpathsea, MiKTeX) */
-std::string FileFinder::version () const {
-#ifdef MIKTEX
- return _miktex->getVersion();
-#else
- if (const char *v = strrchr(KPSEVERSION, ' '))
- return (std::string(KPSEVERSION).substr(0, 9) == "kpathsea ") ? v+1 : KPSEVERSION;
- if (strlen(KPSEVERSION) > 0)
- return KPSEVERSION;
-#endif
- return "unknown";
-}
-
-
-void FileFinder::addLookupDir (const std::string &path) {
- FilePath filepath(path);
- _additionalDirs.insert(filepath.absolute());
-}
-
-
-/** Determines filetype by the filename extension and calls kpse_find_file
- * to actually look up the file.
- * @param[in] fname name of file to look up
- * @param[in] ftype expected file format of file fname; if 0, it's derived from the filename suffix
- * @return file path on success, 0 otherwise */
-const char* FileFinder::findFile (const std::string &fname, const char *ftype) const {
- if (fname.empty())
- return nullptr;
-
- // try to lookup the file in the additionally specified directories
- for (const std::string &dir : _additionalDirs) {
- _pathbuf = dir+"/"+fname;
- if (FileSystem::exists(_pathbuf))
- return _pathbuf.c_str();
- }
- std::string ext;
- if (ftype)
- ext = ftype;
- else {
- size_t pos = fname.rfind('.');
- if (pos == std::string::npos)
- return nullptr; // no extension and no file type => no search
- ext = fname.substr(pos+1);
- }
-
-#ifdef _WIN32
- if (ext == "dll" || ext == "exe")
- return lookupExecutable(fname);
-#ifdef MIKTEX
- else if (ext == "cmap") {
- // The MiKTeX SDK doesn't support the lookup of files without suffix (yet), thus
- // it's not possible to find cmap files which usually don't have a suffix. In order
- // to work around this, we try to lookup the files by calling kpsewhich.
- Process process("kpsewhich", "-format=cmap "+fname);
- process.run(&_pathbuf);
- _pathbuf = util::trim(_pathbuf);
- return _pathbuf.empty() ? nullptr : _pathbuf.c_str();
- }
- try {
- return _miktex->findFile(fname.c_str());
- }
- catch (const MessageException &e) {
- return nullptr;
- }
-#endif // MIKTEX
-#endif // _WIN32
-#ifndef MIKTEX
- static std::map<std::string, kpse_file_format_type> types = {
- {"tfm", kpse_tfm_format},
- {"pfb", kpse_type1_format},
- {"vf", kpse_vf_format},
- {"mf", kpse_mf_format},
- {"ttc", kpse_truetype_format},
- {"ttf", kpse_truetype_format},
- {"otf", kpse_opentype_format},
- {"map", kpse_fontmap_format},
- {"cmap", kpse_cmap_format},
- {"sty", kpse_tex_format},
- {"enc", kpse_enc_format},
- {"pro", kpse_tex_ps_header_format},
- {"sfd", kpse_sfd_format},
- {"eps", kpse_pict_format},
- {"png", kpse_pict_format},
- {"jpg", kpse_pict_format},
- {"jpeg", kpse_pict_format},
- {"svg", kpse_pict_format},
- {"pdf", kpse_tex_format},
- };
- auto it = types.find(ext);
- if (it == types.end())
- return nullptr;
-
- if (char *path = kpse_find_file(fname.c_str(), it->second, 0)) {
- // In the current version of libkpathsea, each call of kpse_find_file produces
- // a memory leak since the path buffer is not freed. I don't think we can do
- // anything against it here...
- _pathbuf = path;
- std::free(path);
- return _pathbuf.c_str();
- }
- return nullptr;
-#endif // !MIKTEX
-}
-
-
-/** Checks whether the given file is mapped to a different name and if the
- * file can be found under this name.
- * @param[in] fname name of file to look up
- * @return file path on success, 0 otherwise */
-const char* FileFinder::findMappedFile (std::string fname) const {
- size_t pos = fname.rfind('.');
- if (pos == std::string::npos)
- return nullptr;
- const std::string ext = fname.substr(pos+1); // file extension
- const std::string base = fname.substr(0, pos);
- if (const FontMap::Entry *entry = FontMap::instance().lookup(base)) {
- const char *path=nullptr;
- if (entry->fontname.find('.') != std::string::npos) // does the mapped filename has an extension?
- path = findFile(entry->fontname, nullptr); // look for that file
- else { // otherwise, use extension of unmapped file
- fname = entry->fontname + "." + ext;
- (path = findFile(fname, nullptr)) || (path = mktex(fname));
- }
- return path;
- }
- return nullptr;
-}
-
-
-/** Runs external mktexFOO tool to create missing tfm or mf file.
- * @param[in] fname name of file to build
- * @return file path on success, 0 otherwise */
-const char* FileFinder::mktex (const std::string &fname) const {
- size_t pos = fname.rfind('.');
- if (!_enableMktex || pos == std::string::npos)
- return nullptr;
-
- std::string ext = fname.substr(pos+1); // file extension
- if (ext != "tfm" && ext != "mf")
- return nullptr;
-
- const char *path = nullptr;
-#ifdef MIKTEX
- // maketfm and makemf are located in miktex/bin which is in the search PATH
- std::string toolname = (ext == "tfm" ? "miktex-maketfm" : "miktex-makemf");
- system((toolname+".exe "+fname).c_str());
- path = findFile(fname, nullptr);
-#else
- kpse_file_format_type type = (ext == "tfm" ? kpse_tfm_format : kpse_mf_format);
- path = kpse_make_tex(type, fname.c_str());
-#endif
- return path;
-}
-
-
-/** Searches a file in the TeX directory tree.
- * If the file doesn't exist, maximal two further steps are applied
- * (if "extended" is true):
- * - checks whether the filename is mapped to a different name and returns
- * the path to that name
- * - in case of tfm or mf files: invokes the external mktextfm/mktexmf tool
- * to create the missing file
- * @param[in] fname name of file to look up
- * @param[in] ftype type/format of file to look up
- * @param[in] extended if true, use fontmap lookup and mktexFOO calls
- * @return path to file on success, 0 otherwise */
-const char* FileFinder::lookup (const std::string &fname, const char *ftype, bool extended) const {
- const char *path;
- if ((path = findFile(fname, ftype)) || (extended && ((path = findMappedFile(fname)) || (path = mktex(fname)))))
- return path;
- return nullptr;
-}
-
-
-/** Looks up the location of an executable file.
- * @param[in] fname name of file to look up
- * @param[in] addSuffix if true, ".exe" is appended to the given filename (Windows only)
- * @return absolute path of file or nullptr if not found */
-const char* FileFinder::lookupExecutable (const std::string &fname, bool addSuffix) const {
-#ifdef MIKTEX
- _pathbuf = _miktex->getBinDir() + "/" + fname;
- if (addSuffix)
- _pathbuf += ".exe";
- if (FileSystem::exists(_pathbuf))
- return _pathbuf.c_str();
- try {
- return _miktex->findFile(fname.c_str());
- }
- catch (...) {
- }
-#else
- // lookup executables in directory where dvisvgm is located
- if (const char *path = kpse_var_value("SELFAUTOLOC")) {
- _pathbuf = std::string(path) + "/" + fname;
-#ifdef _WIN32
- if (addSuffix)
- _pathbuf += ".exe";
-#endif
- if (FileSystem::exists(_pathbuf))
- return _pathbuf.c_str();
- }
-#endif // !MIKTEX
- return nullptr;
-}