Home | History | Annotate | Download | only in common
      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 (at) google.com (Sanjay Ghemawat)
      6 
      7 #include "unicode/utypes.h"
      8 #include "unicode/bytestream.h"
      9 #include "cmemory.h"
     10 
     11 U_NAMESPACE_BEGIN
     12 
     13 ByteSink::~ByteSink() {}
     14 
     15 char* 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 
     27 void ByteSink::Flush() {}
     28 
     29 CheckedArrayByteSink::CheckedArrayByteSink(char* outbuf, int32_t capacity)
     30     : outbuf_(outbuf), capacity_(capacity < 0 ? 0 : capacity),
     31       size_(0), appended_(0), overflowed_(FALSE) {
     32 }
     33 
     34 CheckedArrayByteSink::~CheckedArrayByteSink() {}
     35 
     36 CheckedArrayByteSink& CheckedArrayByteSink::Reset() {
     37   size_ = appended_ = 0;
     38   overflowed_ = FALSE;
     39   return *this;
     40 }
     41 
     42 void 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 
     58 char* 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 
     77 U_NAMESPACE_END
     78