| 63 | } |
| 64 | |
| 65 | inline size_t ReadTo(TString& st, char to) { |
| 66 | st.clear(); |
| 67 | |
| 68 | TString s_tmp; |
| 69 | |
| 70 | size_t ret = 0; |
| 71 | |
| 72 | while (true) { |
| 73 | if (MemInput_.Exhausted()) { |
| 74 | const size_t bytesRead = Slave_->Read(Buf(), BufLen()); |
| 75 | |
| 76 | if (!bytesRead) { |
| 77 | break; |
| 78 | } |
| 79 | |
| 80 | MemInput_.Reset(Buf(), bytesRead); |
| 81 | } |
| 82 | |
| 83 | const size_t a_len(MemInput_.Avail()); |
| 84 | size_t s_len = 0; |
| 85 | if (st.empty()) { |
| 86 | ret += MemInput_.ReadTo(st, to); |
| 87 | s_len = st.length(); |
| 88 | } else { |
| 89 | ret += MemInput_.ReadTo(s_tmp, to); |
| 90 | s_len = s_tmp.length(); |
| 91 | st.append(s_tmp); |
| 92 | } |
| 93 | |
| 94 | if (s_len != a_len) { |
| 95 | break; |
| 96 | } |
| 97 | } |
| 98 | |
| 99 | return ret; |
| 100 | } |
| 101 | |
| 102 | inline void Reset(IInputStream* slave) { |
| 103 | Slave_ = slave; |