michael@0: // Copyright (C) 2009-2011, International Business Machines michael@0: // Corporation and others. All Rights Reserved. michael@0: // michael@0: // Copyright 2007 Google Inc. All Rights Reserved. michael@0: // Author: sanjay@google.com (Sanjay Ghemawat) michael@0: michael@0: #include "unicode/utypes.h" michael@0: #include "unicode/bytestream.h" michael@0: #include "cmemory.h" michael@0: michael@0: U_NAMESPACE_BEGIN michael@0: michael@0: ByteSink::~ByteSink() {} michael@0: michael@0: char* ByteSink::GetAppendBuffer(int32_t min_capacity, michael@0: int32_t /*desired_capacity_hint*/, michael@0: char* scratch, int32_t scratch_capacity, michael@0: int32_t* result_capacity) { michael@0: if (min_capacity < 1 || scratch_capacity < min_capacity) { michael@0: *result_capacity = 0; michael@0: return NULL; michael@0: } michael@0: *result_capacity = scratch_capacity; michael@0: return scratch; michael@0: } michael@0: michael@0: void ByteSink::Flush() {} michael@0: michael@0: CheckedArrayByteSink::CheckedArrayByteSink(char* outbuf, int32_t capacity) michael@0: : outbuf_(outbuf), capacity_(capacity < 0 ? 0 : capacity), michael@0: size_(0), appended_(0), overflowed_(FALSE) { michael@0: } michael@0: michael@0: CheckedArrayByteSink::~CheckedArrayByteSink() {} michael@0: michael@0: CheckedArrayByteSink& CheckedArrayByteSink::Reset() { michael@0: size_ = appended_ = 0; michael@0: overflowed_ = FALSE; michael@0: return *this; michael@0: } michael@0: michael@0: void CheckedArrayByteSink::Append(const char* bytes, int32_t n) { michael@0: if (n <= 0) { michael@0: return; michael@0: } michael@0: appended_ += n; michael@0: int32_t available = capacity_ - size_; michael@0: if (n > available) { michael@0: n = available; michael@0: overflowed_ = TRUE; michael@0: } michael@0: if (n > 0 && bytes != (outbuf_ + size_)) { michael@0: uprv_memcpy(outbuf_ + size_, bytes, n); michael@0: } michael@0: size_ += n; michael@0: } michael@0: michael@0: char* CheckedArrayByteSink::GetAppendBuffer(int32_t min_capacity, michael@0: int32_t /*desired_capacity_hint*/, michael@0: char* scratch, michael@0: int32_t scratch_capacity, michael@0: int32_t* result_capacity) { michael@0: if (min_capacity < 1 || scratch_capacity < min_capacity) { michael@0: *result_capacity = 0; michael@0: return NULL; michael@0: } michael@0: int32_t available = capacity_ - size_; michael@0: if (available >= min_capacity) { michael@0: *result_capacity = available; michael@0: return outbuf_ + size_; michael@0: } else { michael@0: *result_capacity = scratch_capacity; michael@0: return scratch; michael@0: } michael@0: } michael@0: michael@0: U_NAMESPACE_END