/*
-*****************************************************************************************
-* Copyright (C) 1996-2004, International Business Machines
+********************************************************************************
+* Copyright (C) 1996-2008, International Business Machines
* Corporation and others. All Rights Reserved.
-*****************************************************************************************
+********************************************************************************
*/
#include "unicode/utypes.h"
#include "unicode/uchriter.h"
#include "unicode/rbbi.h"
#include "rbbirb.h"
+#include "uassert.h"
U_NAMESPACE_USE
-//----------------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
//
// ubrk_open Create a canned type of break iterator based on type (word, line, etc.)
// and locale.
//
-//----------------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
U_CAPI UBreakIterator* U_EXPORT2
ubrk_open(UBreakIteratorType type,
const char *locale,
case UBRK_TITLE:
result = BreakIterator::createTitleInstance(Locale(locale), *status);
break;
+
+ default:
+ *status = U_ILLEGAL_ARGUMENT_ERROR;
}
// check for allocation error
return 0;
}
- UCharCharacterIterator *iter = 0;
- iter = new UCharCharacterIterator(text, textLength);
- if(iter == 0) {
- *status = U_MEMORY_ALLOCATION_ERROR;
- delete result;
- return 0;
- }
- result->adoptText(iter);
- return (UBreakIterator*)result;
+ UBreakIterator *uBI = (UBreakIterator *)result;
+ if (text != NULL) {
+ ubrk_setText(uBI, text, textLength, status);
+ }
+ return uBI;
}
-//----------------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
//
// ubrk_openRules open a break iterator from a set of break rules.
// Invokes the rule builder.
//
-//----------------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
U_CAPI UBreakIterator* U_EXPORT2
ubrk_openRules( const UChar *rules,
int32_t rulesLength,
BreakIterator *result = 0;
UnicodeString ruleString(rules, rulesLength);
- result = RBBIRuleBuilder::createRuleBasedBreakIterator(ruleString, *parseErr, *status);
+ result = RBBIRuleBuilder::createRuleBasedBreakIterator(ruleString, parseErr, *status);
if(U_FAILURE(*status)) {
return 0;
}
+ UBreakIterator *uBI = (UBreakIterator *)result;
if (text != NULL) {
- UCharCharacterIterator *iter = 0;
- iter = new UCharCharacterIterator(text, textLength);
- if(iter == 0) {
- *status = U_MEMORY_ALLOCATION_ERROR;
- delete result;
- return 0;
- }
- result->adoptText(iter);
+ ubrk_setText(uBI, text, textLength, status);
}
- return (UBreakIterator *)result;
+ return uBI;
}
*status = U_ILLEGAL_ARGUMENT_ERROR;
return 0;
}
+ // Clear any incoming Safe Clone Allocated warning.
+ // Propagating this through to our return would really
+ // confuse our caller.
+ if (*status==U_SAFECLONE_ALLOCATED_WARNING) {
+ *status = U_ZERO_ERROR;
+ }
return (UBreakIterator *)(((BreakIterator*)bi)->
createBufferClone(stackBuffer, *pBufferSize, *status));
}
int32_t textLength,
UErrorCode* status)
{
+ BreakIterator *brit = (BreakIterator *)bi;
+ UText ut = UTEXT_INITIALIZER;
+ utext_openUChars(&ut, text, textLength, status);
+ brit->setText(&ut, *status);
+ // A stack allocated UText wrapping a UCHar * string
+ // can be dumped without explicitly closing it.
+}
- if (U_FAILURE(*status)) return;
- const CharacterIterator& biText = ((BreakIterator*)bi)->getText();
- int32_t textLen = (textLength == -1 ? u_strlen(text) : textLength);
- if (biText.getDynamicClassID() == UCharCharacterIterator::getStaticClassID()) {
- ((UCharCharacterIterator&)biText).setText(text, textLen);
- }
- else {
- UCharCharacterIterator *iter = 0;
- iter = new UCharCharacterIterator(text, textLen);
- if(iter == 0) {
- *status = U_MEMORY_ALLOCATION_ERROR;
- return;
- }
- ((BreakIterator*)bi)->adoptText(iter);
- }
+U_CAPI void U_EXPORT2
+ubrk_setUText(UBreakIterator *bi,
+ UText *text,
+ UErrorCode *status)
+{
+ RuleBasedBreakIterator *brit = (RuleBasedBreakIterator *)bi;
+ brit->RuleBasedBreakIterator::setText(text, *status);
}
+
+
+
+
U_CAPI int32_t U_EXPORT2
ubrk_current(const UBreakIterator *bi)
{
- return ((BreakIterator*)bi)->current();
+ return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::current();
}
U_CAPI int32_t U_EXPORT2
ubrk_next(UBreakIterator *bi)
{
- return ((BreakIterator*)bi)->next();
+ return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::next();
}
U_CAPI int32_t U_EXPORT2
ubrk_previous(UBreakIterator *bi)
{
- return ((BreakIterator*)bi)->previous();
+ return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::previous();
}
U_CAPI int32_t U_EXPORT2
ubrk_first(UBreakIterator *bi)
{
- return ((BreakIterator*)bi)->first();
+ return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::first();
}
U_CAPI int32_t U_EXPORT2
ubrk_last(UBreakIterator *bi)
{
- return ((BreakIterator*)bi)->last();
+ return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::last();
}
U_CAPI int32_t U_EXPORT2
int32_t offset)
{
- return ((BreakIterator*)bi)->preceding(offset);
+ return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::preceding(offset);
}
U_CAPI int32_t U_EXPORT2
int32_t offset)
{
- return ((BreakIterator*)bi)->following(offset);
+ return ((RuleBasedBreakIterator*)bi)->RuleBasedBreakIterator::following(offset);
}
U_CAPI const char* U_EXPORT2
U_CAPI UBool U_EXPORT2
ubrk_isBoundary(UBreakIterator *bi, int32_t offset)
{
- return ((BreakIterator *)bi)->isBoundary(offset);
+ return ((RuleBasedBreakIterator *)bi)->RuleBasedBreakIterator::isBoundary(offset);
}
U_CAPI int32_t U_EXPORT2
ubrk_getRuleStatus(UBreakIterator *bi)
{
- return ((RuleBasedBreakIterator *)bi)->getRuleStatus();
+ return ((RuleBasedBreakIterator *)bi)->RuleBasedBreakIterator::getRuleStatus();
}
U_CAPI int32_t U_EXPORT2
ubrk_getRuleStatusVec(UBreakIterator *bi, int32_t *fillInVec, int32_t capacity, UErrorCode *status)
{
- return ((RuleBasedBreakIterator *)bi)->getRuleStatusVec(fillInVec, capacity, *status);
+ return ((RuleBasedBreakIterator *)bi)->RuleBasedBreakIterator::getRuleStatusVec(fillInVec, capacity, *status);
}
U_CAPI const char* U_EXPORT2
-ubrk_getLocaleByType(const UBreakIterator *bi,
- ULocDataLocaleType type,
+ubrk_getLocaleByType(const UBreakIterator *bi,
+ ULocDataLocaleType type,
UErrorCode* status)
{
if (bi == NULL) {