| Index: source/common/brkiter.cpp
|
| diff --git a/source/common/brkiter.cpp b/source/common/brkiter.cpp
|
| index a4e4466808a3dae236d45bab302185bb070024c7..d466fb80d25e952c0ccb9600732fba2d6dc45faa 100644
|
| --- a/source/common/brkiter.cpp
|
| +++ b/source/common/brkiter.cpp
|
| @@ -1,6 +1,6 @@
|
| /*
|
| *******************************************************************************
|
| -* Copyright (C) 1997-2014, International Business Machines Corporation and
|
| +* Copyright (C) 1997-2015, International Business Machines Corporation and
|
| * others. All Rights Reserved.
|
| *******************************************************************************
|
| *
|
| @@ -27,6 +27,7 @@
|
| #include "unicode/udata.h"
|
| #include "unicode/ures.h"
|
| #include "unicode/ustring.h"
|
| +#include "unicode/filteredbrk.h"
|
| #include "ucln_cmn.h"
|
| #include "cstring.h"
|
| #include "umutex.h"
|
| @@ -69,13 +70,7 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, int32_t kind,
|
| ures_initStackObject(brkName);
|
|
|
| // Get the locale
|
| - UResourceBundle *b = ures_open(U_ICUDATA_BRKITR, loc.getName(), &status);
|
| - /* this is a hack for now. Should be fixed when the data is fetched from
|
| - brk_index.txt */
|
| - if(status==U_USING_DEFAULT_WARNING){
|
| - status=U_ZERO_ERROR;
|
| - ures_openFillIn(b, U_ICUDATA_BRKITR, "", &status);
|
| - }
|
| + UResourceBundle *b = ures_openNoDefault(U_ICUDATA_BRKITR, loc.getName(), &status);
|
|
|
| // Get the "boundaries" array.
|
| if (U_SUCCESS(status)) {
|
| @@ -389,6 +384,7 @@ BreakIterator::createInstance(const Locale& loc, int32_t kind, UErrorCode& statu
|
| }
|
|
|
| // -------------------------------------
|
| +enum { kKeyValueLenMax = 32 };
|
|
|
| BreakIterator*
|
| BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status)
|
| @@ -397,6 +393,7 @@ BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status)
|
| if (U_FAILURE(status)) {
|
| return NULL;
|
| }
|
| + char lbType[kKeyValueLenMax];
|
|
|
| BreakIterator *result = NULL;
|
| switch (kind) {
|
| @@ -407,10 +404,32 @@ BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status)
|
| result = BreakIterator::buildInstance(loc, "word", kind, status);
|
| break;
|
| case UBRK_LINE:
|
| - result = BreakIterator::buildInstance(loc, "line", kind, status);
|
| + uprv_strcpy(lbType, "line");
|
| + {
|
| + char lbKeyValue[kKeyValueLenMax] = {0};
|
| + UErrorCode kvStatus = U_ZERO_ERROR;
|
| + int32_t kLen = loc.getKeywordValue("lb", lbKeyValue, kKeyValueLenMax, kvStatus);
|
| + if (U_SUCCESS(kvStatus) && kLen > 0 && (uprv_strcmp(lbKeyValue,"strict")==0 || uprv_strcmp(lbKeyValue,"normal")==0 || uprv_strcmp(lbKeyValue,"loose")==0)) {
|
| + uprv_strcat(lbType, "_");
|
| + uprv_strcat(lbType, lbKeyValue);
|
| + }
|
| + }
|
| + result = BreakIterator::buildInstance(loc, lbType, kind, status);
|
| break;
|
| case UBRK_SENTENCE:
|
| result = BreakIterator::buildInstance(loc, "sentence", kind, status);
|
| + {
|
| + char ssKeyValue[kKeyValueLenMax] = {0};
|
| + UErrorCode kvStatus = U_ZERO_ERROR;
|
| + int32_t kLen = loc.getKeywordValue("ss", ssKeyValue, kKeyValueLenMax, kvStatus);
|
| + if (U_SUCCESS(kvStatus) && kLen > 0 && uprv_strcmp(ssKeyValue,"standard")==0) {
|
| + FilteredBreakIteratorBuilder* fbiBuilder = FilteredBreakIteratorBuilder::createInstance(loc, kvStatus);
|
| + if (U_SUCCESS(kvStatus)) {
|
| + result = fbiBuilder->build(result, status);
|
| + delete fbiBuilder;
|
| + }
|
| + }
|
| + }
|
| break;
|
| case UBRK_TITLE:
|
| result = BreakIterator::buildInstance(loc, "title", kind, status);
|
|
|