From 29627f1680755510f116b36efd951b518234a878 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Sun, 22 Jan 2012 12:35:07 +0000 Subject: [PATCH] Fix converters with input redirection, such as the second htlatex one. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@40647 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/support/Systemcall.cpp | 22 +++++++++++++++------- src/support/SystemcallPrivate.h | 5 ++++- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/support/Systemcall.cpp b/src/support/Systemcall.cpp index 100023e29d..4273983bd2 100644 --- a/src/support/Systemcall.cpp +++ b/src/support/Systemcall.cpp @@ -130,8 +130,7 @@ namespace { /* * This is a parser that (mostly) mimics the behavior of a posix shell as * regards quoting, but its output is tailored for being processed by QProcess. - * Note that shell metacharacters are not parsed and only output redirection - * is taken into account. + * Note that shell metacharacters are not parsed. * * The escape character is the backslash. * A backslash that is not quoted preserves the literal value of the following @@ -164,13 +163,14 @@ namespace { * "\a" -> "\a" * "a\"b" -> "a"""b" */ -string const parsecmd(string const & incmd, string & outfile, string & errfile) +string const parsecmd(string const & incmd, string & infile, string & outfile, + string & errfile) { bool in_single_quote = false; bool in_double_quote = false; bool escaped = false; string const python_call = "python -tt"; - vector outcmd(3); + vector outcmd(4); size_t start = 0; if (prefixIs(incmd, python_call)) { @@ -215,6 +215,8 @@ string const parsecmd(string const & incmd, string & outfile, string & errfile) outcmd[o] = rtrim(outcmd[o], "1"); o = 1; } + } else if (c == '<' && !(in_double_quote || escaped)) { + o = 3; } else { if (escaped && in_double_quote) outcmd[o] += '\\'; @@ -222,6 +224,7 @@ string const parsecmd(string const & incmd, string & outfile, string & errfile) escaped = false; } } + infile = trim(outcmd[3], " \""); outfile = trim(outcmd[1], " \""); errfile = trim(outcmd[2], " \""); return trim(outcmd[0]); @@ -236,12 +239,13 @@ int Systemcall::startscript(Starttype how, string const & what, { lyxerr << "\nRunning: " << what << endl; + string infile; string outfile; string errfile; QString cmd = QString::fromLocal8Bit( - parsecmd(what, outfile, errfile).c_str()); + parsecmd(what, infile, outfile, errfile).c_str()); - SystemcallPrivate d(outfile, errfile); + SystemcallPrivate d(infile, outfile, errfile); d.startProcess(cmd, path); @@ -274,15 +278,19 @@ int Systemcall::startscript(Starttype how, string const & what, } -SystemcallPrivate::SystemcallPrivate(std::string const & of, +SystemcallPrivate::SystemcallPrivate(std::string const & sf, + std::string const & of, std::string const & ef) : process_(new QProcess), out_index_(0), err_index_(0), + in_file_(sf), out_file_(of), err_file_(ef), process_events_(false) { + if (!in_file_.empty()) + process_->setStandardInputFile(QString::fromLocal8Bit(in_file_.c_str())); if (!out_file_.empty()) { if (out_file_[0] == '&') { if (subst(out_file_, " ", "") == "&2" diff --git a/src/support/SystemcallPrivate.h b/src/support/SystemcallPrivate.h index 09ccfb6162..b8dc17a23d 100644 --- a/src/support/SystemcallPrivate.h +++ b/src/support/SystemcallPrivate.h @@ -32,7 +32,8 @@ class SystemcallPrivate : public QObject Q_OBJECT public: - SystemcallPrivate(std::string const & outfile, std::string const & errfile); + SystemcallPrivate(std::string const & infile, std::string const & outfile, + std::string const & errfile); ~SystemcallPrivate(); enum State { @@ -73,6 +74,8 @@ private: /// Index to the standard error buffer. size_t err_index_; /// + std::string in_file_; + /// std::string out_file_; /// std::string err_file_;