1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* Copyright (C) 1997-2014, International Business Machines Corporation and
450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
7fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* File brkiter.cpp
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History:
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Date        Name        Description
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   02/18/97    aliu        Converted from OpenClass.  Added DONE.
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   01/13/2000  helena      Added UErrorCode parameter to createXXXInstance methods.
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*****************************************************************************************
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This file was generated from the java source file BreakIterator.java
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/rbbi.h"
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/brkiter.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/udata.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ures.h"
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucln_cmn.h"
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h"
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "umutex.h"
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "servloc.h"
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "locbased.h"
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uresimp.h"
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uassert.h"
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ubrkimpl.h"
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// class BreakIterator
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This class implements methods for finding the location of boundaries in text.
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Instances of BreakIterator maintain a current position and scan over text
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// returning the index of characters where boundaries occur.
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator*
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator::buildInstance(const Locale& loc, const char *type, int32_t kind, UErrorCode &status)
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char fnbuff[256];
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char ext[4]={'\0'};
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char actualLocale[ULOC_FULLNAME_CAPACITY];
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t size;
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar* brkfname = NULL;
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle brkRulesStack;
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle brkNameStack;
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *brkRules = &brkRulesStack;
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *brkName  = &brkNameStack;
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator *result = NULL;
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status))
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_initStackObject(brkRules);
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_initStackObject(brkName);
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Get the locale
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *b = ures_open(U_ICUDATA_BRKITR, loc.getName(), &status);
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* this is a hack for now. Should be fixed when the data is fetched from
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        brk_index.txt */
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_USING_DEFAULT_WARNING){
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ures_openFillIn(b, U_ICUDATA_BRKITR, "", &status);
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Get the "boundaries" array.
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        brkRules = ures_getByKeyWithFallback(b, "boundaries", brkRules, &status);
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Get the string object naming the rules file
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        brkName = ures_getByKeyWithFallback(brkRules, type, brkName, &status);
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Get the actual string
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        brkfname = ures_getString(brkName, &size, &status);
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_ASSERT((size_t)size<sizeof(fnbuff));
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ((size_t)size>=sizeof(fnbuff)) {
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            size=0;
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_SUCCESS(status)) {
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                status = U_BUFFER_OVERFLOW_ERROR;
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Use the string if we found it
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status) && brkfname) {
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uprv_strncpy(actualLocale,
9783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                ures_getLocaleInternal(brkName, &status),
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                sizeof(actualLocale)/sizeof(actualLocale[0]));
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UChar* extStart=u_strchr(brkfname, 0x002e);
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int len = 0;
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(extStart!=NULL){
10350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                len = (int)(extStart-brkfname);
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_UCharsToChars(extStart+1, ext, sizeof(ext)); // nul terminates the buff
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_UCharsToChars(brkfname, fnbuff, len);
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fnbuff[len]=0; // nul terminate
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(brkRules);
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(brkName);
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDataMemory* file = udata_open(U_ICUDATA_BRKITR, ext, fnbuff, &status);
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ures_close(b);
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Create a RuleBasedBreakIterator
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = new RuleBasedBreakIterator(file, status);
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // If there is a result, set the valid locale and actual locale, and the kind
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status) && result != NULL) {
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_LOCALE_BASED(locBased, *(BreakIterator*)result);
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        locBased.setLocaleIDs(ures_getLocaleByType(b, ULOC_VALID_LOCALE, &status), actualLocale);
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result->setBreakType(kind);
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(b);
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) && result != NULL) {  // Sometimes redundant check, but simple
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete result;
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (result == NULL) {
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        udata_close(file);
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status)) {
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_MEMORY_ALLOCATION_ERROR;
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return result;
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Creates a break iterator for word breaks.
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator* U_EXPORT2
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator::createWordInstance(const Locale& key, UErrorCode& status)
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return createInstance(key, UBRK_WORD, status);
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Creates a break iterator  for line breaks.
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator* U_EXPORT2
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator::createLineInstance(const Locale& key, UErrorCode& status)
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return createInstance(key, UBRK_LINE, status);
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Creates a break iterator  for character breaks.
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator* U_EXPORT2
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator::createCharacterInstance(const Locale& key, UErrorCode& status)
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return createInstance(key, UBRK_CHARACTER, status);
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Creates a break iterator  for sentence breaks.
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator* U_EXPORT2
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator::createSentenceInstance(const Locale& key, UErrorCode& status)
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return createInstance(key, UBRK_SENTENCE, status);
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Creates a break iterator for title casing breaks.
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator* U_EXPORT2
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator::createTitleInstance(const Locale& key, UErrorCode& status)
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return createInstance(key, UBRK_TITLE, status);
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets all the available locales that has localized text boundary data.
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst Locale* U_EXPORT2
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator::getAvailableLocales(int32_t& count)
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return Locale::getAvailableLocales(count);
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------------
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Default constructor and destructor
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-------------------------------------------
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator::BreakIterator()
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *validLocale = *actualLocale = 0;
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator::~BreakIterator()
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ------------------------------------------
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Registration
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-------------------------------------------
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass ICUBreakIteratorFactory : public ICUResourceBundleFactory {
22483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliuspublic:
22583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    virtual ~ICUBreakIteratorFactory();
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprotected:
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual UObject* handleCreate(const Locale& loc, int32_t kind, const ICUService* /*service*/, UErrorCode& status) const {
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return BreakIterator::makeInstance(loc, kind, status);
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23283a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusICUBreakIteratorFactory::~ICUBreakIteratorFactory() {}
23383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass ICUBreakIteratorService : public ICULocaleService {
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ICUBreakIteratorService()
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        : ICULocaleService(UNICODE_STRING("Break Iterator", 14))
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        registerFactory(new ICUBreakIteratorFactory(), status);
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
24583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    virtual ~ICUBreakIteratorService();
24683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual UObject* cloneInstance(UObject* instance) const {
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return ((BreakIterator*)instance)->clone();
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual UObject* handleDefault(const ICUServiceKey& key, UnicodeString* /*actualID*/, UErrorCode& status) const {
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LocaleKey& lkey = (LocaleKey&)key;
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t kind = lkey.kind();
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale loc;
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        lkey.currentLocale(loc);
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return BreakIterator::makeInstance(loc, kind, status);
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual UBool isDefault() const {
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return countFactories() == 1;
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
26483a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusICUBreakIteratorService::~ICUBreakIteratorService() {}
26583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// defined in ucln_cmn.h
26959d709d503bab6e2b61931737e662dd293b40578ccorneliusU_NAMESPACE_END
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
27159d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic icu::UInitOnce gInitOnce;
27283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusstatic icu::ICULocaleService* gService = NULL;
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
27459d709d503bab6e2b61931737e662dd293b40578ccornelius
27559d709d503bab6e2b61931737e662dd293b40578ccornelius
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Release all static memory held by breakiterator.
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool U_CALLCONV breakiterator_cleanup(void) {
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (gService) {
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete gService;
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        gService = NULL;
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
28659d709d503bab6e2b61931737e662dd293b40578ccornelius    gInitOnce.reset();
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
29359d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void U_CALLCONV
29459d709d503bab6e2b61931737e662dd293b40578ccorneliusinitService(void) {
29559d709d503bab6e2b61931737e662dd293b40578ccornelius    gService = new ICUBreakIteratorService();
29659d709d503bab6e2b61931737e662dd293b40578ccornelius    ucln_common_registerCleanup(UCLN_COMMON_BREAKITERATOR, breakiterator_cleanup);
29759d709d503bab6e2b61931737e662dd293b40578ccornelius}
29859d709d503bab6e2b61931737e662dd293b40578ccornelius
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic ICULocaleService*
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerugetService(void)
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
30259d709d503bab6e2b61931737e662dd293b40578ccornelius    umtx_initOnce(gInitOnce, &initService);
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return gService;
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
30659d709d503bab6e2b61931737e662dd293b40578ccornelius
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline UBool
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruhasService(void)
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
31259d709d503bab6e2b61931737e662dd293b40578ccornelius    return !gInitOnce.isReset() && getService() != NULL;
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruURegistryKey U_EXPORT2
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator::registerInstance(BreakIterator* toAdopt, const Locale& locale, UBreakIteratorType kind, UErrorCode& status)
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
320c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ICULocaleService *service = getService();
321c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (service == NULL) {
322c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        status = U_MEMORY_ALLOCATION_ERROR;
323c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return NULL;
324c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
325c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    return service->registerInstance(toAdopt, locale, kind, status);
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool U_EXPORT2
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator::unregister(URegistryKey key, UErrorCode& status)
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (hasService()) {
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return gService->unregister(key, status);
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
337c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        status = U_MEMORY_ALLOCATION_ERROR;
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return FALSE;
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruStringEnumeration* U_EXPORT2
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator::getAvailableLocales(void)
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
347c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ICULocaleService *service = getService();
348c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (service == NULL) {
349c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return NULL;
350c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
351c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    return service->getAvailableLocales();
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* UCONFIG_NO_SERVICE */
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator*
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator::createInstance(const Locale& loc, int32_t kind, UErrorCode& status)
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (hasService()) {
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale actualLoc("");
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BreakIterator *result = (BreakIterator*)gService->get(loc, kind, &actualLoc, status);
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // TODO: The way the service code works in ICU 2.8 is that if
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // there is a real registered break iterator, the actualLoc
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // will be populated, but if the handleDefault path is taken
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // (because nothing is registered that can handle the
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // requested locale) then the actualLoc comes back empty.  In
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // that case, the returned object already has its actual/valid
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // locale data populated (by makeInstance, which is what
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // handleDefault calls), so we don't touch it.  YES, A COMMENT
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // THIS LONG is a sign of bad code -- so the action item is to
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // revisit this in ICU 3.0 and clean it up/fix it/remove it.
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status) && (result != NULL) && *actualLoc.getName() != 0) {
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            U_LOCALE_BASED(locBased, *result);
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            locBased.setLocaleIDs(actualLoc.getName(), actualLoc.getName());
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return result;
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return makeInstance(loc, kind, status);
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator*
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status)
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    BreakIterator *result = NULL;
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (kind) {
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case UBRK_CHARACTER:
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = BreakIterator::buildInstance(loc, "grapheme", kind, status);
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case UBRK_WORD:
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = BreakIterator::buildInstance(loc, "word", kind, status);
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case UBRK_LINE:
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = BreakIterator::buildInstance(loc, "line", kind, status);
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case UBRK_SENTENCE:
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = BreakIterator::buildInstance(loc, "sentence", kind, status);
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case UBRK_TITLE:
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = BreakIterator::buildInstance(loc, "title", kind, status);
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ILLEGAL_ARGUMENT_ERROR;
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return result;
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLocale
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator::getLocale(ULocDataLocaleType type, UErrorCode& status) const {
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U_LOCALE_BASED(locBased, *this);
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return locBased.getLocale(type, status);
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char *
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const {
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U_LOCALE_BASED(locBased, *this);
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return locBased.getLocaleID(type, status);
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
44159d709d503bab6e2b61931737e662dd293b40578ccornelius
44259d709d503bab6e2b61931737e662dd293b40578ccornelius// This implementation of getRuleStatus is a do-nothing stub, here to
44359d709d503bab6e2b61931737e662dd293b40578ccornelius// provide a default implementation for any derived BreakIterator classes that
44459d709d503bab6e2b61931737e662dd293b40578ccornelius// do not implement it themselves.
44559d709d503bab6e2b61931737e662dd293b40578ccorneliusint32_t BreakIterator::getRuleStatus() const {
44659d709d503bab6e2b61931737e662dd293b40578ccornelius    return 0;
44759d709d503bab6e2b61931737e662dd293b40578ccornelius}
44859d709d503bab6e2b61931737e662dd293b40578ccornelius
44959d709d503bab6e2b61931737e662dd293b40578ccornelius// This implementation of getRuleStatusVec is a do-nothing stub, here to
45059d709d503bab6e2b61931737e662dd293b40578ccornelius// provide a default implementation for any derived BreakIterator classes that
45159d709d503bab6e2b61931737e662dd293b40578ccornelius// do not implement it themselves.
45259d709d503bab6e2b61931737e662dd293b40578ccorneliusint32_t BreakIterator::getRuleStatusVec(int32_t *fillInVec, int32_t capacity, UErrorCode &status) {
45359d709d503bab6e2b61931737e662dd293b40578ccornelius    if (U_FAILURE(status)) {
45459d709d503bab6e2b61931737e662dd293b40578ccornelius        return 0;
45559d709d503bab6e2b61931737e662dd293b40578ccornelius    }
45659d709d503bab6e2b61931737e662dd293b40578ccornelius    if (capacity < 1) {
45759d709d503bab6e2b61931737e662dd293b40578ccornelius        status = U_BUFFER_OVERFLOW_ERROR;
45859d709d503bab6e2b61931737e662dd293b40578ccornelius        return 1;
45959d709d503bab6e2b61931737e662dd293b40578ccornelius    }
46059d709d503bab6e2b61931737e662dd293b40578ccornelius    *fillInVec = 0;
46159d709d503bab6e2b61931737e662dd293b40578ccornelius    return 1;
46259d709d503bab6e2b61931737e662dd293b40578ccornelius}
46359d709d503bab6e2b61931737e662dd293b40578ccornelius
464fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusBreakIterator::BreakIterator (const Locale& valid, const Locale& actual) {
465fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  U_LOCALE_BASED(locBased, (*this));
466fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  locBased.setLocaleIDs(valid, actual);
467fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
468fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//eof
474