1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
4 *******************************************************************************
5 * Copyright (C) 2011, International Business Machines
6 * Corporation and others. All Rights Reserved.
7 *******************************************************************************
8 * file name: ucasemap_titlecase_brkiter.cpp
10 * tab size: 8 (not used)
13 * created on: 2011jun02
14 * created by: Markus W. Scherer
16 * Titlecasing functions that are based on BreakIterator
17 * were moved here to break dependency cycles among parts of the common library.
20 #include "unicode/utypes.h"
22 #if !UCONFIG_NO_BREAK_ITERATION
24 #include "unicode/brkiter.h"
25 #include "unicode/ubrk.h"
26 #include "unicode/casemap.h"
27 #include "unicode/ucasemap.h"
30 #include "ucasemap_imp.h"
34 void CaseMap::utf8ToTitle(
35 const char *locale
, uint32_t options
, BreakIterator
*iter
,
36 StringPiece src
, ByteSink
&sink
, Edits
*edits
,
37 UErrorCode
&errorCode
) {
38 if (U_FAILURE(errorCode
)) {
41 UText utext
= UTEXT_INITIALIZER
;
42 utext_openUTF8(&utext
, src
.data(), src
.length(), &errorCode
);
43 LocalPointer
<BreakIterator
> ownedIter
;
44 iter
= ustrcase_getTitleBreakIterator(nullptr, locale
, options
, iter
, ownedIter
, errorCode
);
45 if (iter
== nullptr) {
49 iter
->setText(&utext
, errorCode
);
51 ustrcase_getCaseLocale(locale
), options
, iter
,
52 src
.data(), src
.length(),
53 ucasemap_internalUTF8ToTitle
, sink
, edits
, errorCode
);
57 int32_t CaseMap::utf8ToTitle(
58 const char *locale
, uint32_t options
, BreakIterator
*iter
,
59 const char *src
, int32_t srcLength
,
60 char *dest
, int32_t destCapacity
, Edits
*edits
,
61 UErrorCode
&errorCode
) {
62 if (U_FAILURE(errorCode
)) {
65 UText utext
=UTEXT_INITIALIZER
;
66 utext_openUTF8(&utext
, src
, srcLength
, &errorCode
);
67 LocalPointer
<BreakIterator
> ownedIter
;
68 iter
= ustrcase_getTitleBreakIterator(nullptr, locale
, options
, iter
, ownedIter
, errorCode
);
73 iter
->setText(&utext
, errorCode
);
74 int32_t length
=ucasemap_mapUTF8(
75 ustrcase_getCaseLocale(locale
), options
, iter
,
78 ucasemap_internalUTF8ToTitle
, edits
, errorCode
);
87 U_CAPI
const UBreakIterator
* U_EXPORT2
88 ucasemap_getBreakIterator(const UCaseMap
*csm
) {
89 return reinterpret_cast<UBreakIterator
*>(csm
->iter
);
93 ucasemap_setBreakIterator(UCaseMap
*csm
, UBreakIterator
*iterToAdopt
, UErrorCode
*pErrorCode
) {
94 if(U_FAILURE(*pErrorCode
)) {
98 csm
->iter
=reinterpret_cast<BreakIterator
*>(iterToAdopt
);
101 U_CAPI
int32_t U_EXPORT2
102 ucasemap_utf8ToTitle(UCaseMap
*csm
,
103 char *dest
, int32_t destCapacity
,
104 const char *src
, int32_t srcLength
,
105 UErrorCode
*pErrorCode
) {
106 if (U_FAILURE(*pErrorCode
)) {
109 UText utext
=UTEXT_INITIALIZER
;
110 utext_openUTF8(&utext
, (const char *)src
, srcLength
, pErrorCode
);
111 if (U_FAILURE(*pErrorCode
)) {
114 if(csm
->iter
==NULL
) {
115 LocalPointer
<BreakIterator
> ownedIter
;
116 BreakIterator
*iter
= ustrcase_getTitleBreakIterator(
117 nullptr, csm
->locale
, csm
->options
, nullptr, ownedIter
, *pErrorCode
);
118 if (iter
== nullptr) {
122 csm
->iter
= ownedIter
.orphan();
124 csm
->iter
->setText(&utext
, *pErrorCode
);
125 int32_t length
=ucasemap_mapUTF8(
126 csm
->caseLocale
, csm
->options
, csm
->iter
,
129 ucasemap_internalUTF8ToTitle
, NULL
, *pErrorCode
);
134 #endif // !UCONFIG_NO_BREAK_ITERATION