]> git.lyx.org Git - features.git/blobdiff - src/support/filetools.cpp
Remove redundant declarations reported by GCC with -Wredundant-decls option
[features.git] / src / support / filetools.cpp
index a34ee225f9a1dea000c8e692bfc4d2e98d851787..41e508b47f9a54dbde32d604b2b3c4099b5a73bf 100644 (file)
 
 #include <config.h>
 
+#include "support/filetools.h"
+
 #include "LyX.h"
 #include "LyXRC.h"
 
-#include "support/filetools.h"
-
 #include "support/convert.h"
 #include "support/debug.h"
 #include "support/environment.h"
@@ -42,7 +42,6 @@
 #include <QDir>
 
 #include "support/lassert.h"
-#include "support/regex.h"
 
 #include <fcntl.h>
 #ifdef HAVE_MAGIC_H
@@ -59,6 +58,7 @@
 
 #include <utility>
 #include <fstream>
+#include <regex>
 #include <sstream>
 #include <vector>
 
@@ -110,7 +110,7 @@ bool isBinaryFile(FileName const & filename)
        magic_t magic_cookie = magic_open(MAGIC_MIME_ENCODING);
        if (magic_cookie) {
                bool detected = true;
-               if (magic_load(magic_cookie, NULL) != 0) {
+               if (magic_load(magic_cookie, nullptr) != 0) {
                        LYXERR(Debug::FILES, "isBinaryFile: "
                                "Could not load magic database - "
                                << magic_error(magic_cookie));
@@ -335,12 +335,16 @@ FileName const fileSearch(string const & path, string const & name,
 //   2) build_lyxdir (if not empty)
 //   3) system_lyxdir
 FileName const libFileSearch(string const & dir, string const & name,
-                          string const & ext, search_mode mode)
+                          string const & ext, search_mode mode,
+                          bool const only_global)
 {
-       FileName fullname = fileSearch(addPath(package().user_support().absFileName(), dir),
-                                    name, ext, mode);
-       if (!fullname.empty())
-               return fullname;
+       FileName fullname;
+       if (!only_global) {
+               fullname = fileSearch(addPath(package().user_support().absFileName(), dir),
+                                            name, ext, mode);
+               if (!fullname.empty())
+                       return fullname;
+       }
 
        if (!package().build_support().empty())
                fullname = fileSearch(addPath(package().build_support().absFileName(), dir),
@@ -442,7 +446,7 @@ string const commandPrep(string const & command_in)
 }
 
 
-FileName const tempFileName(FileName tempdir, string const & mask, bool const dir)
+FileName const tempFileName(FileName const & tempdir, string const & mask, bool const dir)
 {
        return tempFileName(TempFile(tempdir, mask).name(), dir);
 }
@@ -497,8 +501,7 @@ void removeTempFile(FileName const & fn)
                return;
 
        string const abs = fn.absFileName();
-       if (tmp_names_.find(abs) != tmp_names_.end())
-               tmp_names_.erase(abs);
+       tmp_names_.erase(abs);
        fn.removeFile();
 }
 
@@ -655,6 +658,19 @@ string const addName(string const & path, string const & fname)
 }
 
 
+string const addPathName(std::string const & path, std::string const & fname)
+{
+       string const pathpart = onlyPath(fname);
+       string const namepart = onlyFileName(fname);
+       string newpath = path;
+       if (!pathpart.empty())
+               newpath = addPath(newpath, pathpart);
+       if (!namepart.empty())
+               newpath = addName(newpath, namepart);
+       return newpath;
+}
+
+
 // Strips path from filename
 string const onlyFileName(string const & fname)
 {
@@ -671,8 +687,12 @@ string const onlyFileName(string const & fname)
 
 
 // Search the string for ${VAR} and $VAR and replace VAR using getenv.
+// If VAR does not exist, ${VAR} and $VAR are left as is in the string.
 string const replaceEnvironmentPath(string const & path)
 {
+       if (!contains(path, '$'))
+               return path;
+
        // ${VAR} is defined as
        // $\{[A-Za-z_][A-Za-z_0-9]*\}
        static string const envvar_br = "[$]\\{([A-Za-z_][A-Za-z_0-9]*)\\}";
@@ -690,14 +710,23 @@ string const replaceEnvironmentPath(string const & path)
                string result = path;
                while (1) {
                        smatch what;
+                       bool brackets = true;
                        if (!regex_match(result, what, envvar_br_re)) {
+                               brackets = false;
                                if (!regex_match(result, what, envvar_re))
                                        break;
                        }
                        string env_var = getEnv(what.str(2));
+                       if (env_var.empty()) {
+                               // temporarily use alert/bell (0x07) in place of $
+                               if (brackets)
+                                       env_var = "\a{" + what.str(2) + '}';
+                               else
+                                       env_var = "\a" + what.str(2);
+                       }
                        result = what.str(1) + env_var + what.str(3);
                }
-               return result;
+               return subst(result, '\a', '$');
        } catch (exception const & e) {
                LYXERR0("Something is very wrong: " << e.what());
                return path;
@@ -1094,46 +1123,48 @@ cmd_ret const runCommand(string const & cmd)
 
        // (Claus Hentschel) Check if popen was successful ;-)
        if (!inf) {
-               lyxerr << "RunCommand:: could not start child process" << endl;
-               return make_pair(-1, string());
+               lyxerr << "RunCommand: could not start child process" << endl;
+               return { false, string() };
        }
 
-       string ret;
+       string result;
        int c = fgetc(inf);
        while (c != EOF) {
-               ret += static_cast<char>(c);
+               result += static_cast<char>(c);
                c = fgetc(inf);
        }
 
 #if defined (_WIN32)
        WaitForSingleObject(process.hProcess, INFINITE);
        DWORD pret;
-       if (!GetExitCodeProcess(process.hProcess, &pret))
-               pret = -1;
+       BOOL success = GetExitCodeProcess(process.hProcess, &pret);
+       bool valid = (pret == 0) && success;
        if (!infile.empty())
                CloseHandle(startup.hStdInput);
        CloseHandle(process.hProcess);
        if (fclose(inf) != 0)
-               pret = -1;
+               valid = false;
 #elif defined (HAVE_PCLOSE)
        int const pret = pclose(inf);
+       bool const valid = (pret != -1);
 #elif defined (HAVE__PCLOSE)
        int const pret = _pclose(inf);
+       bool const valid = (pret != -1);
 #else
 #error No pclose() function.
 #endif
 
-       if (pret == -1)
-               perror("RunCommand:: could not terminate child process");
+       if (!valid)
+               perror("RunCommand: could not terminate child process");
 
-       return make_pair(pret, ret);
+       return { valid, result };
 }
 
 
 FileName const findtexfile(string const & fil, string const & /*format*/,
                                                   bool const onlykpse)
 {
-       /* There is no problem to extend this function too use other
+       /* There is no problem to extend this function to use other
           methods to look for files. It could be setup to look
           in environment paths and also if wanted as a last resort
           to a recursive find. One of the easier extensions would
@@ -1159,7 +1190,7 @@ FileName const findtexfile(string const & fil, string const & /*format*/,
        // is used."
        // However, we want to take advantage of the format sine almost all
        // the different formats has environment variables that can be used
-       // to controll which paths to search. f.ex. bib looks in
+       // to control which paths to search. f.ex. bib looks in
        // BIBINPUTS and TEXBIB. Small list follows:
        // bib - BIBINPUTS, TEXBIB
        // bst - BSTINPUTS
@@ -1174,10 +1205,10 @@ FileName const findtexfile(string const & fil, string const & /*format*/,
 
        cmd_ret const c = runCommand(kpsecmd);
 
-       LYXERR(Debug::LATEX, "kpse status = " << c.first << '\n'
-                << "kpse result = `" << rtrim(c.second, "\n\r") << '\'');
-       if (c.first != -1)
-               return FileName(rtrim(to_utf8(from_filesystem8bit(c.second)), "\n\r"));
+       LYXERR(Debug::LATEX, "kpse status = " << c.valid << '\n'
+                << "kpse result = `" << rtrim(c.result, "\n\r") << '\'');
+       if (c.valid)
+               return FileName(rtrim(to_utf8(from_filesystem8bit(c.result)), "\n\r"));
        else
                return FileName();
 }
@@ -1223,7 +1254,7 @@ bool prefs2prefs(FileName const & filename, FileName const & tempfile, bool lfun
        LYXERR(Debug::FILES, "Running `" << command_str << '\'');
 
        cmd_ret const ret = runCommand(command_str);
-       if (ret.first != 0) {
+       if (!ret.valid) {
                LYXERR0("Could not run file conversion script prefs2prefs.py.");
                return false;
        }