MCPcopy Create free account
hub / github.com/Kitware/CMake / WaitForLine

Method WaitForLine

Source/cmSystemTools.cxx:2780–2900  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2778}
2779
2780cmSystemTools::WaitForLineResult cmSystemTools::WaitForLine(
2781 uv_loop_t* loop, uv_stream_t* outPipe, uv_stream_t* errPipe,
2782 std::string& line, std::vector<char>& out, std::vector<char>& err)
2783{
2784 line.clear();
2785 auto outiter = out.begin();
2786 auto erriter = err.begin();
2787 cmProcessOutput processOutput;
2788 std::string strdata;
2789 while (true) {
2790 // Check for a newline in stdout.
2791 for (; outiter != out.end(); ++outiter) {
2792 if ((*outiter == '\r') && ((outiter + 1) == out.end())) {
2793 break;
2794 }
2795 if (*outiter == '\n' || *outiter == '\0') {
2796 std::vector<char>::size_type length = outiter - out.begin();
2797 if (length > 1 && *(outiter - 1) == '\r') {
2798 --length;
2799 }
2800 if (length > 0) {
2801 line.append(out.data(), length);
2802 }
2803 out.erase(out.begin(), outiter + 1);
2804 return WaitForLineResult::STDOUT;
2805 }
2806 }
2807
2808 // Check for a newline in stderr.
2809 for (; erriter != err.end(); ++erriter) {
2810 if ((*erriter == '\r') && ((erriter + 1) == err.end())) {
2811 break;
2812 }
2813 if (*erriter == '\n' || *erriter == '\0') {
2814 std::vector<char>::size_type length = erriter - err.begin();
2815 if (length > 1 && *(erriter - 1) == '\r') {
2816 --length;
2817 }
2818 if (length > 0) {
2819 line.append(err.data(), length);
2820 }
2821 err.erase(err.begin(), erriter + 1);
2822 return WaitForLineResult::STDERR;
2823 }
2824 }
2825
2826 // No newlines found. Wait for more data from the process.
2827 struct ReadData
2828 {
2829 uv_stream_t* Stream;
2830 std::vector<char> Buffer;
2831 bool Read = false;
2832 bool Finished = false;
2833 };
2834 auto startRead =
2835 [](uv_stream_t* stream,
2836 ReadData& data) -> std::unique_ptr<cmUVStreamReadHandle> {
2837 data.Stream = stream;

Callers

nothing calls this directly

Calls 14

cmUVStreamReadFunction · 0.85
moveFunction · 0.85
appendFunction · 0.85
appendMethod · 0.80
eraseMethod · 0.80
DecodeTextMethod · 0.80
uv_read_stopFunction · 0.50
uv_runFunction · 0.50
clearMethod · 0.45
beginMethod · 0.45
endMethod · 0.45
dataMethod · 0.45

Tested by

no test coverage detected