From 3e8fb05f7cd73dacc076baa7bd65a9750a6ce601 Mon Sep 17 00:00:00 2001 From: Fredrik Roubert Date: Wed, 12 Sep 2018 20:40:14 -0700 Subject: [PATCH] ICU-13417 Add the internal helper class CharStringByteSink. This is an implementation of the public ICU ByteSink interface that writes to the ICU internal class CharString. --- icu4c/source/common/bytesinkutil.cpp | 38 ++++++++++++++++++++++++++++ icu4c/source/common/bytesinkutil.h | 22 ++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/icu4c/source/common/bytesinkutil.cpp b/icu4c/source/common/bytesinkutil.cpp index 6af7ddfd597..c64a845f875 100644 --- a/icu4c/source/common/bytesinkutil.cpp +++ b/icu4c/source/common/bytesinkutil.cpp @@ -11,6 +11,7 @@ #include "unicode/utf8.h" #include "unicode/utf16.h" #include "bytesinkutil.h" +#include "charstr.h" #include "cmemory.h" #include "uassert.h" @@ -120,4 +121,41 @@ ByteSinkUtil::appendUnchanged(const uint8_t *s, const uint8_t *limit, return TRUE; } +CharStringByteSink::CharStringByteSink(CharString* dest) : dest_(*dest) { +} + +CharStringByteSink::~CharStringByteSink() = default; + +void +CharStringByteSink::Append(const char* bytes, int32_t n) { + UErrorCode status = U_ZERO_ERROR; + dest_.append(bytes, n, status); + // Any errors are silently ignored. +} + +char* +CharStringByteSink::GetAppendBuffer(int32_t min_capacity, + int32_t desired_capacity_hint, + char* scratch, + int32_t scratch_capacity, + int32_t* result_capacity) { + if (min_capacity < 1 || scratch_capacity < min_capacity) { + *result_capacity = 0; + return nullptr; + } + + UErrorCode status = U_ZERO_ERROR; + char* result = dest_.getAppendBuffer( + min_capacity, + desired_capacity_hint, + *result_capacity, + status); + if (U_SUCCESS(status)) { + return result; + } + + *result_capacity = scratch_capacity; + return scratch; +} + U_NAMESPACE_END diff --git a/icu4c/source/common/bytesinkutil.h b/icu4c/source/common/bytesinkutil.h index 8287ffea4ca..69e4cbcd263 100644 --- a/icu4c/source/common/bytesinkutil.h +++ b/icu4c/source/common/bytesinkutil.h @@ -13,6 +13,7 @@ U_NAMESPACE_BEGIN class ByteSink; +class CharString; class Edits; class U_COMMON_API ByteSinkUtil { @@ -58,4 +59,25 @@ private: ByteSink &sink, uint32_t options, Edits *edits); }; +class CharStringByteSink : public ByteSink { +public: + CharStringByteSink(CharString* dest); + ~CharStringByteSink() override; + + CharStringByteSink() = delete; + CharStringByteSink(const CharStringByteSink&) = delete; + CharStringByteSink& operator=(const CharStringByteSink&) = delete; + + void Append(const char* bytes, int32_t n) override; + + char* GetAppendBuffer(int32_t min_capacity, + int32_t desired_capacity_hint, + char* scratch, + int32_t scratch_capacity, + int32_t* result_capacity) override; + +private: + CharString& dest_; +}; + U_NAMESPACE_END