1// Copyright (C) 2009-2011, International Business Machines 2// Corporation and others. All Rights Reserved. 3// 4// Copyright 2007 Google Inc. All Rights Reserved. 5// Author: sanjay@google.com (Sanjay Ghemawat) 6 7#include "unicode/utypes.h" 8#include "unicode/bytestream.h" 9#include "cmemory.h" 10 11U_NAMESPACE_BEGIN 12 13ByteSink::~ByteSink() {} 14 15char* ByteSink::GetAppendBuffer(int32_t min_capacity, 16 int32_t /*desired_capacity_hint*/, 17 char* scratch, int32_t scratch_capacity, 18 int32_t* result_capacity) { 19 if (min_capacity < 1 || scratch_capacity < min_capacity) { 20 *result_capacity = 0; 21 return NULL; 22 } 23 *result_capacity = scratch_capacity; 24 return scratch; 25} 26 27void ByteSink::Flush() {} 28 29CheckedArrayByteSink::CheckedArrayByteSink(char* outbuf, int32_t capacity) 30 : outbuf_(outbuf), capacity_(capacity < 0 ? 0 : capacity), 31 size_(0), appended_(0), overflowed_(FALSE) { 32} 33 34CheckedArrayByteSink::~CheckedArrayByteSink() {} 35 36CheckedArrayByteSink& CheckedArrayByteSink::Reset() { 37 size_ = appended_ = 0; 38 overflowed_ = FALSE; 39 return *this; 40} 41 42void CheckedArrayByteSink::Append(const char* bytes, int32_t n) { 43 if (n <= 0) { 44 return; 45 } 46 appended_ += n; 47 int32_t available = capacity_ - size_; 48 if (n > available) { 49 n = available; 50 overflowed_ = TRUE; 51 } 52 if (n > 0 && bytes != (outbuf_ + size_)) { 53 uprv_memcpy(outbuf_ + size_, bytes, n); 54 } 55 size_ += n; 56} 57 58char* CheckedArrayByteSink::GetAppendBuffer(int32_t min_capacity, 59 int32_t /*desired_capacity_hint*/, 60 char* scratch, 61 int32_t scratch_capacity, 62 int32_t* result_capacity) { 63 if (min_capacity < 1 || scratch_capacity < min_capacity) { 64 *result_capacity = 0; 65 return NULL; 66 } 67 int32_t available = capacity_ - size_; 68 if (available >= min_capacity) { 69 *result_capacity = available; 70 return outbuf_ + size_; 71 } else { 72 *result_capacity = scratch_capacity; 73 return scratch; 74 } 75} 76 77U_NAMESPACE_END 78