X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/08b89b0a244153b9f5bbb2f49c55ab0f7298122e..ef6cf650f4a75c3f97de06b51fa104f2069b9ea2:/icuSources/common/brkiter.cpp diff --git a/icuSources/common/brkiter.cpp b/icuSources/common/brkiter.cpp index b6ff490c..065e6df9 100644 --- a/icuSources/common/brkiter.cpp +++ b/icuSources/common/brkiter.cpp @@ -1,6 +1,6 @@ /* ******************************************************************************* -* Copyright (C) 1997-2014, International Business Machines Corporation and +* Copyright (C) 1997-2016, 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" @@ -35,6 +36,8 @@ #include "uresimp.h" #include "uassert.h" #include "ubrkimpl.h" +#include "charstr.h" +#include "unicode/filteredbrk.h" // ***************************************************************************** // class BreakIterator @@ -52,7 +55,7 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, int32_t kind, { char fnbuff[256]; char ext[4]={'\0'}; - char actualLocale[ULOC_FULLNAME_CAPACITY]; + CharString actualLocale; int32_t size; const UChar* brkfname = NULL; UResourceBundle brkRulesStack; @@ -68,13 +71,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)) { @@ -93,9 +90,7 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, int32_t kind, // Use the string if we found it if (U_SUCCESS(status) && brkfname) { - uprv_strncpy(actualLocale, - ures_getLocaleInternal(brkName, &status), - sizeof(actualLocale)/sizeof(actualLocale[0])); + actualLocale.append(ures_getLocaleInternal(brkName, &status), -1, status); UChar* extStart=u_strchr(brkfname, 0x002e); int len = 0; @@ -123,7 +118,8 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, int32_t kind, // If there is a result, set the valid locale and actual locale, and the kind if (U_SUCCESS(status) && result != NULL) { U_LOCALE_BASED(locBased, *(BreakIterator*)result); - locBased.setLocaleIDs(ures_getLocaleByType(b, ULOC_VALID_LOCALE, &status), actualLocale); + locBased.setLocaleIDs(ures_getLocaleByType(b, ULOC_VALID_LOCALE, &status), + actualLocale.data()); result->setBreakType(kind); } @@ -203,6 +199,7 @@ BreakIterator::getAvailableLocales(int32_t& count) //------------------------------------------- BreakIterator::BreakIterator() +: fKeepAll(FALSE) { *validLocale = *actualLocale = 0; } @@ -389,7 +386,7 @@ BreakIterator::createInstance(const Locale& loc, int32_t kind, UErrorCode& statu } // ------------------------------------- -enum { kLBTypeLenMax = 32 }; +enum { kKeyValueLenMax = 32 }; BreakIterator* BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status) @@ -398,7 +395,7 @@ BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status) if (U_FAILURE(status)) { return NULL; } - char lbType[kLBTypeLenMax]; + char lbType[kKeyValueLenMax]; BreakIterator *result = NULL; switch (kind) { @@ -411,18 +408,36 @@ BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status) case UBRK_LINE: uprv_strcpy(lbType, "line"); { - char lbKeyValue[kLBTypeLenMax]; + char lbKeyValue[kKeyValueLenMax] = {0}; UErrorCode kvStatus = U_ZERO_ERROR; - loc.getKeywordValue("lb", lbKeyValue, kLBTypeLenMax, kvStatus); - if (U_SUCCESS(kvStatus) && (uprv_strcmp(lbKeyValue,"strict")==0 || uprv_strcmp(lbKeyValue,"normal")==0 || uprv_strcmp(lbKeyValue,"loose")==0)) { + 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); + if (U_SUCCESS(status) && result != NULL) { + char lwKeyValue[kKeyValueLenMax] = {0}; + UErrorCode kvStatus = U_ZERO_ERROR; + int32_t kLen = loc.getKeywordValue("lw", lwKeyValue, kKeyValueLenMax, kvStatus); + result->setKeepAll(U_SUCCESS(kvStatus) && kLen > 0 && uprv_strcmp(lwKeyValue,"keepall")==0); + } 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);