16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*******************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 1997-2013, International Business Machines Corporation and
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*******************************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File TXTBDRY.CPP
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History:
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Date        Name        Description
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   02/18/97    aliu        Converted from OpenClass.  Added DONE.
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   01/13/2000  helena      Added UErrorCode parameter to createXXXInstance methods.
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*****************************************************************************************
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// *****************************************************************************
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// This file was generated from the java source file BreakIterator.java
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// *****************************************************************************
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_BREAK_ITERATION
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/rbbi.h"
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/brkiter.h"
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/udata.h"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ures.h"
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h"
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucln_cmn.h"
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h"
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "umutex.h"
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "servloc.h"
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "locbased.h"
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uresimp.h"
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uassert.h"
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ubrkimpl.h"
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// *****************************************************************************
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// class BreakIterator
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// This class implements methods for finding the location of boundaries in text.
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Instances of BreakIterator maintain a current position and scan over text
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// returning the index of characters where boundaries occur.
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// *****************************************************************************
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// -------------------------------------
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator*
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator::buildInstance(const Locale& loc, const char *type, int32_t kind, UErrorCode &status)
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char fnbuff[256];
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char ext[4]={'\0'};
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char actualLocale[ULOC_FULLNAME_CAPACITY];
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t size;
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar* brkfname = NULL;
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle brkRulesStack;
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle brkNameStack;
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *brkRules = &brkRulesStack;
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *brkName  = &brkNameStack;
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    RuleBasedBreakIterator *result = NULL;
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status))
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_initStackObject(brkRules);
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_initStackObject(brkName);
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Get the locale
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UResourceBundle *b = ures_open(U_ICUDATA_BRKITR, loc.getName(), &status);
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* this is a hack for now. Should be fixed when the data is fetched from
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        brk_index.txt */
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status==U_USING_DEFAULT_WARNING){
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status=U_ZERO_ERROR;
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ures_openFillIn(b, U_ICUDATA_BRKITR, "", &status);
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Get the "boundaries" array.
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        brkRules = ures_getByKeyWithFallback(b, "boundaries", brkRules, &status);
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Get the string object naming the rules file
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        brkName = ures_getByKeyWithFallback(brkRules, type, brkName, &status);
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Get the actual string
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        brkfname = ures_getString(brkName, &size, &status);
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U_ASSERT((size_t)size<sizeof(fnbuff));
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if ((size_t)size>=sizeof(fnbuff)) {
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            size=0;
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_SUCCESS(status)) {
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                status = U_BUFFER_OVERFLOW_ERROR;
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Use the string if we found it
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_SUCCESS(status) && brkfname) {
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uprv_strncpy(actualLocale,
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ures_getLocaleInternal(brkName, &status),
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                sizeof(actualLocale)/sizeof(actualLocale[0]));
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UChar* extStart=u_strchr(brkfname, 0x002e);
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int len = 0;
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(extStart!=NULL){
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                len = (int)(extStart-brkfname);
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_UCharsToChars(extStart+1, ext, sizeof(ext)); // nul terminates the buff
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_UCharsToChars(brkfname, fnbuff, len);
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fnbuff[len]=0; // nul terminate
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(brkRules);
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(brkName);
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDataMemory* file = udata_open(U_ICUDATA_BRKITR, ext, fnbuff, &status);
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ures_close(b);
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Create a RuleBasedBreakIterator
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = new RuleBasedBreakIterator(file, status);
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // If there is a result, set the valid locale and actual locale, and the kind
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status) && result != NULL) {
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U_LOCALE_BASED(locBased, *(BreakIterator*)result);
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        locBased.setLocaleIDs(ures_getLocaleByType(b, ULOC_VALID_LOCALE, &status), actualLocale);
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result->setBreakType(kind);
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ures_close(b);
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) && result != NULL) {  // Sometimes redundant check, but simple
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete result;
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (result == NULL) {
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        udata_close(file);
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_SUCCESS(status)) {
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            status = U_MEMORY_ALLOCATION_ERROR;
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return result;
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Creates a break iterator for word breaks.
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator* U_EXPORT2
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator::createWordInstance(const Locale& key, UErrorCode& status)
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return createInstance(key, UBRK_WORD, status);
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// -------------------------------------
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Creates a break iterator  for line breaks.
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator* U_EXPORT2
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator::createLineInstance(const Locale& key, UErrorCode& status)
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return createInstance(key, UBRK_LINE, status);
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// -------------------------------------
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Creates a break iterator  for character breaks.
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator* U_EXPORT2
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator::createCharacterInstance(const Locale& key, UErrorCode& status)
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return createInstance(key, UBRK_CHARACTER, status);
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// -------------------------------------
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Creates a break iterator  for sentence breaks.
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator* U_EXPORT2
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator::createSentenceInstance(const Locale& key, UErrorCode& status)
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return createInstance(key, UBRK_SENTENCE, status);
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// -------------------------------------
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Creates a break iterator for title casing breaks.
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator* U_EXPORT2
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator::createTitleInstance(const Locale& key, UErrorCode& status)
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return createInstance(key, UBRK_TITLE, status);
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// -------------------------------------
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Gets all the available locales that has localized text boundary data.
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst Locale* U_EXPORT2
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator::getAvailableLocales(int32_t& count)
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return Locale::getAvailableLocales(count);
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------------
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Default constructor and destructor
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-------------------------------------------
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator::BreakIterator()
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *validLocale = *actualLocale = 0;
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator::~BreakIterator()
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ------------------------------------------
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Registration
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-------------------------------------------
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_SERVICE
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// -------------------------------------
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass ICUBreakIteratorFactory : public ICUResourceBundleFactory {
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual ~ICUBreakIteratorFactory();
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprotected:
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UObject* handleCreate(const Locale& loc, int32_t kind, const ICUService* /*service*/, UErrorCode& status) const {
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return BreakIterator::makeInstance(loc, kind, status);
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgICUBreakIteratorFactory::~ICUBreakIteratorFactory() {}
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// -------------------------------------
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass ICUBreakIteratorService : public ICULocaleService {
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ICUBreakIteratorService()
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        : ICULocaleService(UNICODE_STRING("Break Iterator", 14))
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode status = U_ZERO_ERROR;
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        registerFactory(new ICUBreakIteratorFactory(), status);
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual ~ICUBreakIteratorService();
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UObject* cloneInstance(UObject* instance) const {
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return ((BreakIterator*)instance)->clone();
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UObject* handleDefault(const ICUServiceKey& key, UnicodeString* /*actualID*/, UErrorCode& status) const {
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        LocaleKey& lkey = (LocaleKey&)key;
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t kind = lkey.kind();
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Locale loc;
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        lkey.currentLocale(loc);
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return BreakIterator::makeInstance(loc, kind, status);
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UBool isDefault() const {
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return countFactories() == 1;
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgICUBreakIteratorService::~ICUBreakIteratorService() {}
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// -------------------------------------
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// defined in ucln_cmn.h
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic icu::UInitOnce gInitOnce;
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic icu::ICULocaleService* gService = NULL;
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Release all static memory held by breakiterator.
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_BEGIN
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool U_CALLCONV breakiterator_cleanup(void) {
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_SERVICE
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (gService) {
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete gService;
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        gService = NULL;
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gInitOnce.reset();
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_END
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginitService(void) {
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gService = new ICUBreakIteratorService();
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucln_common_registerCleanup(UCLN_COMMON_BREAKITERATOR, breakiterator_cleanup);
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic ICULocaleService*
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orggetService(void)
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    umtx_initOnce(gInitOnce, &initService);
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return gService;
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// -------------------------------------
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic inline UBool
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orghasService(void)
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return !gInitOnce.isReset() && getService() != NULL;
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// -------------------------------------
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgURegistryKey U_EXPORT2
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator::registerInstance(BreakIterator* toAdopt, const Locale& locale, UBreakIteratorType kind, UErrorCode& status)
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ICULocaleService *service = getService();
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (service == NULL) {
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_MEMORY_ALLOCATION_ERROR;
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return service->registerInstance(toAdopt, locale, kind, status);
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// -------------------------------------
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool U_EXPORT2
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator::unregister(URegistryKey key, UErrorCode& status)
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (hasService()) {
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return gService->unregister(key, status);
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_MEMORY_ALLOCATION_ERROR;
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return FALSE;
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// -------------------------------------
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringEnumeration* U_EXPORT2
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator::getAvailableLocales(void)
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ICULocaleService *service = getService();
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (service == NULL) {
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return service->getAvailableLocales();
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* UCONFIG_NO_SERVICE */
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// -------------------------------------
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator*
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator::createInstance(const Locale& loc, int32_t kind, UErrorCode& status)
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_SERVICE
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (hasService()) {
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Locale actualLoc("");
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        BreakIterator *result = (BreakIterator*)gService->get(loc, kind, &actualLoc, status);
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // TODO: The way the service code works in ICU 2.8 is that if
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // there is a real registered break iterator, the actualLoc
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // will be populated, but if the handleDefault path is taken
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // (because nothing is registered that can handle the
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // requested locale) then the actualLoc comes back empty.  In
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // that case, the returned object already has its actual/valid
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // locale data populated (by makeInstance, which is what
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // handleDefault calls), so we don't touch it.  YES, A COMMENT
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // THIS LONG is a sign of bad code -- so the action item is to
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // revisit this in ICU 3.0 and clean it up/fix it/remove it.
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_SUCCESS(status) && (result != NULL) && *actualLoc.getName() != 0) {
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            U_LOCALE_BASED(locBased, *result);
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            locBased.setLocaleIDs(actualLoc.getName(), actualLoc.getName());
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return result;
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return makeInstance(loc, kind, status);
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// -------------------------------------
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator*
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status)
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    BreakIterator *result = NULL;
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch (kind) {
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UBRK_CHARACTER:
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = BreakIterator::buildInstance(loc, "grapheme", kind, status);
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UBRK_WORD:
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = BreakIterator::buildInstance(loc, "word", kind, status);
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UBRK_LINE:
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = BreakIterator::buildInstance(loc, "line", kind, status);
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UBRK_SENTENCE:
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = BreakIterator::buildInstance(loc, "sentence", kind, status);
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case UBRK_TITLE:
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = BreakIterator::buildInstance(loc, "title", kind, status);
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    default:
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ILLEGAL_ARGUMENT_ERROR;
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return result;
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgLocale
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator::getLocale(ULocDataLocaleType type, UErrorCode& status) const {
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_LOCALE_BASED(locBased, *this);
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return locBased.getLocale(type, status);
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char *
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBreakIterator::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const {
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_LOCALE_BASED(locBased, *this);
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return locBased.getLocaleID(type, status);
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// This implementation of getRuleStatus is a do-nothing stub, here to
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// provide a default implementation for any derived BreakIterator classes that
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// do not implement it themselves.
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t BreakIterator::getRuleStatus() const {
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return 0;
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// This implementation of getRuleStatusVec is a do-nothing stub, here to
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// provide a default implementation for any derived BreakIterator classes that
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// do not implement it themselves.
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t BreakIterator::getRuleStatusVec(int32_t *fillInVec, int32_t capacity, UErrorCode &status) {
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 0;
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (capacity < 1) {
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_BUFFER_OVERFLOW_ERROR;
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 1;
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *fillInVec = 0;
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return 1;
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//eof
469