164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 2016 and later: Unicode, Inc. and others.
264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *******************************************************************************
5fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *   Copyright (C) 1997-2009,2014 International Business Machines
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   Corporation and others.  All Rights Reserved.
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *******************************************************************************
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   Date        Name        Description
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   06/21/00    aliu        Creation.
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *******************************************************************************
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_TRANSLITERATION
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utrans.h"
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/putil.h"
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/rep.h"
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/translit.h"
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/unifilt.h"
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uniset.h"
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h"
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uenum.h"
25fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "unicode/uset.h"
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "uenumimp.h"
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cpputils.h"
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "rbt.h"
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Following macro is to be followed by <return value>';' or just ';'
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define utrans_ENTRY(s) if ((s)==NULL || U_FAILURE(*(s))) return
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Replaceable-UReplaceableCallbacks glue
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Make a UReplaceable + UReplaceableCallbacks into a Replaceable object.
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass ReplaceableGlue : public Replaceable {
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UReplaceable *rep;
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UReplaceableCallbacks *func;
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ReplaceableGlue(UReplaceable *replaceable,
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    UReplaceableCallbacks *funcCallback);
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual ~ReplaceableGlue();
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual void handleReplaceBetween(int32_t start,
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                      int32_t limit,
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                      const UnicodeString& text);
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual void extractBetween(int32_t start,
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                int32_t limit,
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                UnicodeString& target) const;
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual void copy(int32_t start, int32_t limit, int32_t dest);
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // virtual Replaceable *clone() const { return NULL; } same as default
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * ICU "poor man's RTTI", returns a UClassID for the actual class.
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     *
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @draft ICU 2.2
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UClassID getDynamicClassID() const;
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * ICU "poor man's RTTI", returns a UClassID for this class.
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     *
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @draft ICU 2.2
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static UClassID U_EXPORT2 getStaticClassID();
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprotected:
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual int32_t getLength() const;
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UChar getCharAt(int32_t offset) const;
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UChar32 getChar32At(int32_t offset) const;
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(ReplaceableGlue)
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruReplaceableGlue::ReplaceableGlue(UReplaceable *replaceable,
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                 UReplaceableCallbacks *funcCallback)
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  : Replaceable()
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    this->rep = replaceable;
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    this->func = funcCallback;
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruReplaceableGlue::~ReplaceableGlue() {}
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint32_t ReplaceableGlue::getLength() const {
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return (*func->length)(rep);
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUChar ReplaceableGlue::getCharAt(int32_t offset) const {
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return (*func->charAt)(rep, offset);
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUChar32 ReplaceableGlue::getChar32At(int32_t offset) const {
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return (*func->char32At)(rep, offset);
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid ReplaceableGlue::handleReplaceBetween(int32_t start,
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                          int32_t limit,
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                          const UnicodeString& text) {
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    (*func->replace)(rep, start, limit, text.getBuffer(), text.length());
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid ReplaceableGlue::extractBetween(int32_t start,
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                     int32_t limit,
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                     UnicodeString& target) const {
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    (*func->extract)(rep, start, limit, target.getBuffer(limit-start));
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    target.releaseBuffer(limit-start);
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid ReplaceableGlue::copy(int32_t start, int32_t limit, int32_t dest) {
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    (*func->copy)(rep, start, limit, dest);
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * General API
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_USE
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UTransliterator* U_EXPORT2
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_openU(const UChar *id,
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             int32_t idLength,
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             UTransDirection dir,
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             const UChar *rules,
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             int32_t rulesLength,
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             UParseError *parseError,
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             UErrorCode *status) {
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(status==NULL || U_FAILURE(*status)) {
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (id == NULL) {
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *status = U_ILLEGAL_ARGUMENT_ERROR;
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UParseError temp;
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(parseError == NULL){
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        parseError = &temp;
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString ID(idLength<0, id, idLength); // r-o alias
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(rules==NULL){
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        Transliterator *trans = NULL;
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        trans = Transliterator::createInstance(ID, dir, *parseError, *status);
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(U_FAILURE(*status)){
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return NULL;
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return (UTransliterator*) trans;
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }else{
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString ruleStr(rulesLength < 0,
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                              rules,
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                              rulesLength); // r-o alias
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
17285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        Transliterator *trans = NULL;
17385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        trans = Transliterator::createFromRules(ID, ruleStr, dir, *parseError, *status);
17485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if(U_FAILURE(*status)) {
17585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            return NULL;
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
17785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return (UTransliterator*) trans;
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UTransliterator* U_EXPORT2
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_open(const char* id,
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            UTransDirection dir,
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            const UChar* rules,         /* may be Null */
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            int32_t rulesLength,        /* -1 if null-terminated */
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            UParseError* parseError,    /* may be Null */
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            UErrorCode* status) {
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString ID(id, -1, US_INV); // use invariant converter
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return utrans_openU(ID.getBuffer(), ID.length(), dir,
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        rules, rulesLength,
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        parseError, status);
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UTransliterator* U_EXPORT2
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_openInverse(const UTransliterator* trans,
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   UErrorCode* status) {
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    utrans_ENTRY(status) NULL;
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UTransliterator* result =
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        (UTransliterator*) ((Transliterator*) trans)->createInverse(*status);
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return result;
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UTransliterator* U_EXPORT2
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_clone(const UTransliterator* trans,
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             UErrorCode* status) {
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    utrans_ENTRY(status) NULL;
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (trans == NULL) {
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *status = U_ILLEGAL_ARGUMENT_ERROR;
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Transliterator *t = ((Transliterator*) trans)->clone();
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (t == NULL) {
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *status = U_MEMORY_ALLOCATION_ERROR;
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return (UTransliterator*) t;
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_close(UTransliterator* trans) {
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete (Transliterator*) trans;
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI const UChar * U_EXPORT2
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_getUnicodeID(const UTransliterator *trans,
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    int32_t *resultLength) {
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // Transliterator keeps its ID NUL-terminated
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UnicodeString &ID=((Transliterator*) trans)->getID();
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(resultLength!=NULL) {
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *resultLength=ID.length();
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return ID.getBuffer();
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_getID(const UTransliterator* trans,
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             char* buf,
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             int32_t bufCapacity) {
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return ((Transliterator*) trans)->getID().extract(0, 0x7fffffff, buf, bufCapacity, US_INV);
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_register(UTransliterator* adoptedTrans,
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                UErrorCode* status) {
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    utrans_ENTRY(status);
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // status currently ignored; may remove later
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Transliterator::registerInstance((Transliterator*) adoptedTrans);
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_unregisterID(const UChar* id, int32_t idLength) {
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString ID(idLength<0, id, idLength); // r-o alias
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Transliterator::unregister(ID);
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_unregister(const char* id) {
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString ID(id, -1, US_INV); // use invariant converter
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Transliterator::unregister(ID);
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_setFilter(UTransliterator* trans,
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                 const UChar* filterPattern,
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                 int32_t filterPatternLen,
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                 UErrorCode* status) {
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    utrans_ENTRY(status);
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeFilter* filter = NULL;
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (filterPattern != NULL && *filterPattern != 0) {
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // Create read only alias of filterPattern:
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString pat(filterPatternLen < 0, filterPattern, filterPatternLen);
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        filter = new UnicodeSet(pat, *status);
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* test for NULL */
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (filter == NULL) {
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            *status = U_MEMORY_ALLOCATION_ERROR;
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(*status)) {
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            delete filter;
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            filter = NULL;
288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ((Transliterator*) trans)->adoptFilter(filter);
291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_countAvailableIDs(void) {
295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return Transliterator::countAvailableIDs();
296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_getAvailableID(int32_t index,
300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      char* buf, // may be NULL
301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      int32_t bufCapacity) {
302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return Transliterator::getAvailableID(index).extract(0, 0x7fffffff, buf, bufCapacity, US_INV);
303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Transliterator UEnumeration ---------------------------------------------- */
306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef struct UTransEnumeration {
308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UEnumeration uenum;
309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t index, count;
310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} UTransEnumeration;
311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CDECL_BEGIN
313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int32_t U_CALLCONV
314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_enum_count(UEnumeration *uenum, UErrorCode *pErrorCode) {
315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return ((UTransEnumeration *)uenum)->count;
319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UChar* U_CALLCONV
322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_enum_unext(UEnumeration *uenum,
323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  int32_t* resultLength,
324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  UErrorCode *pErrorCode) {
325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UTransEnumeration *ute=(UTransEnumeration *)uenum;
330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t index=ute->index;
331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(index<ute->count) {
332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const UnicodeString &ID=Transliterator::getAvailableID(index);
333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ute->index=index+1;
334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(resultLength!=NULL) {
335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            *resultLength=ID.length();
336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // Transliterator keeps its ID NUL-terminated
338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return ID.getBuffer();
339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(resultLength!=NULL) {
342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *resultLength=0;
343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return NULL;
345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void U_CALLCONV
348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_enum_reset(UEnumeration *uenum, UErrorCode *pErrorCode) {
349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UTransEnumeration *ute=(UTransEnumeration *)uenum;
354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ute->index=0;
355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ute->count=Transliterator::countAvailableIDs();
356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void U_CALLCONV
359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_enum_close(UEnumeration *uenum) {
360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_free(uenum);
361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CDECL_END
363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UEnumeration utransEnumeration={
365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL,
366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    NULL,
367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    utrans_enum_close,
368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    utrans_enum_count,
369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    utrans_enum_unext,
370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uenum_nextDefault,
371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    utrans_enum_reset
372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UEnumeration * U_EXPORT2
375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_openIDs(UErrorCode *pErrorCode) {
376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UTransEnumeration *ute;
377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ute=(UTransEnumeration *)uprv_malloc(sizeof(UTransEnumeration));
383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(ute==NULL) {
384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *pErrorCode=U_MEMORY_ALLOCATION_ERROR;
385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ute->uenum=utransEnumeration;
389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ute->index=0;
390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ute->count=Transliterator::countAvailableIDs();
391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return (UEnumeration *)ute;
392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************
395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Transliteration API
396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/
397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2
399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_trans(const UTransliterator* trans,
400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             UReplaceable* rep,
401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             UReplaceableCallbacks* repFunc,
402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             int32_t start,
403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             int32_t* limit,
404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             UErrorCode* status) {
405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    utrans_ENTRY(status);
407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (trans == 0 || rep == 0 || repFunc == 0 || limit == 0) {
409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *status = U_ILLEGAL_ARGUMENT_ERROR;
410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ReplaceableGlue r(rep, repFunc);
414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    *limit = ((Transliterator*) trans)->transliterate(r, start, *limit);
416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2
419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_transIncremental(const UTransliterator* trans,
420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        UReplaceable* rep,
421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        UReplaceableCallbacks* repFunc,
422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        UTransPosition* pos,
423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        UErrorCode* status) {
424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    utrans_ENTRY(status);
426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (trans == 0 || rep == 0 || repFunc == 0 || pos == 0) {
428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *status = U_ILLEGAL_ARGUMENT_ERROR;
429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ReplaceableGlue r(rep, repFunc);
433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ((Transliterator*) trans)->transliterate(r, *pos, *status);
435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2
438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_transUChars(const UTransliterator* trans,
439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   UChar* text,
440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   int32_t* textLength,
441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   int32_t textCapacity,
442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   int32_t start,
443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   int32_t* limit,
444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   UErrorCode* status) {
445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    utrans_ENTRY(status);
447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (trans == 0 || text == 0 || limit == 0) {
449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *status = U_ILLEGAL_ARGUMENT_ERROR;
450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t textLen = (textLength == NULL || *textLength < 0)
454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ? u_strlen(text) : *textLength;
455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // writeable alias: for this ct, len CANNOT be -1 (why?)
456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString str(text, textLen, textCapacity);
457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    *limit = ((Transliterator*) trans)->transliterate(str, start, *limit);
459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // Copy the string buffer back to text (only if necessary)
461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // and fill in *neededCapacity (if neededCapacity != NULL).
462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    textLen = str.extract(text, textCapacity, *status);
463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(textLength != NULL) {
464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *textLength = textLen;
465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2
469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutrans_transIncrementalUChars(const UTransliterator* trans,
470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                              UChar* text,
471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                              int32_t* textLength,
472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                              int32_t textCapacity,
473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                              UTransPosition* pos,
474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                              UErrorCode* status) {
475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    utrans_ENTRY(status);
477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (trans == 0 || text == 0 || pos == 0) {
479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *status = U_ILLEGAL_ARGUMENT_ERROR;
480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t textLen = (textLength == NULL || *textLength < 0)
484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ? u_strlen(text) : *textLength;
485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // writeable alias: for this ct, len CANNOT be -1 (why?)
486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString str(text, textLen, textCapacity);
487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ((Transliterator*) trans)->transliterate(str, *pos, *status);
489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // Copy the string buffer back to text (only if necessary)
491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // and fill in *neededCapacity (if neededCapacity != NULL).
492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    textLen = str.extract(text, textCapacity, *status);
493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(textLength != NULL) {
494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *textLength = textLen;
495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
496ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
498fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_CAPI int32_t U_EXPORT2
499fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusutrans_toRules(     const UTransliterator* trans,
500fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    UBool escapeUnprintable,
501fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    UChar* result, int32_t resultLength,
502fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    UErrorCode* status) {
503fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    utrans_ENTRY(status) 0;
504fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if ( (result==NULL)? resultLength!=0: resultLength<0 ) {
505fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        *status = U_ILLEGAL_ARGUMENT_ERROR;
506fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return 0;
507fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
508fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
509fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString res;
510fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    res.setTo(result, 0, resultLength);
511fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    ((Transliterator*) trans)->toRules(res, escapeUnprintable);
512fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return res.extract(result, resultLength, *status);
513fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
514fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
515fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_CAPI USet* U_EXPORT2
516fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusutrans_getSourceSet(const UTransliterator* trans,
517fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    UBool ignoreFilter,
518fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    USet* fillIn,
519fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    UErrorCode* status) {
520fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    utrans_ENTRY(status) fillIn;
521fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
522fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (fillIn == NULL) {
523fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        fillIn = uset_openEmpty();
524fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
525fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (ignoreFilter) {
526fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        ((Transliterator*) trans)->handleGetSourceSet(*((UnicodeSet*)fillIn));
527fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    } else {
528fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        ((Transliterator*) trans)->getSourceSet(*((UnicodeSet*)fillIn));
529fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
530fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return fillIn;
531fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
532fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_TRANSLITERATION */
534