Home | History | Annotate | Download | only in common
      1 // Copyright (C) 2009-2010, 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 char* ByteSink::GetAppendBuffer(int32_t min_capacity,
     14                                 int32_t /*desired_capacity_hint*/,
     15                                 char* scratch, int32_t scratch_capacity,
     16                                 int32_t* result_capacity) {
     17   if (min_capacity < 1 || scratch_capacity < min_capacity) {
     18     *result_capacity = 0;
     19     return NULL;
     20   }
     21   *result_capacity = scratch_capacity;
     22   return scratch;
     23 }
     24 
     25 void ByteSink::Flush() {}
     26 
     27 CheckedArrayByteSink::CheckedArrayByteSink(char* outbuf, int32_t capacity)
     28     : outbuf_(outbuf), capacity_(capacity < 0 ? 0 : capacity),
     29       size_(0), appended_(0), overflowed_(FALSE) {
     30 }
     31 
     32 CheckedArrayByteSink& CheckedArrayByteSink::Reset() {
     33   size_ = appended_ = 0;
     34   overflowed_ = FALSE;
     35   return *this;
     36 }
     37 
     38 void CheckedArrayByteSink::Append(const char* bytes, int32_t n) {
     39   if (n <= 0) {
     40     return;
     41   }
     42   appended_ += n;
     43   int32_t available = capacity_ - size_;
     44   if (n > available) {
     45     n = available;
     46     overflowed_ = TRUE;
     47   }
     48   if (n > 0 && bytes != (outbuf_ + size_)) {
     49     uprv_memcpy(outbuf_ + size_, bytes, n);
     50   }
     51   size_ += n;
     52 }
     53 
     54 char* CheckedArrayByteSink::GetAppendBuffer(int32_t min_capacity,
     55                                             int32_t /*desired_capacity_hint*/,
     56                                             char* scratch,
     57                                             int32_t scratch_capacity,
     58                                             int32_t* result_capacity) {
     59   if (min_capacity < 1 || scratch_capacity < min_capacity) {
     60     *result_capacity = 0;
     61     return NULL;
     62   }
     63   int32_t available = capacity_ - size_;
     64   if (available >= min_capacity) {
     65     *result_capacity = available;
     66     return outbuf_ + size_;
     67   } else {
     68     *result_capacity = scratch_capacity;
     69     return scratch;
     70   }
     71 }
     72 
     73 U_NAMESPACE_END
     74