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