| 2778 | } |
| 2779 | |
| 2780 | cmSystemTools::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; |
nothing calls this directly
no test coverage detected