]> git.lyx.org Git - lyx.git/blobdiff - src/LaTeX.C
Scons: update_po target, part one: language_l10n.pot
[lyx.git] / src / LaTeX.C
index 79919693835c162ddb5fdfe1c9e1d26f9805a64a..a63b5604d3f5c54de40b72347b59505542538a3d 100644 (file)
@@ -30,6 +30,7 @@
 #include "support/os.h"
 
 #include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/path.hpp>
 #include <boost/regex.hpp>
 
 #include <fstream>
@@ -756,12 +757,33 @@ int LaTeX::scanLogFile(TeXErrors & terr)
 
 namespace {
 
+/**
+ * Wrapper around fs::exists that can handle invalid file names.
+ * In theory we could test with fs::native whether a filename is valid
+ * before calling fs::exists, but in practice it is unusable: On windows it
+ * does not allow spaces, and on unix it does not allow absolute file names.
+ * This function has the disadvantage that it catches also other errors than
+ * invalid names, but for dependency checking we can live with that.
+ */
+bool exists(FileName const & possible_name) {
+       try {
+               return fs::exists(possible_name.toFilesystemEncoding());
+       }
+       catch (fs::filesystem_error const & fe) {
+               lyxerr[Debug::DEPEND] << "Got error `" << fe.what()
+                       << "' while checking whether file `" << possible_name
+                       << "' exists." << endl;
+               return false;
+       }
+}
+
+
 bool insertIfExists(FileName const & absname, DepTable & head)
 {
-       fs::path const path = absname.toFilesystemEncoding();
-       if (fs::exists(path) && !fs::is_directory(path)) {
-                       head.insert(absname, true);
-                       return true;
+       if (exists(absname) &&
+           !fs::is_directory(absname.toFilesystemEncoding())) {
+               head.insert(absname, true);
+               return true;
        }
        return false;
 }
@@ -794,6 +816,12 @@ bool handleFoundFile(string const & ff, DepTable & head)
                        // check for spaces
                        string strippedfile = foundfile;
                        while (contains(strippedfile, " ")) {
+                               // files with spaces are often enclosed in quotation
+                               // marks; those have to be removed
+                               string unquoted = subst(strippedfile, "\"", "");
+                               absname.set(unquoted);
+                               if (insertIfExists(absname, head))
+                                       return true;
                                // strip off part after last space and try again
                                string tmp = strippedfile;
                                string const stripoff =
@@ -809,11 +837,17 @@ bool handleFoundFile(string const & ff, DepTable & head)
        FileName absname(makeAbsPath(onlyfile));
 
        // check for spaces
-       while (contains(foundfile, " ")) {
-               if (fs::exists(absname.toFilesystemEncoding()))
+       while (contains(foundfile, ' ')) {
+               if (exists(absname))
                        // everything o.k.
                        break;
                else {
+                       // files with spaces are often enclosed in quotation
+                       // marks; those have to be removed
+                       string unquoted = subst(foundfile, "\"", "");
+                       absname = makeAbsPath(unquoted);
+                       if (exists(absname))
+                               break;
                        // strip off part after last space and try again
                        string strippedfile;
                        string const stripoff =
@@ -826,8 +860,8 @@ bool handleFoundFile(string const & ff, DepTable & head)
 
        // (2) foundfile is in the tmpdir
        //     insert it into head
-       fs::path const path = absname.toFilesystemEncoding();
-       if (fs::exists(path) && !fs::is_directory(path)) {
+       if (exists(absname) &&
+           !fs::is_directory(absname.toFilesystemEncoding())) {
                static regex unwanted("^.*\\.(aux|log|dvi|bbl|ind|glo)$");
                if (regex_match(onlyfile, unwanted)) {
                        lyxerr[Debug::DEPEND]
@@ -949,9 +983,7 @@ void LaTeX::deplog(DepTable & head)
                        token = lastline + token;
                if (token.length() > 255) {
                        // string too long. Cut off.
-                       int r = token.length() - 250;
-                       string ntoken = token.substr(r, token.length());
-                       token = ntoken;
+                       token.erase(0, token.length() - 251);
                }
 
                smatch sub;