2016-10-30 18:24:19 +01:00
|
|
|
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
2009-10-04 10:30:41 +03:00
|
|
|
#include "cmProcessTools.h"
|
|
|
|
|
2016-10-30 18:24:19 +01:00
|
|
|
#include <ostream>
|
2009-10-04 10:30:41 +03:00
|
|
|
|
2020-02-01 23:06:01 +01:00
|
|
|
#include "cmsys/Process.h"
|
|
|
|
|
|
|
|
#include "cmProcessOutput.h"
|
|
|
|
|
2016-07-09 11:21:54 +02:00
|
|
|
void cmProcessTools::RunProcess(struct cmsysProcess_s* cp, OutputParser* out,
|
2017-04-14 19:02:05 +02:00
|
|
|
OutputParser* err, Encoding encoding)
|
2009-10-04 10:30:41 +03:00
|
|
|
{
|
|
|
|
cmsysProcess_Execute(cp);
|
2018-01-26 17:06:56 +01:00
|
|
|
char* data = nullptr;
|
2009-10-04 10:30:41 +03:00
|
|
|
int length = 0;
|
|
|
|
int p;
|
2017-04-14 19:02:05 +02:00
|
|
|
cmProcessOutput processOutput(encoding);
|
|
|
|
std::string strdata;
|
2016-07-09 11:21:54 +02:00
|
|
|
while ((out || err) &&
|
2019-11-11 23:01:05 +01:00
|
|
|
(p = cmsysProcess_WaitForData(cp, &data, &length, nullptr))) {
|
2016-07-09 11:21:54 +02:00
|
|
|
if (out && p == cmsysProcess_Pipe_STDOUT) {
|
2017-04-14 19:02:05 +02:00
|
|
|
processOutput.DecodeText(data, length, strdata, 1);
|
|
|
|
if (!out->Process(strdata.c_str(), int(strdata.size()))) {
|
2018-01-26 17:06:56 +01:00
|
|
|
out = nullptr;
|
2009-10-04 10:30:41 +03:00
|
|
|
}
|
2016-07-09 11:21:54 +02:00
|
|
|
} else if (err && p == cmsysProcess_Pipe_STDERR) {
|
2017-04-14 19:02:05 +02:00
|
|
|
processOutput.DecodeText(data, length, strdata, 2);
|
|
|
|
if (!err->Process(strdata.c_str(), int(strdata.size()))) {
|
2018-01-26 17:06:56 +01:00
|
|
|
err = nullptr;
|
2009-10-04 10:30:41 +03:00
|
|
|
}
|
|
|
|
}
|
2016-07-09 11:21:54 +02:00
|
|
|
}
|
2017-04-14 19:02:05 +02:00
|
|
|
if (out) {
|
|
|
|
processOutput.DecodeText(std::string(), strdata, 1);
|
|
|
|
if (!strdata.empty()) {
|
|
|
|
out->Process(strdata.c_str(), int(strdata.size()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (err) {
|
|
|
|
processOutput.DecodeText(std::string(), strdata, 2);
|
|
|
|
if (!strdata.empty()) {
|
2018-01-26 17:06:56 +01:00
|
|
|
err->Process(strdata.c_str(), int(strdata.size()));
|
2017-04-14 19:02:05 +02:00
|
|
|
}
|
|
|
|
}
|
2018-01-26 17:06:56 +01:00
|
|
|
cmsysProcess_WaitForExit(cp, nullptr);
|
2009-10-04 10:30:41 +03:00
|
|
|
}
|
|
|
|
|
2016-07-09 11:21:54 +02:00
|
|
|
cmProcessTools::LineParser::LineParser(char sep, bool ignoreCR)
|
2019-11-11 23:01:05 +01:00
|
|
|
: Separator(sep)
|
2016-07-09 11:21:54 +02:00
|
|
|
, IgnoreCR(ignoreCR)
|
2009-10-04 10:30:41 +03:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void cmProcessTools::LineParser::SetLog(std::ostream* log, const char* prefix)
|
|
|
|
{
|
|
|
|
this->Log = log;
|
2016-07-09 11:21:54 +02:00
|
|
|
this->Prefix = prefix ? prefix : "";
|
2009-10-04 10:30:41 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool cmProcessTools::LineParser::ProcessChunk(const char* first, int length)
|
|
|
|
{
|
|
|
|
const char* last = first + length;
|
2016-07-09 11:21:54 +02:00
|
|
|
for (const char* c = first; c != last; ++c) {
|
|
|
|
if (*c == this->Separator || *c == '\0') {
|
2010-06-28 22:39:51 +03:00
|
|
|
this->LineEnd = *c;
|
|
|
|
|
2009-10-04 10:30:41 +03:00
|
|
|
// Log this line.
|
2016-07-09 11:21:54 +02:00
|
|
|
if (this->Log && this->Prefix) {
|
2009-10-04 10:30:41 +03:00
|
|
|
*this->Log << this->Prefix << this->Line << "\n";
|
2016-07-09 11:21:54 +02:00
|
|
|
}
|
2009-10-04 10:30:41 +03:00
|
|
|
|
|
|
|
// Hand this line to the subclass implementation.
|
2016-07-09 11:21:54 +02:00
|
|
|
if (!this->ProcessLine()) {
|
2018-01-26 17:06:56 +01:00
|
|
|
this->Line.clear();
|
2009-10-04 10:30:41 +03:00
|
|
|
return false;
|
2016-07-09 11:21:54 +02:00
|
|
|
}
|
2009-10-04 10:30:41 +03:00
|
|
|
|
2018-01-26 17:06:56 +01:00
|
|
|
this->Line.clear();
|
2016-07-09 11:21:54 +02:00
|
|
|
} else if (*c != '\r' || !this->IgnoreCR) {
|
2009-10-04 10:30:41 +03:00
|
|
|
// Append this character to the line under construction.
|
|
|
|
this->Line.append(1, *c);
|
|
|
|
}
|
2016-07-09 11:21:54 +02:00
|
|
|
}
|
2009-10-04 10:30:41 +03:00
|
|
|
return true;
|
|
|
|
}
|