]> git.lyx.org Git - lyx.git/blobdiff - src/LaTeX.cpp
Simplify code by using initializer lists for vectors.
[lyx.git] / src / LaTeX.cpp
index 5333c7fbae84a0dd81348a9f787533a0f1aca853..81f8a39b3af9a60ac0b9697284fcdfae836a5a88 100644 (file)
@@ -238,7 +238,7 @@ int LaTeX::run(TeXErrors & terr)
                        // Also remove all children which are included
                        Buffer const * buf = theBufferList().getBufferFromTmp(file.absFileName());
                        if (buf && buf->params().maintain_unincluded_children == BufferParams::CM_Mostly) {
-                               for (auto const incfile : buf->params().getIncludedChildren()) {
+                               for (auto const incfile : buf->params().getIncludedChildren()) {
                                        string const incm =
                                                DocFileName(changeExtension(makeAbsPath(incfile, path)
                                                                            .absFileName(), ".tex")).mangledFileName();
@@ -281,16 +281,16 @@ int LaTeX::run(TeXErrors & terr)
        message(runMessage(count));
 
        int exit_code = startscript();
-       if (exit_code == Systemcall::KILLED)
-               return Systemcall::KILLED;
+       if (exit_code == Systemcall::KILLED || exit_code == Systemcall::TIMEOUT)
+               return exit_code;
 
        scanres = scanLogFile(terr);
        if (scanres & ERROR_RERUN) {
                LYXERR(Debug::LATEX, "Rerunning LaTeX");
                terr.clearErrors();
                exit_code = startscript();
-               if (exit_code == Systemcall::KILLED)
-                       return Systemcall::KILLED;
+               if (exit_code == Systemcall::KILLED || exit_code == Systemcall::TIMEOUT)
+                       return exit_code;
                scanres = scanLogFile(terr);
        }
 
@@ -322,8 +322,8 @@ int LaTeX::run(TeXErrors & terr)
                // onlyFileName() is needed for cygwin
                int const ret = 
                                runMakeIndex(onlyFileName(idxfile.absFileName()), runparams);
-               if (ret == Systemcall::KILLED)
-                       return Systemcall::KILLED;
+               if (ret == Systemcall::KILLED || ret == Systemcall::TIMEOUT)
+                       return ret;
                FileName const ilgfile(changeExtension(file.absFileName(), ".ilg"));
                if (ilgfile.exists())
                        iscanres = scanIlgFile(terr);
@@ -338,8 +338,8 @@ int LaTeX::run(TeXErrors & terr)
        // FIXME: Sort out the real problem in DepTable.
        if (head.haschanged(nlofile) || (nlofile.exists() && nlofile.isFileEmpty())) {
                int const ret = runMakeIndexNomencl(file, ".nlo", ".nls");
-               if (ret == Systemcall::KILLED)
-                       return Systemcall::KILLED;
+               if (ret == Systemcall::KILLED || ret == Systemcall::TIMEOUT)
+                       return ret;
                rerun = true;
        }
 
@@ -375,8 +375,8 @@ int LaTeX::run(TeXErrors & terr)
                updateBibtexDependencies(head, bibtex_info);
                int exit_code;
                rerun |= runBibTeX(bibtex_info, runparams, exit_code);
-               if (exit_code == Systemcall::KILLED)
-                       return Systemcall::KILLED;
+               if (exit_code == Systemcall::KILLED || exit_code == Systemcall::TIMEOUT)
+                       return exit_code;
                FileName const blgfile(changeExtension(file.absFileName(), ".blg"));
                if (blgfile.exists())
                        bscanres = scanBlgFile(head, terr);
@@ -406,8 +406,8 @@ int LaTeX::run(TeXErrors & terr)
                LYXERR(Debug::LATEX, "Run #" << count);
                message(runMessage(count));
                int exit_code = startscript();
-               if (exit_code == Systemcall::KILLED)
-                       return Systemcall::KILLED;
+               if (exit_code == Systemcall::KILLED || exit_code == Systemcall::TIMEOUT)
+                       return exit_code;
                scanres = scanLogFile(terr);
 
                // update the depedencies
@@ -436,8 +436,8 @@ int LaTeX::run(TeXErrors & terr)
                updateBibtexDependencies(head, bibtex_info);
                int exit_code;
                rerun |= runBibTeX(bibtex_info, runparams, exit_code);
-               if (exit_code == Systemcall::KILLED)
-                       return Systemcall::KILLED;
+               if (exit_code == Systemcall::KILLED || exit_code == Systemcall::TIMEOUT)
+                       return exit_code;
                FileName const blgfile(changeExtension(file.absFileName(), ".blg"));
                if (blgfile.exists())
                        bscanres = scanBlgFile(head, terr);
@@ -459,8 +459,8 @@ int LaTeX::run(TeXErrors & terr)
                // onlyFileName() is needed for cygwin
                int const ret = runMakeIndex(onlyFileName(changeExtension(
                                file.absFileName(), ".idx")), runparams);
-               if (ret == Systemcall::KILLED)
-                       return Systemcall::KILLED;
+               if (ret == Systemcall::KILLED || ret == Systemcall::TIMEOUT)
+                       return ret;
                FileName const ilgfile(changeExtension(file.absFileName(), ".ilg"));
                if (ilgfile.exists())
                        iscanres = scanIlgFile(terr);
@@ -1051,10 +1051,15 @@ int LaTeX::scanLogFile(TeXErrors & terr)
 
                        // get the next line
                        int count = 0;
+                       // We also collect intermediate lines
+                       // This is needed for errors in preamble
+                       string intermediate;
                        do {
                                if (!getline(ifs, tmp))
                                        break;
                                tmp = rtrim(tmp, "\r");
+                               if (!prefixIs(tmp, "l."))
+                                       intermediate += tmp;
                                // 15 is somewhat arbitrarily chosen, based on practice.
                                // We used 10 for 14 years and increased it to 15 when we
                                // saw one case.
@@ -1076,6 +1081,15 @@ int LaTeX::scanLogFile(TeXErrors & terr)
                                sscanf(tmp.c_str(), "l.%d", &line);
                                // get the rest of the message:
                                string errstr(tmp, tmp.find(' '));
+                               bool preamble_error = false;
+                               if (suffixIs(errstr, "\\begin{document}")) {
+                                       // this is an error in preamble
+                                       // the real error is in the
+                                       // intermediate lines
+                                       errstr = intermediate;
+                                       tmp = intermediate;
+                                       preamble_error = true;
+                               }
                                errstr += '\n';
                                getline(ifs, tmp);
                                tmp = rtrim(tmp, "\r");
@@ -1088,6 +1102,9 @@ int LaTeX::scanLogFile(TeXErrors & terr)
                                        getline(ifs, tmp);
                                        tmp = rtrim(tmp, "\r");
                                }
+                               if (preamble_error)
+                                       // Add a note that the error is to be found in preamble
+                                       errstr += "\n" + to_utf8(_("(NOTE: The erroneous command is in the preamble)"));
                                LYXERR(Debug::LATEX, "line: " << line << '\n'
                                        << "Desc: " << desc << '\n' << "Text: " << errstr);
                                if (line == last_line)