X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=source%2Fcommon%2Funistr_titlecase_brkiter.cpp;h=3d6737cfc5e3d9601a3d9c48a1c70dd0916a6f41;hb=4125abc39e19d514b1b9199bcb36929ac7ce912e;hp=3156fdfc5754af9abc25477e6b19d622297ea373;hpb=febceca83f95a8bebf5c871640fd82af8c3721bb;p=platform%2Fupstream%2Ficu.git diff --git a/source/common/unistr_titlecase_brkiter.cpp b/source/common/unistr_titlecase_brkiter.cpp index 3156fdf..3d6737c 100644 --- a/source/common/unistr_titlecase_brkiter.cpp +++ b/source/common/unistr_titlecase_brkiter.cpp @@ -1,4 +1,4 @@ -// © 2016 and later: Unicode, Inc. and others. +// Copyright (C) 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: unistr_titlecase_brkiter.cpp -* encoding: UTF-8 +* encoding: US-ASCII * tab size: 8 (not used) * indentation:2 * @@ -22,10 +22,36 @@ #if !UCONFIG_NO_BREAK_ITERATION #include "unicode/brkiter.h" -#include "unicode/locid.h" -#include "unicode/ucasemap.h" +#include "unicode/ubrk.h" #include "unicode/unistr.h" -#include "ucasemap_imp.h" +#include "unicode/ustring.h" +#include "cmemory.h" +#include "ustr_imp.h" + +static int32_t U_CALLCONV +unistr_case_internalToTitle(const UCaseMap *csm, + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + UErrorCode *pErrorCode) { + ubrk_setText(csm->iter, src, srcLength, pErrorCode); + return ustrcase_internalToTitle(csm, dest, destCapacity, src, srcLength, pErrorCode); +} + +/* + * Set parameters on an empty UCaseMap, for UCaseMap-less API functions. + * Do this fast because it is called with every function call. + */ +static inline void +setTempCaseMap(UCaseMap *csm, const char *locale) { + if(csm->csp==NULL) { + csm->csp=ucase_getSingleton(); + } + if(locale!=NULL && locale[0]==0) { + csm->locale[0]=0; + } else { + ustrcase_setTempCaseMapLocale(csm, locale); + } +} U_NAMESPACE_BEGIN @@ -41,6 +67,9 @@ UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale) { UnicodeString & UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale, uint32_t options) { + UCaseMap csm=UCASEMAP_INITIALIZER; + csm.options=options; + setTempCaseMap(&csm, locale.getName()); BreakIterator *bi=titleIter; if(bi==NULL) { UErrorCode errorCode=U_ZERO_ERROR; @@ -50,12 +79,8 @@ UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale, uint32_t return *this; } } - // Because the "this" string is both the source and the destination, - // make a copy of the original source for use by the break iterator. - // See tickets #13127 and #13128 - UnicodeString copyOfInput(*this); - bi->setText(copyOfInput); - caseMap(ustrcase_getCaseLocale(locale.getBaseName()), options, bi, ustrcase_internalToTitle); + csm.iter=reinterpret_cast(bi); + caseMap(&csm, unistr_case_internalToTitle); if(titleIter==NULL) { delete bi; }