]> git.lyx.org Git - lyx.git/blobdiff - src/LaTeX.C
fix some buggy constructs with stringstream
[lyx.git] / src / LaTeX.C
index 2a70e096df653da3d2519e42c7e6a0a851e9a961..a8106ccf2fd5f4ff3f811f22d8e967b8834441c5 100644 (file)
@@ -3,9 +3,9 @@
  * 
  *           LyX, The Document Processor        
  *          Copyright 1995 Matthias Ettrich
- *           Copyright 1995-2000 The LyX Team.
+ *           Copyright 1995-2001 The LyX Team.
  *
- *           This file is Copyright 1996-2000
+ *           This file is Copyright 1996-2001
  *           Lars Gullik Bjønnes
  *
  * ====================================================== 
@@ -29,9 +29,9 @@
 #include "support/LRegex.h"
 #include "support/LSubstring.h"
 #include "bufferlist.h"
-#include "minibuffer.h"
 #include "gettext.h"
 #include "lyx_gui_misc.h"
+#include "lyxfunc.h"
 
 using std::ifstream;
 using std::getline;
@@ -106,14 +106,14 @@ void LaTeX::deleteFilesOnError() const
 }
 
 
-int LaTeX::run(TeXErrors & terr, MiniBuffer * minib)
+int LaTeX::run(TeXErrors & terr, LyXFunc * lfun)
        // 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 each
        // time the .tex file changes.
 {
-       int scanres = LaTeX::NO_ERRORS;
+       int scanres = NO_ERRORS;
        unsigned int count = 0; // number of times run
        num_errors = 0; // just to make sure.
        const unsigned int MAX_RUN = 6;
@@ -154,7 +154,7 @@ int LaTeX::run(TeXErrors & terr, MiniBuffer * minib)
                head.update();
                if (!head.sumchange()) {
                        lyxerr[Debug::DEPEND] << "return no_change" << endl;
-                       return LaTeX::NO_CHANGE;
+                       return NO_CHANGE;
                }
                lyxerr[Debug::DEPEND]
                        << "Dependency file has changed" << endl;
@@ -173,17 +173,24 @@ int LaTeX::run(TeXErrors & terr, MiniBuffer * minib)
                bibtex_info_old = scanAuxFiles(aux_file);
 
        ++count;
-       lyxerr[Debug::LATEX] << "Run #" << count << endl; 
-       WriteStatus(minib, string(_("LaTeX run number ")) + tostr(count));
+       lyxerr[Debug::LATEX] << "Run #" << count << endl;
+       if (lfun) {
+               ostringstream str;
+               str << _("LaTeX run number") << ' ' << count;
+               lfun->Dispatch(LFUN_MESSAGE, str.str().c_str());
+       }
+       
+       
+       //WriteStatus(lfun, string(_("LaTeX run number ")) + tostr(count));
        this->operator()();
        scanres = scanLogFile(terr);
-       if (scanres & LaTeX::ERROR_RERUN) {
+       if (scanres & ERROR_RERUN) {
                lyxerr[Debug::LATEX] << "Rerunning LaTeX" << endl;
                this->operator()();
                scanres = scanLogFile(terr);
        }
 
-       if (scanres & LaTeX::ERRORS) {
+       if (scanres & ERRORS) {
                deleteFilesOnError();
                return scanres; // return on error
        }
@@ -207,20 +214,21 @@ int LaTeX::run(TeXErrors & terr, MiniBuffer * minib)
        if (head.haschanged(OnlyFilename(ChangeExtension(file, ".idx")))) {
                // no checks for now
                lyxerr[Debug::LATEX] << "Running MakeIndex." << endl;
-               WriteStatus(minib, _("Running MakeIndex."));
+               if (lfun) lfun->Dispatch(LFUN_MESSAGE, _("Running MakeIndex."));
+//             WriteStatus(minib, _("Running MakeIndex."));
                rerun = runMakeIndex(OnlyFilename(ChangeExtension(file, ".idx")));
        }
 
        // run bibtex
-       if (scanres & LaTeX::UNDEF_CIT
-           || scanres & LaTeX::RERUN
-           || run_bibtex) {
+       // if (scanres & UNDEF_CIT || scanres & RERUN || run_bibtex)
+       if (scanres & UNDEF_CIT || run_bibtex) {
                // Here we must scan the .aux file and look for
                // "\bibdata" and/or "\bibstyle". If one of those
                // tags is found -> run bibtex and set rerun = true;
                // no checks for now
                lyxerr[Debug::LATEX] << "Running BibTeX." << endl;
-               WriteStatus(minib, _("Running BibTeX."));
+               if (lfun) lfun->Dispatch(LFUN_MESSAGE, _("Running BibTeX."));
+               //WriteStatus(minib, _("Running BibTeX."));
                updateBibtexDependencies(head, bibtex_info);
                rerun |= runBibTeX(bibtex_info);
        } else if (!had_depfile)
@@ -248,11 +256,17 @@ int LaTeX::run(TeXErrors & terr, MiniBuffer * minib)
                        << "Dep. file has changed or rerun requested" << endl;
                lyxerr[Debug::LATEX]
                        << "Run #" << count << endl;
-               WriteStatus(minib,
-                           string(_("LaTeX run number ")) + tostr(count));
+               if (lfun) {
+                       ostringstream str;
+                       str << _("LaTeX run number") << ' ' << count;
+                       lfun->Dispatch(LFUN_MESSAGE, str.str().c_str());
+               }
+               
+//             WriteStatus(minib,
+//                         string(_("LaTeX run number ")) + tostr(count));
                this->operator()();
                scanres = scanLogFile(terr);
-               if (scanres & LaTeX::ERRORS) {
+               if (scanres & ERRORS) {
                        deleteFilesOnError();
                        return scanres; // return on error
                }
@@ -276,7 +290,8 @@ int LaTeX::run(TeXErrors & terr, MiniBuffer * minib)
        if (head.haschanged(OnlyFilename(ChangeExtension(file, ".idx")))) {
                // no checks for now
                lyxerr[Debug::LATEX] << "Running MakeIndex." << endl;
-               WriteStatus(minib, _("Running MakeIndex."));
+               if (lfun) lfun->Dispatch(LFUN_MESSAGE, _("Running MakeIndex."));
+               //WriteStatus(minib, _("Running MakeIndex."));
                rerun = runMakeIndex(OnlyFilename(ChangeExtension(file, ".idx")));
        }
        
@@ -290,17 +305,23 @@ int LaTeX::run(TeXErrors & terr, MiniBuffer * minib)
        //     -> rerun not asked for:
        //             just return (fall out of bottom of func)
        //
-       while ((head.sumchange() || rerun || (scanres & LaTeX::RERUN)) 
+       while ((head.sumchange() || rerun || (scanres & RERUN)) 
               && count < MAX_RUN) {
                // Yes rerun until message goes away, or until
                // MAX_RUNS are reached.
                rerun = false;
                ++count;
                lyxerr[Debug::LATEX] << "Run #" << count << endl;
-               WriteStatus(minib, string(_("LaTeX run number ")) + tostr(count));
+               if (lfun) {
+                       ostringstream str;
+                       str << _("LaTeX run number") << ' ' << count;
+                       lfun->Dispatch(LFUN_MESSAGE, str.str().c_str());
+               }
+               
+//             WriteStatus(minib, string(_("LaTeX run number ")) + tostr(count));
                this->operator()();
                scanres = scanLogFile(terr);
-               if (scanres & LaTeX::ERRORS) {
+               if (scanres & ERRORS) {
                        deleteFilesOnError();
                        return scanres; // return on error
                }
@@ -585,7 +606,7 @@ int LaTeX::scanLogFile(TeXErrors & terr)
                                retval |= TEX_WARNING;
                        } else if (contains(token, "Rerun to get citations")) {
                                // Natbib seems to use this.
-                               retval |= RERUN;
+                               retval |= UNDEF_CIT;
                        } else if (contains(token, "No pages of output")) {
                                // A dvi file was not created
                                retval |= NO_OUTPUT;
@@ -606,9 +627,9 @@ void LaTeX::deplog(DepTable & head)
        // files used by the LaTeX run. The files are then entered into the
        // dependency file.
 
-       string logfile = OnlyFilename(ChangeExtension(file, ".log"));
+       string const logfile = OnlyFilename(ChangeExtension(file, ".log"));
 
-       LRegex reg1(")* *\\(([^ \\)]+).*");
+       LRegex reg1("\\)* *\\(([^ )]+).*");
        LRegex reg2("File: ([^ ]+).*");
        LRegex reg3("No file ([^ ]+)\\..*");
        LRegex reg4("\\\\openout[0-9]+.*=.*`([^ ]+)'\\..*");
@@ -664,13 +685,13 @@ void LaTeX::deplog(DepTable & head)
                        // On initial insert we want to do the update at once
                        // since this file can not be a file generated by
                        // the latex run.
-                       head.insert(foundfile, true);
-                       continue;
+                       if (FileInfo(foundfile).exist())
+                               head.insert(foundfile, true);
                }
 
                // (2) foundfile is in the tmpdir
                //     insert it into head
-               if (FileInfo(OnlyFilename(foundfile)).exist()) {
+               else if (FileInfo(OnlyFilename(foundfile)).exist()) {
                        if (unwanted.exact_match(foundfile)) {
                                lyxerr[Debug::DEPEND]
                                        << "We don't want "
@@ -693,10 +714,12 @@ void LaTeX::deplog(DepTable & head)
                                        << endl;
                                head.insert(OnlyFilename(foundfile));
                        }
-                       continue;
-               }
-               lyxerr[Debug::DEPEND]
-                       << "Not a file or we are unable to find it."
-                       << endl;
+               } else
+                       lyxerr[Debug::DEPEND]
+                               << "Not a file or we are unable to find it."
+                               << endl;
        }
+
+       // Make sure that the main .tex file is in the dependancy file.
+       head.insert(OnlyFilename(file), true);
 }