]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | ******************************************************************************* | |
3 | * Copyright (C) 2011, International Business Machines | |
4 | * Corporation and others. All Rights Reserved. | |
5 | ******************************************************************************* | |
6 | * file name: unistr_titlecase_brkiter.cpp | |
7 | * encoding: US-ASCII | |
8 | * tab size: 8 (not used) | |
9 | * indentation:2 | |
10 | * | |
11 | * created on: 2011may30 | |
12 | * created by: Markus W. Scherer | |
13 | * | |
14 | * Titlecasing functions that are based on BreakIterator | |
15 | * were moved here to break dependency cycles among parts of the common library. | |
16 | */ | |
17 | ||
18 | #include "unicode/utypes.h" | |
19 | ||
20 | #if !UCONFIG_NO_BREAK_ITERATION | |
21 | ||
22 | #include "unicode/brkiter.h" | |
23 | #include "unicode/ubrk.h" | |
24 | #include "unicode/unistr.h" | |
25 | #include "unicode/ustring.h" | |
26 | #include "cmemory.h" | |
27 | #include "ustr_imp.h" | |
28 | ||
29 | static int32_t U_CALLCONV | |
30 | unistr_case_internalToTitle(const UCaseMap *csm, | |
31 | UChar *dest, int32_t destCapacity, | |
32 | const UChar *src, int32_t srcLength, | |
33 | UErrorCode *pErrorCode) { | |
34 | ubrk_setText(csm->iter, src, srcLength, pErrorCode); | |
35 | return ustrcase_internalToTitle(csm, dest, destCapacity, src, srcLength, pErrorCode); | |
36 | } | |
37 | ||
38 | /* | |
39 | * Set parameters on an empty UCaseMap, for UCaseMap-less API functions. | |
40 | * Do this fast because it is called with every function call. | |
41 | */ | |
42 | static inline void | |
43 | setTempCaseMap(UCaseMap *csm, const char *locale) { | |
44 | if(csm->csp==NULL) { | |
45 | csm->csp=ucase_getSingleton(); | |
46 | } | |
47 | if(locale!=NULL && locale[0]==0) { | |
48 | csm->locale[0]=0; | |
49 | } else { | |
50 | ustrcase_setTempCaseMapLocale(csm, locale); | |
51 | } | |
52 | } | |
53 | ||
54 | U_NAMESPACE_BEGIN | |
55 | ||
56 | UnicodeString & | |
57 | UnicodeString::toTitle(BreakIterator *titleIter) { | |
58 | return toTitle(titleIter, Locale::getDefault(), 0); | |
59 | } | |
60 | ||
61 | UnicodeString & | |
62 | UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale) { | |
63 | return toTitle(titleIter, locale, 0); | |
64 | } | |
65 | ||
66 | UnicodeString & | |
67 | UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale, uint32_t options) { | |
68 | UCaseMap csm=UCASEMAP_INITIALIZER; | |
69 | csm.options=options; | |
70 | setTempCaseMap(&csm, locale.getName()); | |
71 | BreakIterator *bi=titleIter; | |
72 | if(bi==NULL) { | |
73 | UErrorCode errorCode=U_ZERO_ERROR; | |
74 | bi=BreakIterator::createWordInstance(locale, errorCode); | |
75 | if(U_FAILURE(errorCode)) { | |
76 | setToBogus(); | |
77 | return *this; | |
78 | } | |
79 | } | |
80 | csm.iter=reinterpret_cast<UBreakIterator *>(bi); | |
81 | caseMap(&csm, unistr_case_internalToTitle); | |
82 | if(titleIter==NULL) { | |
83 | delete bi; | |
84 | } | |
85 | return *this; | |
86 | } | |
87 | ||
88 | U_NAMESPACE_END | |
89 | ||
90 | #endif // !UCONFIG_NO_BREAK_ITERATION |