]> git.lyx.org Git - lyx.git/blobdiff - src/LaTeX.cpp
Fix coverity issues about exceptions
[lyx.git] / src / LaTeX.cpp
index 0640275a36497a4dc8eea3d8c3edfae667ae3d8b..9d796ef5732d577e3d6ca5f4ee328ea8d920eddf 100644 (file)
@@ -18,6 +18,7 @@
 #include "BufferList.h"
 #include "LaTeX.h"
 #include "LyXRC.h"
+#include "LyX.h"
 #include "DepTable.h"
 
 #include "support/debug.h"
@@ -97,7 +98,13 @@ LaTeX::LaTeX(string const & latex, OutputParams const & rp,
        : cmd(latex), file(f), path(p), lpath(lp), runparams(rp), biber(false)
 {
        num_errors = 0;
-       if (prefixIs(cmd, "pdf")) { // Do we use pdflatex ?
+       // lualatex can still produce a DVI with --output-format=dvi. However,
+       // we do not use that internally (we use the "dvilualatex" command) so
+       // it would only happen from a custom converter. Thus, it is better to
+       // guess that lualatex produces a PDF than to guess a DVI.
+       // FIXME we should base the extension on the output format, which we should
+       // get in a robust way, e.g. from the converter.
+       if (prefixIs(cmd, "pdf") || prefixIs(cmd, "lualatex") || prefixIs(cmd, "xelatex")) {
                depfile = FileName(file.absFileName() + ".dep-pdf");
                output_file =
                        FileName(changeExtension(file.absFileName(), ".pdf"));
@@ -230,7 +237,7 @@ int LaTeX::run(TeXErrors & terr)
        /// in which case we will not need to run bibtex again.
        vector<AuxInfo> bibtex_info_old;
        if (!run_bibtex)
-               bibtex_info_old = scanAuxFiles(aux_file);
+               bibtex_info_old = scanAuxFiles(aux_file, runparams.only_childbibs);
 
        ++count;
        LYXERR(Debug::LATEX, "Run #" << count);
@@ -246,7 +253,7 @@ int LaTeX::run(TeXErrors & terr)
                scanres = scanLogFile(terr);
        }
 
-       vector<AuxInfo> const bibtex_info = scanAuxFiles(aux_file);
+       vector<AuxInfo> const bibtex_info = scanAuxFiles(aux_file, runparams.only_childbibs);
        if (!run_bibtex && bibtex_info_old != bibtex_info)
                run_bibtex = true;
 
@@ -484,12 +491,26 @@ bool LaTeX::runMakeIndexNomencl(FileName const & file,
 
 
 vector<AuxInfo> const
-LaTeX::scanAuxFiles(FileName const & file)
+LaTeX::scanAuxFiles(FileName const & file, bool const only_childbibs)
 {
        vector<AuxInfo> result;
 
+       // With chapterbib, we have to bibtex all children's aux files
+       // but _not_ the master's!
+       if (only_childbibs) {
+               for (string const &s: children) {
+                       FileName fn =
+                               makeAbsPath(s, file.onlyPath().realPath());
+                       fn.changeExtension("aux");
+                       if (fn.exists())
+                               result.push_back(scanAuxFile(fn));
+               }
+               return result;
+       }
+
        result.push_back(scanAuxFile(file));
 
+       // This is for bibtopic
        string const basename = removeExtension(file.absFileName());
        for (int i = 1; i < 1000; ++i) {
                FileName const file2(basename
@@ -608,11 +629,7 @@ bool LaTeX::runBibTeX(vector<AuxInfo> const & bibtex_info,
                        continue;
                result = true;
 
-               string tmp = runparams.use_japanese ?
-                       lyxrc.jbibtex_command : lyxrc.bibtex_command;
-
-               if (!runparams.bibtex_command.empty())
-                       tmp = runparams.bibtex_command;
+               string tmp = runparams.bibtex_command;
                tmp += " ";
                // onlyFileName() is needed for cygwin
                tmp += quoteName(onlyFileName(removeExtension(
@@ -644,6 +661,7 @@ int LaTeX::scanLogFile(TeXErrors & terr)
        string child_name;
        int pnest = 0;
        stack <pair<string, int> > child;
+       children.clear();
 
        string token;
        while (getline(ifs, token)) {
@@ -672,6 +690,7 @@ int LaTeX::scanLogFile(TeXErrors & terr)
                                if (regex_match(substr, sub, child_file)) {
                                        string const name = sub.str(1);
                                        child.push(make_pair(name, pnest));
+                                       children.push_back(name);
                                        i += len;
                                }
                        } else if (token[i] == ')') {
@@ -878,8 +897,9 @@ int LaTeX::scanLogFile(TeXErrors & terr)
                        } else if (contains(token, "Rerun to get citations")) {
                                // Natbib seems to use this.
                                retval |= UNDEF_CIT;
-                       } else if (contains(token, "No pages of output")) {
-                               // A dvi file was not created
+                       } else if (contains(token, "No pages of output")
+                               || contains(token, "no pages of output")) {
+                               // No output file (e.g. the DVI or PDF) was created
                                retval |= NO_OUTPUT;
                        } else if (contains(token, "That makes 100 errors")) {
                                // More than 100 errors were reprted
@@ -892,9 +912,12 @@ int LaTeX::scanLogFile(TeXErrors & terr)
                                                 from_local8bit("pdfTeX Error"),
                                                 from_local8bit(token),
                                                 child_name);
-                       } else if (prefixIs(token, "Missing character: There is no ")) {
-                               // XeTeX/LuaTeX error about missing glyph in selected font
-                               // (bug 9610)
+                       } else if (!ignore_missing_glyphs
+                                  && prefixIs(token, "Missing character: There is no ")
+                                  && !contains(token, "nullfont")) {
+                               // Warning about missing glyph in selected font
+                               // may be dataloss (bug 9610)
+                               // but can be ignored for 'nullfont' (bug 10394).
                                retval |= LATEX_ERROR;
                                terr.insertError(0,
                                                 from_local8bit("Missing glyphs!"),