]> git.lyx.org Git - lyx.git/blobdiff - src/LaTeX.cpp
Last bits.
[lyx.git] / src / LaTeX.cpp
index 49968ffdc8a6884995b4f53ff166c66fe09b7b05..f4d98155aad65f0bbcbbe0c628aa26f01e6e36f1 100644 (file)
@@ -50,7 +50,6 @@ namespace os = support::os;
 //   different way.
 // - the makeindex style files should be taken care of with
 //   the dependency mechanism.
-// - somewhere support viewing of bibtex and makeindex log files.
 // - we should perhaps also scan the bibtex log file
 
 namespace {
@@ -99,13 +98,13 @@ LaTeX::LaTeX(string const & latex, OutputParams const & rp,
 {
        num_errors = 0;
        if (prefixIs(cmd, "pdf")) { // Do we use pdflatex ?
-               depfile = FileName(file.absFilename() + ".dep-pdf");
+               depfile = FileName(file.absFileName() + ".dep-pdf");
                output_file =
-                       FileName(changeExtension(file.absFilename(), ".pdf"));
+                       FileName(changeExtension(file.absFileName(), ".pdf"));
        } else {
-               depfile = FileName(file.absFilename() + ".dep");
+               depfile = FileName(file.absFileName() + ".dep");
                output_file =
-                       FileName(changeExtension(file.absFilename(), ".dvi"));
+                       FileName(changeExtension(file.absFileName(), ".dvi"));
        }
 }
 
@@ -122,23 +121,23 @@ void LaTeX::deleteFilesOnError() const
        // but the reason for the error might be in a generated file...
 
        // bibtex file
-       FileName const bbl(changeExtension(file.absFilename(), ".bbl"));
+       FileName const bbl(changeExtension(file.absFileName(), ".bbl"));
        bbl.removeFile();
 
        // makeindex file
-       FileName const ind(changeExtension(file.absFilename(), ".ind"));
+       FileName const ind(changeExtension(file.absFileName(), ".ind"));
        ind.removeFile();
 
        // nomencl file
-       FileName const nls(changeExtension(file.absFilename(), ".nls"));
+       FileName const nls(changeExtension(file.absFileName(), ".nls"));
        nls.removeFile();
 
        // nomencl file (old version of the package)
-       FileName const gls(changeExtension(file.absFilename(), ".gls"));
+       FileName const gls(changeExtension(file.absFileName(), ".gls"));
        gls.removeFile();
 
        // Also remove the aux file
-       FileName const aux(changeExtension(file.absFilename(), ".aux"));
+       FileName const aux(changeExtension(file.absFileName(), ".aux"));
        aux.removeFile();
 }
 
@@ -147,7 +146,7 @@ int LaTeX::run(TeXErrors & terr)
        // We know that this function will only be run if the lyx buffer
        // has been changed. We also know that a newly written .tex file
        // is always different from the previous one because of the date
-       // in it. However it seems safe to run latex (at least) on time
+       // in it. However it seems safe to run latex (at least) one time
        // each time the .tex file changes.
 {
        int scanres = NO_ERRORS;
@@ -158,7 +157,7 @@ int LaTeX::run(TeXErrors & terr)
        bool rerun = false; // rerun requested
 
        // The class LaTeX does not know the temp path.
-       theBufferList().updateIncludedTeXfiles(FileName::getcwd().absFilename(),
+       theBufferList().updateIncludedTeXfiles(FileName::getcwd().absFileName(),
                runparams);
 
        // Never write the depfile if an error was encountered.
@@ -181,7 +180,7 @@ int LaTeX::run(TeXErrors & terr)
 
        bool had_depfile = depfile.exists();
        bool run_bibtex = false;
-       FileName const aux_file(changeExtension(file.absFilename(), "aux"));
+       FileName const aux_file(changeExtension(file.absFileName(), "aux"));
 
        if (had_depfile) {
                LYXERR(Debug::DEPEND, "Dependency file exists");
@@ -253,7 +252,7 @@ int LaTeX::run(TeXErrors & terr)
 
        // memoir (at least) writes an empty *idx file in the first place.
        // A second latex run is needed.
-       FileName const idxfile(changeExtension(file.absFilename(), ".idx"));
+       FileName const idxfile(changeExtension(file.absFileName(), ".idx"));
        rerun = idxfile.exists() && idxfile.isFileEmpty();
 
        // run makeindex
@@ -261,14 +260,14 @@ int LaTeX::run(TeXErrors & terr)
                // no checks for now
                LYXERR(Debug::LATEX, "Running MakeIndex.");
                message(_("Running Index Processor."));
-               // onlyFilename() is needed for cygwin
-               rerun |= runMakeIndex(onlyFilename(idxfile.absFilename()),
+               // onlyFileName() is needed for cygwin
+               rerun |= runMakeIndex(onlyFileName(idxfile.absFileName()),
                                runparams);
        }
-       FileName const nlofile(changeExtension(file.absFilename(), ".nlo"));
+       FileName const nlofile(changeExtension(file.absFileName(), ".nlo"));
        if (head.haschanged(nlofile))
                rerun |= runMakeIndexNomencl(file, ".nlo", ".nls");
-       FileName const glofile(changeExtension(file.absFilename(), ".glo"));
+       FileName const glofile(changeExtension(file.absFileName(), ".glo"));
        if (head.haschanged(glofile))
                rerun |= runMakeIndexNomencl(file, ".glo", ".gls");
 
@@ -350,9 +349,9 @@ int LaTeX::run(TeXErrors & terr)
                // no checks for now
                LYXERR(Debug::LATEX, "Running MakeIndex.");
                message(_("Running Index Processor."));
-               // onlyFilename() is needed for cygwin
-               rerun = runMakeIndex(onlyFilename(changeExtension(
-                               file.absFilename(), ".idx")), runparams);
+               // onlyFileName() is needed for cygwin
+               rerun = runMakeIndex(onlyFileName(changeExtension(
+                               file.absFileName(), ".idx")), runparams);
        }
 
        // I am not pretty sure if need this twice.
@@ -399,9 +398,9 @@ int LaTeX::run(TeXErrors & terr)
 
 int LaTeX::startscript()
 {
-       // onlyFilename() is needed for cygwin
+       // onlyFileName() is needed for cygwin
        string tmp = cmd + ' '
-                    + quoteName(onlyFilename(file.toFilesystemEncoding()))
+                    + quoteName(onlyFileName(file.toFilesystemEncoding()))
                     + " > " + os::nulldev();
        Systemcall one;
        return one.startscript(Systemcall::Wait, tmp);
@@ -442,10 +441,10 @@ bool LaTeX::runMakeIndexNomencl(FileName const & file,
        LYXERR(Debug::LATEX, "Running MakeIndex for nomencl.");
        message(_("Running MakeIndex for nomencl."));
        string tmp = lyxrc.nomencl_command + ' ';
-       // onlyFilename() is needed for cygwin
-       tmp += quoteName(onlyFilename(changeExtension(file.absFilename(), nlo)));
+       // onlyFileName() is needed for cygwin
+       tmp += quoteName(onlyFileName(changeExtension(file.absFileName(), nlo)));
        tmp += " -o "
-               + onlyFilename(changeExtension(file.toFilesystemEncoding(), nls));
+               + onlyFileName(changeExtension(file.toFilesystemEncoding(), nls));
        Systemcall one;
        one.startscript(Systemcall::Wait, tmp);
        return true;
@@ -459,7 +458,7 @@ LaTeX::scanAuxFiles(FileName const & file)
 
        result.push_back(scanAuxFile(file));
 
-       string const basename = removeExtension(file.absFilename());
+       string const basename = removeExtension(file.absFileName());
        for (int i = 1; i < 1000; ++i) {
                FileName const file2(basename
                        + '.' + convert<string>(i)
@@ -539,7 +538,7 @@ void LaTeX::updateBibtexDependencies(DepTable & dep,
        // remove all ".bib" and ".bst" files.
        dep.remove_files_with_extension(".bib");
        dep.remove_files_with_extension(".bst");
-       //string aux = OnlyFilename(ChangeExtension(file, ".aux"));
+       //string aux = OnlyFileName(ChangeExtension(file, ".aux"));
 
        for (vector<AuxInfo>::const_iterator it = bibtex_info.begin();
             it != bibtex_info.end(); ++it) {
@@ -576,9 +575,9 @@ bool LaTeX::runBibTeX(vector<AuxInfo> const & bibtex_info,
                if (!runparams.bibtex_command.empty())
                        tmp = runparams.bibtex_command;
                tmp += " ";
-               // onlyFilename() is needed for cygwin
-               tmp += quoteName(onlyFilename(removeExtension(
-                               it->aux_file.absFilename())));
+               // onlyFileName() is needed for cygwin
+               tmp += quoteName(onlyFileName(removeExtension(
+                               it->aux_file.absFileName())));
                Systemcall one;
                one.startscript(Systemcall::Wait, tmp);
        }
@@ -593,12 +592,15 @@ int LaTeX::scanLogFile(TeXErrors & terr)
        int line_count = 1;
        int retval = NO_ERRORS;
        string tmp =
-               onlyFilename(changeExtension(file.absFilename(), ".log"));
+               onlyFileName(changeExtension(file.absFileName(), ".log"));
        LYXERR(Debug::LATEX, "Log file: " << tmp);
        FileName const fn = FileName(makeAbsPath(tmp));
        ifstream ifs(fn.toFilesystemEncoding().c_str());
        bool fle_style = false;
        static regex file_line_error(".+\\.\\D+:[0-9]+: (.+)");
+       // Flag for 'File ended while scanning' message.
+       // We need to wait for subsequent processing.
+       string wait_for_error;
 
        string token;
        while (getline(ifs, token)) {
@@ -685,6 +687,30 @@ int LaTeX::scanLogFile(TeXErrors & terr)
                                desc = sub.str();
                        if (contains(token, "LaTeX Error:"))
                                retval |= LATEX_ERROR;
+
+                       // bug 6445. At this point its not clear we finish with error.
+                       if (prefixIs(token, "! File ended while scanning")){
+                               wait_for_error = desc;
+                               continue;
+                       }
+                       if (!wait_for_error.empty() && prefixIs(token, "! Emergency stop.")){
+                               retval |= LATEX_ERROR;
+                               string errstr;
+                               int count = 0;
+                               errstr = wait_for_error;
+                               do {
+                                       if (!getline(ifs, tmp))
+                                               break;
+                                       errstr += "\n" + tmp;
+                                       if (++count > 5)
+                                               break;
+                               } while (!contains(tmp, "(job aborted"));
+
+                               terr.insertError(0,
+                                                from_local8bit("Emergency stop"),
+                                                from_local8bit(errstr));
+                       }
+
                        // get the next line
                        string tmp;
                        int count = 0;
@@ -756,6 +782,13 @@ int LaTeX::scanLogFile(TeXErrors & terr)
                        } else if (contains(token, "That makes 100 errors")) {
                                // More than 100 errors were reprted
                                retval |= TOO_MANY_ERRORS;
+                       } else if (prefixIs(token, "!pdfTeX error:")){
+                               // otherwise we dont catch e.g.:
+                               // !pdfTeX error: pdflatex (file feyn10): Font feyn10 at 600 not found
+                               retval |= ERRORS;
+                                       terr.insertError(0,
+                                                        from_local8bit("pdfTeX Error"),
+                                                        from_local8bit(token));
                        }
                }
        }
@@ -820,7 +853,7 @@ bool handleFoundFile(string const & ff, DepTable & head)
                }
        }
 
-       string onlyfile = onlyFilename(foundfile);
+       string onlyfile = onlyFileName(foundfile);
        absname = makeAbsPath(onlyfile);
 
        // check for spaces
@@ -840,7 +873,7 @@ bool handleFoundFile(string const & ff, DepTable & head)
                        string const stripoff =
                                rsplit(foundfile, strippedfile, ' ');
                        foundfile = strippedfile;
-                       onlyfile = onlyFilename(strippedfile);
+                       onlyfile = onlyFileName(strippedfile);
                        absname = makeAbsPath(onlyfile);
                }
        }
@@ -891,7 +924,7 @@ void LaTeX::deplog(DepTable & head)
        // entered into the dependency file.
 
        string const logfile =
-               onlyFilename(changeExtension(file.absFilename(), ".log"));
+               onlyFileName(changeExtension(file.absFileName(), ".log"));
 
        static regex const reg1("File: (.+).*");
        static regex const reg2("No file (.+)(.).*");
@@ -1013,8 +1046,8 @@ void LaTeX::deplog(DepTable & head)
                        found_file = checkLineBreak(sub.str(1), head);
                // (7) "\tf@toc=\write<nr>" (for MikTeX)
                else if (regex_match(token, sub, miktexTocReg))
-                       found_file = handleFoundFile(onlyFilename(changeExtension(
-                                               file.absFilename(), ".toc")), head);
+                       found_file = handleFoundFile(onlyFileName(changeExtension(
+                                               file.absFileName(), ".toc")), head);
                else
                        // not found, but we won't check further
                        // pretend we've been succesfully searching