| 12 | #include "cmUVStream.h" |
| 13 | |
| 14 | std::vector<cmUVProcessChain::Status> cmProcessTools::RunProcess( |
| 15 | cmUVProcessChainBuilder& builder, OutputParser* out, OutputParser* err, |
| 16 | Encoding encoding) |
| 17 | { |
| 18 | cmProcessOutput processOutput(encoding); |
| 19 | |
| 20 | builder.SetBuiltinStream(cmUVProcessChainBuilder::Stream_OUTPUT) |
| 21 | .SetBuiltinStream(cmUVProcessChainBuilder::Stream_ERROR); |
| 22 | |
| 23 | auto chain = builder.Start(); |
| 24 | |
| 25 | std::string strdata; |
| 26 | auto outputHandle = cmUVStreamRead( |
| 27 | chain.OutputStream(), |
| 28 | [&out, &processOutput, &strdata](std::vector<char> data) { |
| 29 | if (out) { |
| 30 | processOutput.DecodeText(data.data(), data.size(), strdata, 1); |
| 31 | if (!out->Process(strdata.c_str(), static_cast<int>(strdata.size()))) { |
| 32 | out = nullptr; |
| 33 | } |
| 34 | } |
| 35 | }, |
| 36 | [&out]() { out = nullptr; }); |
| 37 | auto errorHandle = cmUVStreamRead( |
| 38 | chain.ErrorStream(), |
| 39 | [&err, &processOutput, &strdata](std::vector<char> data) { |
| 40 | if (err) { |
| 41 | processOutput.DecodeText(data.data(), data.size(), strdata, 2); |
| 42 | if (!err->Process(strdata.c_str(), static_cast<int>(strdata.size()))) { |
| 43 | err = nullptr; |
| 44 | } |
| 45 | } |
| 46 | }, |
| 47 | [&err]() { err = nullptr; }); |
| 48 | while (out || err || !chain.Finished()) { |
| 49 | uv_run(&chain.GetLoop(), UV_RUN_ONCE); |
| 50 | } |
| 51 | |
| 52 | std::vector<cmUVProcessChain::Status> result; |
| 53 | auto status = chain.GetStatus(); |
| 54 | std::transform( |
| 55 | status.begin(), status.end(), std::back_inserter(result), |
| 56 | [](cmUVProcessChain::Status const* s) -> cmUVProcessChain::Status { |
| 57 | return *s; |
| 58 | }); |
| 59 | return result; |
| 60 | } |
| 61 | |
| 62 | cmProcessTools::LineParser::LineParser(char sep, bool ignoreCR) |
| 63 | : Separator(sep) |
nothing calls this directly
no test coverage detected