2 *****************************************************************************************
3 * Copyright (C) 1996-2004, International Business Machines
4 * Corporation and others. All Rights Reserved.
5 *****************************************************************************************
8 #include "unicode/utypes.h"
10 #if !UCONFIG_NO_BREAK_ITERATION
12 #include "unicode/ubrk.h"
14 #include "unicode/brkiter.h"
15 #include "unicode/uloc.h"
16 #include "unicode/ustring.h"
17 #include "unicode/uchriter.h"
18 #include "unicode/rbbi.h"
23 //----------------------------------------------------------------------------------------
25 // ubrk_open Create a canned type of break iterator based on type (word, line, etc.)
28 //----------------------------------------------------------------------------------------
29 U_CAPI UBreakIterator
* U_EXPORT2
30 ubrk_open(UBreakIteratorType type
,
37 if(U_FAILURE(*status
)) return 0;
39 BreakIterator
*result
= 0;
44 result
= BreakIterator::createCharacterInstance(Locale(locale
), *status
);
48 result
= BreakIterator::createWordInstance(Locale(locale
), *status
);
52 result
= BreakIterator::createLineInstance(Locale(locale
), *status
);
56 result
= BreakIterator::createSentenceInstance(Locale(locale
), *status
);
60 result
= BreakIterator::createTitleInstance(Locale(locale
), *status
);
64 // check for allocation error
65 if (U_FAILURE(*status
)) {
69 *status
= U_MEMORY_ALLOCATION_ERROR
;
73 UCharCharacterIterator
*iter
= 0;
74 iter
= new UCharCharacterIterator(text
, textLength
);
76 *status
= U_MEMORY_ALLOCATION_ERROR
;
80 result
->adoptText(iter
);
82 return (UBreakIterator
*)result
;
87 //----------------------------------------------------------------------------------------
89 // ubrk_openRules open a break iterator from a set of break rules.
90 // Invokes the rule builder.
92 //----------------------------------------------------------------------------------------
93 U_CAPI UBreakIterator
* U_EXPORT2
94 ubrk_openRules( const UChar
*rules
,
98 UParseError
*parseErr
,
101 if (status
== NULL
|| U_FAILURE(*status
)){
105 BreakIterator
*result
= 0;
106 UnicodeString
ruleString(rules
, rulesLength
);
107 result
= RBBIRuleBuilder::createRuleBasedBreakIterator(ruleString
, *parseErr
, *status
);
108 if(U_FAILURE(*status
)) {
113 UCharCharacterIterator
*iter
= 0;
114 iter
= new UCharCharacterIterator(text
, textLength
);
116 *status
= U_MEMORY_ALLOCATION_ERROR
;
120 result
->adoptText(iter
);
122 return (UBreakIterator
*)result
;
129 U_CAPI UBreakIterator
* U_EXPORT2
131 const UBreakIterator
*bi
,
133 int32_t *pBufferSize
,
136 if (status
== NULL
|| U_FAILURE(*status
)){
139 if (!pBufferSize
|| !bi
){
140 *status
= U_ILLEGAL_ARGUMENT_ERROR
;
143 return (UBreakIterator
*)(((BreakIterator
*)bi
)->
144 createBufferClone(stackBuffer
, *pBufferSize
, *status
));
149 U_CAPI
void U_EXPORT2
150 ubrk_close(UBreakIterator
*bi
)
152 BreakIterator
*ubi
= (BreakIterator
*) bi
;
154 if (ubi
->isBufferClone()) {
155 ubi
->~BreakIterator();
156 *(uint32_t *)ubi
= 0xdeadbeef;
163 U_CAPI
void U_EXPORT2
164 ubrk_setText(UBreakIterator
* bi
,
170 if (U_FAILURE(*status
)) return;
172 const CharacterIterator
& biText
= ((BreakIterator
*)bi
)->getText();
174 int32_t textLen
= (textLength
== -1 ? u_strlen(text
) : textLength
);
175 if (biText
.getDynamicClassID() == UCharCharacterIterator::getStaticClassID()) {
176 ((UCharCharacterIterator
&)biText
).setText(text
, textLen
);
179 UCharCharacterIterator
*iter
= 0;
180 iter
= new UCharCharacterIterator(text
, textLen
);
182 *status
= U_MEMORY_ALLOCATION_ERROR
;
185 ((BreakIterator
*)bi
)->adoptText(iter
);
189 U_CAPI
int32_t U_EXPORT2
190 ubrk_current(const UBreakIterator
*bi
)
193 return ((BreakIterator
*)bi
)->current();
196 U_CAPI
int32_t U_EXPORT2
197 ubrk_next(UBreakIterator
*bi
)
200 return ((BreakIterator
*)bi
)->next();
203 U_CAPI
int32_t U_EXPORT2
204 ubrk_previous(UBreakIterator
*bi
)
207 return ((BreakIterator
*)bi
)->previous();
210 U_CAPI
int32_t U_EXPORT2
211 ubrk_first(UBreakIterator
*bi
)
214 return ((BreakIterator
*)bi
)->first();
217 U_CAPI
int32_t U_EXPORT2
218 ubrk_last(UBreakIterator
*bi
)
221 return ((BreakIterator
*)bi
)->last();
224 U_CAPI
int32_t U_EXPORT2
225 ubrk_preceding(UBreakIterator
*bi
,
229 return ((BreakIterator
*)bi
)->preceding(offset
);
232 U_CAPI
int32_t U_EXPORT2
233 ubrk_following(UBreakIterator
*bi
,
237 return ((BreakIterator
*)bi
)->following(offset
);
240 U_CAPI
const char* U_EXPORT2
241 ubrk_getAvailable(int32_t index
)
244 return uloc_getAvailable(index
);
247 U_CAPI
int32_t U_EXPORT2
248 ubrk_countAvailable()
251 return uloc_countAvailable();
255 U_CAPI UBool U_EXPORT2
256 ubrk_isBoundary(UBreakIterator
*bi
, int32_t offset
)
258 return ((BreakIterator
*)bi
)->isBoundary(offset
);
262 U_CAPI
int32_t U_EXPORT2
263 ubrk_getRuleStatus(UBreakIterator
*bi
)
265 return ((RuleBasedBreakIterator
*)bi
)->getRuleStatus();
268 U_CAPI
int32_t U_EXPORT2
269 ubrk_getRuleStatusVec(UBreakIterator
*bi
, int32_t *fillInVec
, int32_t capacity
, UErrorCode
*status
)
271 return ((RuleBasedBreakIterator
*)bi
)->getRuleStatusVec(fillInVec
, capacity
, *status
);
275 U_CAPI
const char* U_EXPORT2
276 ubrk_getLocaleByType(const UBreakIterator
*bi
,
277 ULocDataLocaleType type
,
281 if (U_SUCCESS(*status
)) {
282 *status
= U_ILLEGAL_ARGUMENT_ERROR
;
286 return ((BreakIterator
*)bi
)->getLocaleID(type
, *status
);
290 #endif /* #if !UCONFIG_NO_BREAK_ITERATION */