|  | @@ -49,22 +49,25 @@ namespace protobuf {
 | 
	
		
			
				|  |  |  namespace util {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  namespace internal {
 | 
	
		
			
				|  |  | +ZeroCopyStreamByteSink::~ZeroCopyStreamByteSink() {
 | 
	
		
			
				|  |  | +  stream_->BackUp(buffer_size_);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  void ZeroCopyStreamByteSink::Append(const char* bytes, size_t len) {
 | 
	
		
			
				|  |  | -  while (len > 0) {
 | 
	
		
			
				|  |  | -    void* buffer;
 | 
	
		
			
				|  |  | -    int length;
 | 
	
		
			
				|  |  | -    if (!stream_->Next(&buffer, &length)) {
 | 
	
		
			
				|  |  | -      // There isn't a way for ByteSink to report errors.
 | 
	
		
			
				|  |  | +  while (true) {
 | 
	
		
			
				|  |  | +    if (len <= buffer_size_) {
 | 
	
		
			
				|  |  | +      memcpy(buffer_, bytes, len);
 | 
	
		
			
				|  |  | +      buffer_ = static_cast<char*>(buffer_) + len;
 | 
	
		
			
				|  |  | +      buffer_size_ -= len;
 | 
	
		
			
				|  |  |        return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    if (len < length) {
 | 
	
		
			
				|  |  | -      memcpy(buffer, bytes, len);
 | 
	
		
			
				|  |  | -      stream_->BackUp(length - len);
 | 
	
		
			
				|  |  | -      break;
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      memcpy(buffer, bytes, length);
 | 
	
		
			
				|  |  | -      bytes += length;
 | 
	
		
			
				|  |  | -      len -= length;
 | 
	
		
			
				|  |  | +    memcpy(buffer_, bytes, buffer_size_);
 | 
	
		
			
				|  |  | +    bytes += buffer_size_;
 | 
	
		
			
				|  |  | +    len -= buffer_size_;
 | 
	
		
			
				|  |  | +    if (!stream_->Next(&buffer_, &buffer_size_)) {
 | 
	
		
			
				|  |  | +      // There isn't a way for ByteSink to report errors.
 | 
	
		
			
				|  |  | +      buffer_size_ = 0;
 | 
	
		
			
				|  |  | +      return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 |