1 // Copyright (C) 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
4 ********************************************************************************
5 * Copyright (C) 1996-2015, International Business Machines
6 * Corporation and others. All Rights Reserved.
7 ********************************************************************************
10 #include "unicode/utypes.h"
12 #if !UCONFIG_NO_BREAK_ITERATION
14 #include "unicode/ubrk.h"
16 #include "unicode/brkiter.h"
17 #include "unicode/uloc.h"
18 #include "unicode/ustring.h"
19 #include "unicode/uchriter.h"
20 #include "unicode/rbbi.h"
26 //------------------------------------------------------------------------------
28 // ubrk_open Create a canned type of break iterator based on type (word, line, etc.)
31 //------------------------------------------------------------------------------
32 U_CAPI UBreakIterator* U_EXPORT2
33 ubrk_open(UBreakIteratorType type,
40 if(U_FAILURE(*status)) return 0;
42 BreakIterator *result = 0;
47 result = BreakIterator::createCharacterInstance(Locale(locale), *status);
51 result = BreakIterator::createWordInstance(Locale(locale), *status);
55 result = BreakIterator::createLineInstance(Locale(locale), *status);
59 result = BreakIterator::createSentenceInstance(Locale(locale), *status);
63 result = BreakIterator::createTitleInstance(Locale(locale), *status);
67 *status = U_ILLEGAL_ARGUMENT_ERROR;
70 // check for allocation error
71 if (U_FAILURE(*status)) {
75 *status = U_MEMORY_ALLOCATION_ERROR;
80 UBreakIterator *uBI = (UBreakIterator *)result;
82 ubrk_setText(uBI, text, textLength, status);
89 //------------------------------------------------------------------------------
91 // ubrk_openRules open a break iterator from a set of break rules.
92 // Invokes the rule builder.
94 //------------------------------------------------------------------------------
95 U_CAPI UBreakIterator* U_EXPORT2
96 ubrk_openRules( const UChar *rules,
100 UParseError *parseErr,
101 UErrorCode *status) {
103 if (status == NULL || U_FAILURE(*status)){
107 BreakIterator *result = 0;
108 UnicodeString ruleString(rules, rulesLength);
109 result = RBBIRuleBuilder::createRuleBasedBreakIterator(ruleString, parseErr, *status);
110 if(U_FAILURE(*status)) {
114 UBreakIterator *uBI = (UBreakIterator *)result;
116 ubrk_setText(uBI, text, textLength, status);
125 U_CAPI UBreakIterator * U_EXPORT2
127 const UBreakIterator *bi,
128 void * /*stackBuffer*/,
129 int32_t *pBufferSize,
132 if (status == NULL || U_FAILURE(*status)){
136 *status = U_ILLEGAL_ARGUMENT_ERROR;
139 if (pBufferSize != NULL) {
140 int32_t inputSize = *pBufferSize;
142 if (inputSize == 0) {
143 return NULL; // preflighting for deprecated functionality
146 BreakIterator *newBI = ((BreakIterator *)bi)->clone();
148 *status = U_MEMORY_ALLOCATION_ERROR;
150 *status = U_SAFECLONE_ALLOCATED_WARNING;
152 return (UBreakIterator *)newBI;
157 U_CAPI void U_EXPORT2
158 ubrk_close(UBreakIterator *bi)
160 delete (BreakIterator *)bi;
163 U_CAPI void U_EXPORT2
164 ubrk_setText(UBreakIterator* bi,
169 UText ut = UTEXT_INITIALIZER;
170 utext_openUChars(&ut, text, textLength, status);
171 ((BreakIterator*)bi)->setText(&ut, *status);
172 // A stack allocated UText wrapping a UChar * string
173 // can be dumped without explicitly closing it.
178 U_CAPI void U_EXPORT2
179 ubrk_setUText(UBreakIterator *bi,
183 ((BreakIterator*)bi)->setText(text, *status);
190 U_CAPI int32_t U_EXPORT2
191 ubrk_current(const UBreakIterator *bi)
194 return ((BreakIterator*)bi)->current();
197 U_CAPI int32_t U_EXPORT2
198 ubrk_next(UBreakIterator *bi)
201 return ((BreakIterator*)bi)->next();
204 U_CAPI int32_t U_EXPORT2
205 ubrk_previous(UBreakIterator *bi)
208 return ((BreakIterator*)bi)->previous();
211 U_CAPI int32_t U_EXPORT2
212 ubrk_first(UBreakIterator *bi)
215 return ((BreakIterator*)bi)->first();
218 U_CAPI int32_t U_EXPORT2
219 ubrk_last(UBreakIterator *bi)
222 return ((BreakIterator*)bi)->last();
225 U_CAPI int32_t U_EXPORT2
226 ubrk_preceding(UBreakIterator *bi,
230 return ((BreakIterator*)bi)->preceding(offset);
233 U_CAPI int32_t U_EXPORT2
234 ubrk_following(UBreakIterator *bi,
238 return ((BreakIterator*)bi)->following(offset);
241 U_CAPI const char* U_EXPORT2
242 ubrk_getAvailable(int32_t index)
245 return uloc_getAvailable(index);
248 U_CAPI int32_t U_EXPORT2
249 ubrk_countAvailable()
252 return uloc_countAvailable();
256 U_CAPI UBool U_EXPORT2
257 ubrk_isBoundary(UBreakIterator *bi, int32_t offset)
259 return ((BreakIterator*)bi)->isBoundary(offset);
263 U_CAPI int32_t U_EXPORT2
264 ubrk_getRuleStatus(UBreakIterator *bi)
266 return ((BreakIterator*)bi)->getRuleStatus();
269 U_CAPI int32_t U_EXPORT2
270 ubrk_getRuleStatusVec(UBreakIterator *bi, int32_t *fillInVec, int32_t capacity, UErrorCode *status)
272 return ((BreakIterator*)bi)->getRuleStatusVec(fillInVec, capacity, *status);
276 U_CAPI const char* U_EXPORT2
277 ubrk_getLocaleByType(const UBreakIterator *bi,
278 ULocDataLocaleType type,
282 if (U_SUCCESS(*status)) {
283 *status = U_ILLEGAL_ARGUMENT_ERROR;
287 return ((BreakIterator*)bi)->getLocaleID(type, *status);
291 void ubrk_refreshUText(UBreakIterator *bi,
295 BreakIterator *bii = reinterpret_cast<BreakIterator *>(bi);
296 bii->refreshInputText(text, *status);
301 #endif /* #if !UCONFIG_NO_BREAK_ITERATION */