-/* This file is part of
- * ======================================================
- *
- * LyX, The Document Processor
- * Copyright 1995 Matthias Ettrich
- * Copyright 1995-1999 The LyX Team.
+/**
+ * \file Chktex.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
*
- * This file is Copyright 1997-1998
- * Asger Alstrup
+ * \author Asger Alstrup
*
- *======================================================
+ * Full author contact details are available in file CREDITS.
*/
#include <config.h>
-#include <cstdlib> // atoi
-
-#ifdef __GNUG__
-#pragma implementation
-#endif
-
#include "Chktex.h"
+#include "gettext.h"
+
#include "LaTeX.h" // TeXErrors
+
+#include "support/convert.h"
+#include "support/docstream.h"
#include "support/filetools.h"
-#include "lyxlex.h"
-#include "support/FileInfo.h"
-#include "debug.h"
-#include "support/syscall.h"
-#include "support/syscontr.h"
-#include "pathstack.h"
-#include "gettext.h"
+#include "support/lstrings.h"
+#include "support/systemcall.h"
+
+#include <boost/format.hpp>
+
+
+namespace lyx {
+
+using support::changeExtension;
+using support::FileName;
+using support::makeAbsPath;
+using support::onlyFilename;
+using support::split;
+using support::Systemcall;
+
+using std::getline;
+using std::string;
-/*
- * CLASS Chktex
- */
Chktex::Chktex(string const & chktex, string const & f, string const & p)
: cmd(chktex), file(f), path(p)
int Chktex::run(TeXErrors &terr)
{
// run bibtex
- string log = ChangeExtension(file, ".log", true);
+ string log = onlyFilename(changeExtension(file, ".log"));
string tmp = cmd + " -q -v0 -b0 -x " + file + " -o " + log;
- Systemcalls one;
- int result= one.Startscript(Systemcalls::System, tmp);
+ Systemcall one;
+ int result = one.startscript(Systemcall::Wait, tmp);
if (result == 0) {
result = scanLogFile(terr);
} else {
}
-int Chktex::scanLogFile(TeXErrors &terr)
+int Chktex::scanLogFile(TeXErrors & terr)
{
- string token;
int retval = 0;
- LyXLex lex(0, 0);
+ // FIXME: Find out whether we can onlyFilename() is really needed,
+ // or whether makeAbsPath(onlyFilename()) is a noop here
+ FileName const tmp(makeAbsPath(onlyFilename(changeExtension(file, ".log"))));
- string tmp = ChangeExtension(file, ".log", true);
-
- if (!lex.setFile(tmp)) {
- // Unable to open file. Return at once
- return -1;
- }
+#if USE_BOOST_FORMAT
+ boost::basic_format<char_type> msg(_("ChkTeX warning id # %1$d"));
+#else
+ docstring const msg(_("ChkTeX warning id # "));
+#endif
+ docstring token;
+ // FIXME UNICODE
+ // We have no idea what the encoding of the error file is
+ idocfstream ifs(tmp.toFilesystemEncoding().c_str());
+ while (getline(ifs, token)) {
+ docstring srcfile;
+ docstring line;
+ docstring pos;
+ docstring warno;
+ docstring warning;
+ token = split(token, srcfile, ':');
+ token = split(token, line, ':');
+ token = split(token, pos, ':');
+ token = split(token, warno, ':');
+ token = split(token, warning, ':');
+
+ int const lineno = convert<int>(line);
+
+#if USE_BOOST_FORMAT
+ msg % warno;
+ terr.insertError(lineno, msg.str(), warning);
+ msg.clear();
+#else
+ terr.insertError(lineno, msg + warno, warning);
+#endif
- while (lex.IsOK()) {
- if (lex.EatLine())
- token = lex.GetString();
- else // blank line in the file being read
- continue;
-
- string srcfile, line, pos, warno, warning;
- token=split(token, srcfile, ':');
- token=split(token, line, ':');
- token=split(token, pos, ':');
- token=split(token, warno, ':');
- token=split(token, warning, ':');
-
- int lineno = atoi(line.c_str());
- warno = _("ChkTeX warning id #") + warno;
- terr.insertError(lineno, warno, warning);
- retval++;
+ ++retval;
}
return retval;
}
+
+
+} // namespace lyx