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); |