| 107 | } |
| 108 | |
| 109 | Result<TransformFlow<std::shared_ptr<Buffer>>> operator()(std::shared_ptr<Buffer> buf) { |
| 110 | if (buf == nullptr) { |
| 111 | // EOF |
| 112 | return TransformFinish(); |
| 113 | } |
| 114 | |
| 115 | int64_t offset = 0; |
| 116 | if (first_buffer_) { |
| 117 | ARROW_ASSIGN_OR_RAISE(auto data, util::SkipUTF8BOM(buf->data(), buf->size())); |
| 118 | offset += data - buf->data(); |
| 119 | DCHECK_GE(offset, 0); |
| 120 | first_buffer_ = false; |
| 121 | } |
| 122 | |
| 123 | if (trailing_cr_ && buf->data()[offset] == '\n') { |
| 124 | // Skip '\r\n' line separator that started at the end of previous buffer |
| 125 | ++offset; |
| 126 | } |
| 127 | |
| 128 | trailing_cr_ = (buf->data()[buf->size() - 1] == '\r'); |
| 129 | buf = SliceBuffer(std::move(buf), offset); |
| 130 | if (buf->size() == 0) { |
| 131 | // EOF |
| 132 | return TransformFinish(); |
| 133 | } else { |
| 134 | return TransformYield(std::move(buf)); |
| 135 | } |
| 136 | } |
| 137 | |
| 138 | protected: |
| 139 | bool first_buffer_ = true; |
no test coverage detected