1/* 2******************************************************************************* 3* Copyright (C) 2011, International Business Machines 4* Corporation and others. All Rights Reserved. 5******************************************************************************* 6* file name: ustr_titlecase_brkiter.cpp 7* encoding: US-ASCII 8* tab size: 8 (not used) 9* indentation:4 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/ucasemap.h" 25#include "cmemory.h" 26#include "ucase.h" 27#include "ustr_imp.h" 28 29/* functions available in the common library (for unistr_case.cpp) */ 30 31/* 32 * Set parameters on an empty UCaseMap, for UCaseMap-less API functions. 33 * Do this fast because it is called with every function call. 34 * Duplicate of the same function in ustrcase.cpp, to keep it inline. 35 */ 36static inline void 37setTempCaseMap(UCaseMap *csm, const char *locale) { 38 if(csm->csp==NULL) { 39 csm->csp=ucase_getSingleton(); 40 } 41 if(locale!=NULL && locale[0]==0) { 42 csm->locale[0]=0; 43 } else { 44 ustrcase_setTempCaseMapLocale(csm, locale); 45 } 46} 47 48/* public API functions */ 49 50U_CAPI int32_t U_EXPORT2 51u_strToTitle(UChar *dest, int32_t destCapacity, 52 const UChar *src, int32_t srcLength, 53 UBreakIterator *titleIter, 54 const char *locale, 55 UErrorCode *pErrorCode) { 56 UCaseMap csm=UCASEMAP_INITIALIZER; 57 setTempCaseMap(&csm, locale); 58 if(titleIter!=NULL) { 59 ubrk_setText(csm.iter=titleIter, src, srcLength, pErrorCode); 60 } else { 61 csm.iter=ubrk_open(UBRK_WORD, csm.locale, src, srcLength, pErrorCode); 62 } 63 int32_t length=ustrcase_map( 64 &csm, 65 dest, destCapacity, 66 src, srcLength, 67 ustrcase_internalToTitle, pErrorCode); 68 if(titleIter==NULL && csm.iter!=NULL) { 69 ubrk_close(csm.iter); 70 } 71 return length; 72} 73 74U_CAPI int32_t U_EXPORT2 75ucasemap_toTitle(UCaseMap *csm, 76 UChar *dest, int32_t destCapacity, 77 const UChar *src, int32_t srcLength, 78 UErrorCode *pErrorCode) { 79 if(csm->iter!=NULL) { 80 ubrk_setText(csm->iter, src, srcLength, pErrorCode); 81 } else { 82 csm->iter=ubrk_open(UBRK_WORD, csm->locale, src, srcLength, pErrorCode); 83 } 84 return ustrcase_map( 85 csm, 86 dest, destCapacity, 87 src, srcLength, 88 ustrcase_internalToTitle, pErrorCode); 89} 90 91#endif // !UCONFIG_NO_BREAK_ITERATION 92