From e7042af1b8695bc09ffb7bb1f1921205fbef6881 Mon Sep 17 00:00:00 2001 From: Ram Viswanadha Date: Fri, 31 Aug 2001 03:23:39 +0000 Subject: [PATCH] ICU-329 Add parseError and UErrorCode to all public API's to make them consitent with ICU's design. Fix implementation to bubble the error code. X-SVN-Rev: 5653 --- icu4c/source/common/putil.c | 4 +- icu4c/source/common/unicode/utypes.h | 1 + icu4c/source/i18n/cpdtrans.cpp | 12 +++-- icu4c/source/i18n/rbt.cpp | 10 ++-- icu4c/source/i18n/rbt_pars.cpp | 69 +++++++++++++++++++-------- icu4c/source/i18n/rbt_pars.h | 9 ++-- icu4c/source/i18n/rbt_rule.cpp | 8 ++-- icu4c/source/i18n/rbt_rule.h | 4 ++ icu4c/source/i18n/rbt_set.cpp | 32 ++++++++++++- icu4c/source/i18n/rbt_set.h | 2 +- icu4c/source/i18n/translit.cpp | 53 ++++++++++++-------- icu4c/source/i18n/transreg.cpp | 11 +++-- icu4c/source/i18n/transreg.h | 6 ++- icu4c/source/i18n/unicode/cpdtrans.h | 6 ++- icu4c/source/i18n/unicode/rbt.h | 18 ++++--- icu4c/source/i18n/unicode/translit.h | 24 ++++++---- icu4c/source/i18n/unicode/utrans.h | 40 +++++++++++++++- icu4c/source/i18n/utrans.cpp | 61 ++++++++++++++++++++--- icu4c/source/test/cintltst/utransts.c | 22 ++++----- 19 files changed, 288 insertions(+), 104 deletions(-) diff --git a/icu4c/source/common/putil.c b/icu4c/source/common/putil.c index 93f4c9d343f..a8db25b8dda 100644 --- a/icu4c/source/common/putil.c +++ b/icu4c/source/common/putil.c @@ -1735,7 +1735,9 @@ _uTransErrorName[U_PARSE_ERROR_LIMIT - U_PARSE_ERROR_START]={ "U_UNDEFINED_SEGMENT_REFERENCE", "U_UNDEFINED_VARIABLE", "U_UNQUOTED_SPECIAL", - "U_UNTERMINATED_QUOTE" + "U_UNTERMINATED_QUOTE", + "U_RULE_MASK_ERROR" + }; static const char * const diff --git a/icu4c/source/common/unicode/utypes.h b/icu4c/source/common/unicode/utypes.h index 27a3dff2e7a..7ee95192a90 100644 --- a/icu4c/source/common/unicode/utypes.h +++ b/icu4c/source/common/unicode/utypes.h @@ -429,6 +429,7 @@ enum UErrorCode { U_UNDEFINED_VARIABLE, U_UNQUOTED_SPECIAL, U_UNTERMINATED_QUOTE, + U_RULE_MASK_ERROR, U_PARSE_ERROR_LIMIT, /**< end of Transliterator specific parse Errors */ /* diff --git a/icu4c/source/i18n/cpdtrans.cpp b/icu4c/source/i18n/cpdtrans.cpp index 1013f601841..0e728758ba1 100644 --- a/icu4c/source/i18n/cpdtrans.cpp +++ b/icu4c/source/i18n/cpdtrans.cpp @@ -50,17 +50,19 @@ CompoundTransliterator::CompoundTransliterator( CompoundTransliterator::CompoundTransliterator(const UnicodeString& id, UTransDirection direction, UnicodeFilter* adoptedFilter, + UParseError& parseError, UErrorCode& status) : Transliterator(id, adoptedFilter), trans(0), compoundRBTIndex(-1) { - init(id, direction, -1, 0, TRUE, status); + init(id, direction, -1, 0, TRUE,parseError,status); } CompoundTransliterator::CompoundTransliterator(const UnicodeString& id, + UParseError& parseError, UErrorCode& status) : Transliterator(id, 0), // set filter to 0 here! trans(0), compoundRBTIndex(-1) { - init(id, UTRANS_FORWARD, -1, 0, TRUE, status); + init(id, UTRANS_FORWARD, -1, 0, TRUE,parseError,status); } /** @@ -72,10 +74,11 @@ CompoundTransliterator::CompoundTransliterator(const UnicodeString& ID, const UnicodeString& idBlock, int32_t idSplitPoint, Transliterator *adoptedTrans, + UParseError& parseError, UErrorCode& status) : Transliterator(ID, 0), trans(0), compoundRBTIndex(-1) { - init(idBlock, UTRANS_FORWARD, idSplitPoint, adoptedTrans, FALSE, status); + init(idBlock, UTRANS_FORWARD, idSplitPoint, adoptedTrans, FALSE,parseError,status); } /** @@ -114,6 +117,7 @@ void CompoundTransliterator::init(const UnicodeString& id, int32_t idSplitPoint, Transliterator *adoptedSplitTrans, UBool fixReverseID, + UParseError& parseError, UErrorCode& status) { // assert(trans == 0); @@ -127,7 +131,7 @@ void CompoundTransliterator::init(const UnicodeString& id, Transliterator::parseCompoundID(id, regenID, direction, idSplitPoint, adoptedSplitTrans, list, compoundRBTIndex, - NULL, status); + parseError, status); init(list, direction, fixReverseID, status); } diff --git a/icu4c/source/i18n/rbt.cpp b/icu4c/source/i18n/rbt.cpp index f1c36064110..b6620e826e9 100644 --- a/icu4c/source/i18n/rbt.cpp +++ b/icu4c/source/i18n/rbt.cpp @@ -17,15 +17,13 @@ char RuleBasedTransliterator::fgClassID = 0; // Value is irrelevant void RuleBasedTransliterator::_construct(const UnicodeString& rules, UTransDirection direction, - UErrorCode& status, - UParseError* parseError) { + UParseError& parseError, + UErrorCode& status) { data = 0; isDataOwned = TRUE; if (U_SUCCESS(status)) { - data = TransliteratorParser::parse(rules, direction, parseError); - if (data == 0) { - status = U_ILLEGAL_ARGUMENT_ERROR; - } else { + data = TransliteratorParser::parse(rules, direction, parseError,status); + if (U_SUCCESS(status)) { setMaximumContextLength(data->ruleSet.getMaximumContextLength()); } } diff --git a/icu4c/source/i18n/rbt_pars.cpp b/icu4c/source/i18n/rbt_pars.cpp index eaf95452a1b..2ffadc9dbe6 100644 --- a/icu4c/source/i18n/rbt_pars.cpp +++ b/icu4c/source/i18n/rbt_pars.cpp @@ -769,7 +769,8 @@ int32_t* RuleHalf::createSegments(UErrorCode& status) const { TransliterationRuleData* TransliteratorParser::parse(const UnicodeString& rules, UTransDirection direction, - UParseError* parseError) { + UParseError& parseError, + UErrorCode& ec) { TransliteratorParser parser(rules, direction, parseError); UnicodeString idBlock; int32_t idSplitPoint, count; @@ -777,6 +778,7 @@ TransliteratorParser::parse(const UnicodeString& rules, if (U_FAILURE(parser.status) || idBlock.length() != 0) { delete parser.data; parser.data = 0; + ec = parser.status; } return parser.data; } @@ -800,7 +802,7 @@ void TransliteratorParser::parse(const UnicodeString& rules, TransliterationRuleData*& ruleDataResult, UnicodeString& idBlockResult, int32_t& idSplitPointResult, - UParseError* parseError, + UParseError& parseError, UErrorCode& ec) { if (U_FAILURE(ec)) { ruleDataResult = 0; @@ -822,12 +824,14 @@ void TransliteratorParser::parse(const UnicodeString& rules, * @exception IllegalArgumentException if there is a syntax error in the * rules */ + +/* Ram: Reordered member initializers to match declaration order and make GCC happy */ TransliteratorParser::TransliteratorParser( const UnicodeString& theRules, UTransDirection theDirection, - UParseError* theParseError) + UParseError& theParseError) : - rules(theRules), direction(theDirection), variablesVector(status), data(0), parseError(theParseError) + rules(theRules), direction(theDirection),data(0),parseError(theParseError), variablesVector(status) { parseData = new ParseData(0, &variablesVector); if (parseData == NULL) { @@ -857,11 +861,11 @@ void TransliteratorParser::parseRules(UnicodeString& idBlockResult, ruleCount = 0; // Clear error struct - if (parseError != 0) { + //if (parseError != 0) { //parseError->code = parseError->line = 0; - parseError->offset = 0; - parseError->preContext[0] = parseError->postContext[0] = (UChar)0; - } + parseError.offset = 0; + parseError.preContext[0] = parseError.postContext[0] = (UChar)0; + //} delete data; data = new TransliterationRuleData(status); @@ -918,11 +922,12 @@ void TransliteratorParser::parseRules(UnicodeString& idBlockResult, int32_t p = pos; UBool sawDelim; UnicodeString regenID; - Transliterator::parseID(rules, regenID, p, sawDelim, direction, NULL, FALSE); - if (p == pos || !sawDelim) { + Transliterator::parseID(rules, regenID, p, sawDelim, direction,parseError, FALSE,status); + //if (p == pos || !sawDelim) { // Invalid ::id - status = U_ILLEGAL_ARGUMENT_ERROR; - } else { + //status = U_ILLEGAL_ARGUMENT_ERROR; + //else { + if(p != pos || sawDelim) { if (mode == 1) { mode = 2; idSplitPointResult = idBlockResult.length(); @@ -942,8 +947,10 @@ void TransliteratorParser::parseRules(UnicodeString& idBlockResult, if (mode == 2) { // ::id in illegal position (because a rule // occurred after the ::id footer block) - status = U_ILLEGAL_ARGUMENT_ERROR; + syntaxError(U_ILLEGAL_ARGUMENT_ERROR,rules,pos); } + }else{ + syntaxError(status,rules,pos); } mode = 1; } @@ -964,7 +971,7 @@ void TransliteratorParser::parseRules(UnicodeString& idBlockResult, // Index the rules if (U_SUCCESS(status)) { - data->ruleSet.freeze(status); + data->ruleSet.freeze(parseError,status); if (idSplitPointResult < 0) { idSplitPointResult = idBlockResult.length(); } @@ -1049,7 +1056,6 @@ int32_t TransliteratorParser::parseRule(int32_t pos, int32_t limit) { // We allow anything on the right, including an empty string. UnicodeString* value = new UnicodeString(right->text); data->variableNames->put(undefinedVariableName, value, status); - ++variableLimit; return pos; } @@ -1057,7 +1063,7 @@ int32_t TransliteratorParser::parseRule(int32_t pos, int32_t limit) { // If this is not a variable definition rule, we shouldn't have // any undefined variable names. if (undefinedVariableName.length() != 0) { - syntaxError(// "Undefined variable $" + undefinedVariableName, + return syntaxError(// "Undefined variable $" + undefinedVariableName, U_UNDEFINED_VARIABLE, rule, start); } @@ -1150,9 +1156,9 @@ int32_t TransliteratorParser::parseRule(int32_t pos, int32_t limit) { */ int32_t TransliteratorParser::syntaxError(UErrorCode parseErrorCode, const UnicodeString& rule, - int32_t start) { - if (parseError != 0) { - parseError->line = 0; // We don't return a line # + int32_t pos) { + // if (parseError != 0) { + /* parseError->line = 0; // We don't return a line # parseError->offset = start; // Character offset from rule start int32_t end = quotedIndexOf(rule, start, rule.length(), END_OF_RULE); if (end < 0) { @@ -1165,9 +1171,30 @@ int32_t TransliteratorParser::syntaxError(UErrorCode parseErrorCode, rule.extract(start, len, parseError->preContext); // Current rule parseError->preContext[len] = 0; parseError->postContext[0] = 0; - } + */ + parseError.offset = pos; + parseError.line = 0 ; /* we are not using line numbers */ + + // for pre-context + int32_t start = (pos <=U_PARSE_CONTEXT_LEN)? 0 : (pos - (U_PARSE_CONTEXT_LEN-1)); + int32_t stop = pos; + + rule.extract(start,stop-start,parseError.preContext); + //null terminate the buffer + parseError.preContext[stop-start] = 0; + + //for post-context + start = pos+1; + stop = ((pos+U_PARSE_CONTEXT_LEN)<= rule.length() )? (pos+(U_PARSE_CONTEXT_LEN-1)) : + rule.length(); + + rule.extract(start,stop-start,parseError.postContext); + //null terminate the buffer + parseError.postContext[stop-start]= 0; + // } status = (UErrorCode)parseErrorCode; - return start; + return pos; + } /** diff --git a/icu4c/source/i18n/rbt_pars.h b/icu4c/source/i18n/rbt_pars.h index 9d6def73e5d..8089c5150bc 100644 --- a/icu4c/source/i18n/rbt_pars.h +++ b/icu4c/source/i18n/rbt_pars.h @@ -40,7 +40,7 @@ class TransliteratorParser { * Pointer to user structure in which to return parse error information. * May be NULL. */ - UParseError* parseError; + UParseError& parseError; /** * Temporary symbol table used during parsing. @@ -83,7 +83,8 @@ public: static TransliterationRuleData* parse(const UnicodeString& rules, UTransDirection direction, - UParseError* parseError = 0); + UParseError& parseError, + UErrorCode& ec); /** * Parse a given set of rules. Return up to three pieces of @@ -104,7 +105,7 @@ public: TransliterationRuleData*& ruleDataResult, UnicodeString& idBlockResult, int32_t& idSplitPointResult, - UParseError* parseError, + UParseError& parseError, UErrorCode& ec); private: @@ -116,7 +117,7 @@ private: */ TransliteratorParser(const UnicodeString& rules, UTransDirection direction, - UParseError* parseError = 0); + UParseError& parseError); /** * Destructor. diff --git a/icu4c/source/i18n/rbt_rule.cpp b/icu4c/source/i18n/rbt_rule.cpp index d014d69a948..b3b8c5b9e7c 100644 --- a/icu4c/source/i18n/rbt_rule.cpp +++ b/icu4c/source/i18n/rbt_rule.cpp @@ -17,8 +17,8 @@ const UChar TransliterationRule::ETHER = 0xFFFF; -static const UChar APOSTROPHE = 0x0027; // ' -static const UChar BACKSLASH = 0x005C; // \ +static const UChar APOSTROPHE = 0x0027; // '\'' +static const UChar BACKSLASH = 0x005C; // '\' // To process segments we need to allocate arrays of integers. We use // stack storage as long as the segment count is <= MAX_STATIC_SEGS. @@ -136,14 +136,16 @@ TransliterationRule::TransliterationRule(const UnicodeString& input, /** * Copy constructor. */ + +/* Ram: Reordered member initializers to match declaration order and make GCC happy */ TransliterationRule::TransliterationRule(TransliterationRule& other) : pattern(other.pattern), output(other.output), + firstKeySeg(other.firstKeySeg), anteContextLength(other.anteContextLength), keyLength(other.keyLength), cursorPos(other.cursorPos), flags(other.flags), - firstKeySeg(other.firstKeySeg), data(other.data) { segments = 0; diff --git a/icu4c/source/i18n/rbt_rule.h b/icu4c/source/i18n/rbt_rule.h index e97f6f525b0..76bbccb4247 100644 --- a/icu4c/source/i18n/rbt_rule.h +++ b/icu4c/source/i18n/rbt_rule.h @@ -244,6 +244,10 @@ public: */ virtual UnicodeString& toRule(UnicodeString& pat, UBool escapeUnprintable) const; + UnicodeString& getPattern(UnicodeString& fillIn){ + fillIn.append(pattern); + return fillIn; + } private: friend class StringMatcher; diff --git a/icu4c/source/i18n/rbt_set.cpp b/icu4c/source/i18n/rbt_set.cpp index 2f8a5b745d9..9dbe6559f84 100644 --- a/icu4c/source/i18n/rbt_set.cpp +++ b/icu4c/source/i18n/rbt_set.cpp @@ -16,6 +16,30 @@ static void U_CALLCONV _deleteRule(void *rule) { delete (TransliterationRule *)rule; } +static void syntaxError(const UnicodeString& r1, + const UnicodeString& r2, + UParseError& parseError) { + parseError.line =0 ; + parseError.offset =0; + int32_t len1 = r1.length(); + int32_t len2 = r2.length(); + // for pre-context + int32_t start = (len1freeze() may be called multiple times, * although for optimal performance it shouldn't be. */ -void TransliterationRuleSet::freeze(UErrorCode& status) { +void TransliterationRuleSet::freeze(UParseError& parseError,UErrorCode& status) { /* Construct the rule array and index table. We reorder the * rules by sorting them into 256 bins. Each bin contains all * rules matching the index value for that bin. A rule @@ -181,7 +205,9 @@ void TransliterationRuleSet::freeze(UErrorCode& status) { //| errors.append("\n"); //| } //| errors.append("Rule " + r1 + " masks " + r2); - status = U_ILLEGAL_ARGUMENT_ERROR; + status = U_RULE_MASK_ERROR; + UnicodeString rp1,rp2; + syntaxError(r1->getPattern(rp1),r2->getPattern(rp2),parseError); return; } } @@ -217,6 +243,8 @@ UBool TransliterationRuleSet::transliterate(Replaceable& text, return TRUE; case U_PARTIAL_MATCH: return FALSE; + default: /* Ram: added default to make GCC happy */ + break; } } // No match or partial match from any rule diff --git a/icu4c/source/i18n/rbt_set.h b/icu4c/source/i18n/rbt_set.h index b5a3bf4f58f..2592808d639 100644 --- a/icu4c/source/i18n/rbt_set.h +++ b/icu4c/source/i18n/rbt_set.h @@ -90,7 +90,7 @@ public: * That is, freeze() may be called multiple times, * although for optimal performance it shouldn't be. */ - virtual void freeze(UErrorCode& status); + virtual void freeze(UParseError& parseError, UErrorCode& status); /** * Transliterate the given text with the given UTransPosition diff --git a/icu4c/source/i18n/translit.cpp b/icu4c/source/i18n/translit.cpp index 34088768089..a442c77beee 100644 --- a/icu4c/source/i18n/translit.cpp +++ b/icu4c/source/i18n/translit.cpp @@ -636,8 +636,9 @@ void Transliterator::adoptFilter(UnicodeFilter* filterToAdopt) { * transliterator is registered. * @see #registerInstance */ -Transliterator* Transliterator::createInverse(void) const { - return Transliterator::createInstance(ID, UTRANS_REVERSE); +Transliterator* Transliterator::createInverse(UErrorCode& status) const { + UParseError parseError; + return Transliterator::createInstance(ID, UTRANS_REVERSE,parseError,status); } /** @@ -653,8 +654,15 @@ Transliterator* Transliterator::createInverse(void) const { */ Transliterator* Transliterator::createInstance(const UnicodeString& ID, UTransDirection dir, - UParseError* parseError) { - UErrorCode status = U_ZERO_ERROR; + UParseError& parseError, + UErrorCode& status) { + return createInstance(ID, dir, -1, NULL, parseError, status); +} + +Transliterator* Transliterator::createInstance(const UnicodeString& ID, + UTransDirection dir, + UErrorCode& status) { + UParseError parseError; return createInstance(ID, dir, -1, NULL, parseError, status); } @@ -671,7 +679,7 @@ Transliterator* Transliterator::createInstance(const UnicodeString& ID, UTransDirection dir, int32_t idSplitPoint, Transliterator *adoptedSplitTrans, - UParseError* parseError, + UParseError& parseError, UErrorCode& status) { if (U_FAILURE(status)) { return 0; @@ -714,11 +722,11 @@ Transliterator* Transliterator::createInstance(const UnicodeString& ID, Transliterator* Transliterator::createFromRules(const UnicodeString& ID, const UnicodeString& rules, UTransDirection dir, - UParseError* parseError) { + UParseError& parseError, + UErrorCode& status) { UnicodeString idBlock; int32_t idSplitPoint = -1; TransliterationRuleData *data = 0; - UErrorCode status = U_ZERO_ERROR; TransliteratorParser::parse(rules, dir, data, idBlock, idSplitPoint, @@ -743,7 +751,7 @@ Transliterator* Transliterator::createFromRules(const UnicodeString& ID, } else { if (data == 0) { // idBlock, no data -- this is an alias - Transliterator *t = createInstance(idBlock, dir, parseError); + Transliterator *t = createInstance(idBlock, dir, parseError,status); if (t != 0) { t->setID(ID); } @@ -754,7 +762,7 @@ Transliterator* Transliterator::createFromRules(const UnicodeString& ID, UnicodeString id("_", ""); Transliterator *t = new RuleBasedTransliterator(id, data, TRUE); // TRUE == adopt data object t = new CompoundTransliterator(ID, idBlock, idSplitPoint, - t, status); + t,parseError,status); if (U_FAILURE(status)) { delete t; t = 0; @@ -798,7 +806,7 @@ void Transliterator::parseCompoundID(const UnicodeString& id, Transliterator *adoptedSplitTrans, UVector& result, int32_t& splitTransIndex, - UParseError* parseError, + UParseError& parseError, UErrorCode& status) { if (U_FAILURE(status)) { return; @@ -819,7 +827,13 @@ void Transliterator::parseCompoundID(const UnicodeString& id, int32_t p = pos; UBool sawDelimiter; // We ignore this Transliterator *t = - parseID(id, regenID, p, sawDelimiter, dir, parseError, TRUE); + parseID(id, regenID, p, sawDelimiter, dir, parseError, TRUE,status); + + if(U_FAILURE(status)){ + delete t; + break; + } + if (p == pos || (p < id.length() && !sawDelimiter)) { delete t; status = U_ILLEGAL_ARGUMENT_ERROR; @@ -885,8 +899,9 @@ Transliterator* Transliterator::parseID(const UnicodeString& ID, int32_t& pos, UBool& sawDelimiter, UTransDirection dir, - UParseError* parseError, - UBool create) { + UParseError& parseError, + UBool create, + UErrorCode& status) { int32_t limit, preDelimLimit, revStart, revLimit, idStart, idLimit, @@ -1016,17 +1031,17 @@ Transliterator* Transliterator::parseID(const UnicodeString& ID, else { // Create the actual transliterator from the registry - if (parseError != 0) { - parseError->line = parseError->offset = 0; - parseError->preContext[0] = parseError->postContext[0] = 0; - } + //if (parseError != 0) { + parseError.line = parseError.offset = 0; + parseError.preContext[0] = parseError.postContext[0] = 0; + //} if (registry == 0) { initializeRegistry(); } { Mutex lock(®istryMutex); str.truncate(0); - t = registry->get(id, str, parseError); + t = registry->get(id, str, parseError,status); // Need to enclose this in a block to prevent deadlock when // instantiating aliases (below). } @@ -1034,7 +1049,7 @@ Transliterator* Transliterator::parseID(const UnicodeString& ID, if (str.length() != 0) { // assert(t==0); // Instantiate an alias - t = createInstance(str, UTRANS_FORWARD, parseError); + t = createInstance(str, UTRANS_FORWARD, parseError,status); } if (t == 0) { diff --git a/icu4c/source/i18n/transreg.cpp b/icu4c/source/i18n/transreg.cpp index e426a773047..e040f1b5c57 100644 --- a/icu4c/source/i18n/transreg.cpp +++ b/icu4c/source/i18n/transreg.cpp @@ -300,10 +300,11 @@ TransliteratorRegistry::~TransliteratorRegistry() { Transliterator* TransliteratorRegistry::get(const UnicodeString& ID, UnicodeString& aliasReturn, - UParseError* parseError) { + UParseError& parseError, + UErrorCode& status) { Entry *entry = find(ID); return (entry == 0) ? 0 - : instantiateEntry(ID, entry, aliasReturn, parseError); + : instantiateEntry(ID, entry, aliasReturn, parseError,status); } void TransliteratorRegistry::put(Transliterator* adoptedProto, @@ -829,8 +830,8 @@ Entry* TransliteratorRegistry::find(UnicodeString& source, Transliterator* TransliteratorRegistry::instantiateEntry(const UnicodeString& ID, Entry *entry, UnicodeString &aliasReturn, - UParseError* parseError) { - UErrorCode status = U_ZERO_ERROR; + UParseError& parseError, + UErrorCode& status) { for (;;) { if (entry->entryType == Entry::RBT_DATA) { @@ -846,7 +847,7 @@ Transliterator* TransliteratorRegistry::instantiateEntry(const UnicodeString& ID UnicodeString id("_", ""); Transliterator *t = new RuleBasedTransliterator(id, entry->u.data); t = new CompoundTransliterator(ID, entry->stringArg, - entry->intArg, t, status); + entry->intArg, t, parseError, status); if (U_FAILURE(status)) { delete t; t = 0; diff --git a/icu4c/source/i18n/transreg.h b/icu4c/source/i18n/transreg.h index 8696ba18780..8ddca286229 100644 --- a/icu4c/source/i18n/transreg.h +++ b/icu4c/source/i18n/transreg.h @@ -64,7 +64,8 @@ class TransliteratorRegistry { */ Transliterator* get(const UnicodeString& ID, UnicodeString& aliasReturn, - UParseError* parseError); + UParseError& parseError, + UErrorCode& status); /** * Register a prototype (adopted). This adds an entry to the @@ -246,7 +247,8 @@ class TransliteratorRegistry { Transliterator* instantiateEntry(const UnicodeString& ID, Entry *entry, UnicodeString& aliasReturn, - UParseError* parseError); + UParseError& parseError, + UErrorCode& status); static void IDtoSTV(const UnicodeString& id, UnicodeString& source, diff --git a/icu4c/source/i18n/unicode/cpdtrans.h b/icu4c/source/i18n/unicode/cpdtrans.h index d722121a7b6..f231d7dbf29 100644 --- a/icu4c/source/i18n/unicode/cpdtrans.h +++ b/icu4c/source/i18n/unicode/cpdtrans.h @@ -34,7 +34,7 @@ class U_I18N_API UVector; *

Copyright © IBM Corporation 1999. All rights reserved. * * @author Alan Liu - * @version $RCSfile: cpdtrans.h,v $ $Revision: 1.16 $ $Date: 2001/08/15 19:06:25 $ + * @version $RCSfile: cpdtrans.h,v $ $Revision: 1.17 $ $Date: 2001/08/31 03:22:53 $ * @draft */ class U_I18N_API CompoundTransliterator : public Transliterator { @@ -83,6 +83,7 @@ public: CompoundTransliterator(const UnicodeString& id, UTransDirection dir, UnicodeFilter* adoptedFilter, + UParseError& parseError, UErrorCode& status); /** @@ -91,6 +92,7 @@ public: * @draft */ CompoundTransliterator(const UnicodeString& id, + UParseError& parseError, UErrorCode& status); /** @@ -179,6 +181,7 @@ private: const UnicodeString& idBlock, int32_t idSplitPoint, Transliterator *adoptedTrans, + UParseError& parseError, UErrorCode& status); /** @@ -193,6 +196,7 @@ private: int32_t idSplitPoint, Transliterator *adoptedRbt, UBool fixReverseID, + UParseError& parseError, UErrorCode& status); void init(UVector& list, diff --git a/icu4c/source/i18n/unicode/rbt.h b/icu4c/source/i18n/unicode/rbt.h index 34fd558e15e..d21f2de5b1f 100644 --- a/icu4c/source/i18n/unicode/rbt.h +++ b/icu4c/source/i18n/unicode/rbt.h @@ -477,8 +477,8 @@ private: void _construct(const UnicodeString& rules, UTransDirection direction, - UErrorCode& status, - UParseError* parseError = 0); + UParseError& parseError, + UErrorCode& status); }; /** @@ -496,7 +496,7 @@ inline RuleBasedTransliterator::RuleBasedTransliterator( UParseError& parseError, UErrorCode& status) : Transliterator(id, adoptedFilter) { - _construct(rules, direction, status, &parseError); + _construct(rules, direction,parseError,status); } /** @@ -513,7 +513,8 @@ inline RuleBasedTransliterator::RuleBasedTransliterator( UnicodeFilter* adoptedFilter, UErrorCode& status) : Transliterator(id, adoptedFilter) { - _construct(rules, direction, status); + UParseError parseError; + _construct(rules, direction,parseError, status); } /** @@ -525,7 +526,8 @@ inline RuleBasedTransliterator::RuleBasedTransliterator( UTransDirection direction, UErrorCode& status) : Transliterator(id, 0) { - _construct(rules, direction, status); + UParseError parseError; + _construct(rules, direction,parseError, status); } /** @@ -536,7 +538,8 @@ inline RuleBasedTransliterator::RuleBasedTransliterator( const UnicodeString& rules, UErrorCode& status) : Transliterator(id, 0) { - _construct(rules, UTRANS_FORWARD, status); + UParseError parseError; + _construct(rules, UTRANS_FORWARD, parseError, status); } /** @@ -548,7 +551,8 @@ inline RuleBasedTransliterator::RuleBasedTransliterator( UnicodeFilter* adoptedFilter, UErrorCode& status) : Transliterator(id, adoptedFilter) { - _construct(rules, UTRANS_FORWARD, status); + UParseError parseError; + _construct(rules, UTRANS_FORWARD,parseError, status); } #endif diff --git a/icu4c/source/i18n/unicode/translit.h b/icu4c/source/i18n/unicode/translit.h index a8e80e131c6..4257a072ec2 100644 --- a/icu4c/source/i18n/unicode/translit.h +++ b/icu4c/source/i18n/unicode/translit.h @@ -278,7 +278,7 @@ protected: UTransDirection dir, int32_t idSplitPoint, Transliterator *adoptedSplitTrans, - UParseError* parseError, + UParseError& parseError, UErrorCode& status); /** @@ -291,7 +291,7 @@ protected: Transliterator *adoptedSplitTrans, UVector& result, int32_t& splitTransIndex, - UParseError* parseError, + UParseError& parseError, UErrorCode& status); /** * Internal parsing method for subclasses. @@ -301,8 +301,9 @@ protected: int32_t& pos, UBool& sawDelimiter, UTransDirection dir, - UParseError* parseError, - UBool create); + UParseError& parseError, + UBool create, + UErrorCode& status); /** * Internal parsing method for parseID. @@ -677,7 +678,7 @@ public: * @see #registerInstance * @draft */ - Transliterator* createInverse(void) const; + Transliterator* createInverse(UErrorCode& status) const; /** * Returns a Transliterator object given its ID. @@ -693,9 +694,13 @@ public: * @draft */ static Transliterator* createInstance(const UnicodeString& ID, - UTransDirection dir = UTRANS_FORWARD, - UParseError* parseError = 0); + UTransDirection dir, + UParseError& parseError, + UErrorCode& status); + static Transliterator* createInstance(const UnicodeString& ID, + UTransDirection dir, + UErrorCode& status); /** * Returns a Transliterator object constructed from * the given rule string. This will be a RuleBasedTransliterator, @@ -706,8 +711,9 @@ public: */ static Transliterator* createFromRules(const UnicodeString& ID, const UnicodeString& rules, - UTransDirection dir = UTRANS_FORWARD, - UParseError* parseError = 0); + UTransDirection dir, + UParseError& parseError, + UErrorCode& status); /** * Create a rule string that can be passed to createFromRules() diff --git a/icu4c/source/i18n/unicode/utrans.h b/icu4c/source/i18n/unicode/utrans.h index 37f10e6468f..fa82a328eb9 100644 --- a/icu4c/source/i18n/unicode/utrans.h +++ b/icu4c/source/i18n/unicode/utrans.h @@ -58,7 +58,7 @@ typedef void* UTransliterator; * @draft */ typedef enum _UTransDirection { - + /** * UTRANS_FORWARD means from to for a * transliterator with ID -. For a transliterator @@ -134,7 +134,7 @@ typedef struct _UTransPosition { /******************************************************************** * General API ********************************************************************/ - +#if 0 /** * Open a system transliterator, given its ID. Any non-NULL result * from this function should later be closed with utrans_close(). @@ -179,6 +179,15 @@ utrans_openRules(const char* id, UTransDirection dir, UParseError* parseErr, /* may be NULL */ UErrorCode* status); +#endif + +U_CAPI UTransliterator* +utrans_open(const char* id, + UTransDirection dir, + const UChar* rules, /* may be Null */ + int32_t rulesLength, /* -1 if null-terminated */ + UParseError* parseError, /* may be Null */ + UErrorCode* status); /** * Open an inverse of an existing transliterator. For this to work, @@ -481,4 +490,31 @@ utrans_transIncrementalUChars(const UTransliterator* trans, UTransPosition* pos, UErrorCode* status); + +/********************* Deprecated API ************************************/ +/** + *@deprecated Remove after Aug 2002 + */ + +#ifdef U_USE_DEPRECATED_FORMAT_API + +#if ((U_ICU_VERSION_MAJOR_NUM != 1) || (U_ICU_VERSION_MINOR_NUM !=9)) +# error "ICU version has changed. Please redefine the macros under U_USE_DEPRECATED_FORMAT_API pre-processor definition" +#else + U_CAPI UTransliterator* + utrans_openRules(const char* id, + const UChar* rules, + int32_t rulesLength, /* -1 if null-terminated */ + UTransDirection dir, + UParseError* parseErr, /* may be NULL */ + UErrorCode* status){ + return utrans_open(id,dir,rules,rulesLength,parseErr,status); + } + +# define utrans_open_1_9(id,dir,status) utrans_open(id,dir,NULL,0,NULL,status) + +#endif +#endif +/********************* End **********************************************/ + #endif diff --git a/icu4c/source/i18n/utrans.cpp b/icu4c/source/i18n/utrans.cpp index c9fdec67e99..a7be153946f 100644 --- a/icu4c/source/i18n/utrans.cpp +++ b/icu4c/source/i18n/utrans.cpp @@ -128,10 +128,12 @@ _utrans_copyUnicodeStringToChars(const UnicodeString& str, /******************************************************************** * General API ********************************************************************/ +#if 0 U_CAPI UTransliterator* utrans_open(const char* id, UTransDirection dir, + UParseError* parseError, UErrorCode* status) { utrans_ENTRY(status) NULL; @@ -144,7 +146,7 @@ utrans_open(const char* id, UnicodeString ID(id, ""); // use invariant converter Transliterator *trans = NULL; - trans = Transliterator::createInstance(ID, dir, NULL); + trans = Transliterator::createInstance(ID, dir, *parseError, *status); if (trans == NULL) { *status = U_ILLEGAL_ARGUMENT_ERROR; @@ -192,6 +194,57 @@ utrans_openRules(const char* id, } return (UTransliterator*) trans; } +#endif + +U_CAPI UTransliterator* +utrans_open(const char* id, + UTransDirection dir, + const UChar* rules, /* may be Null */ + int32_t rulesLength, /* -1 if null-terminated */ + UParseError* parseError, /* may be Null */ + UErrorCode* status) { + + utrans_ENTRY(status) NULL; + + if (id == NULL) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + UParseError temp; + + if(parseError == NULL){ + parseError = &temp; + } + + UnicodeString ID(id, ""); // use invariant converter + + if(rules==NULL){ + + Transliterator *trans = NULL; + + trans = Transliterator::createInstance(ID, dir, *parseError, *status); + + if(U_FAILURE(*status)){ + return NULL; + } + return (UTransliterator*) trans; + }else{ + UnicodeString ruleStr(rulesLength < 0, + rules, + rulesLength); // r-o alias + + RuleBasedTransliterator *trans = NULL; + trans = new RuleBasedTransliterator(ID, ruleStr, dir, + NULL, *parseError, *status); + if (trans == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + } else if (U_FAILURE(*status)) { + delete trans; + trans = NULL; + } + return (UTransliterator*) trans; + } +} U_CAPI UTransliterator* utrans_openInverse(const UTransliterator* trans, @@ -200,11 +253,7 @@ utrans_openInverse(const UTransliterator* trans, utrans_ENTRY(status) NULL; UTransliterator* result = - (UTransliterator*) ((Transliterator*) trans)->createInverse(); - - if (result == NULL) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - } + (UTransliterator*) ((Transliterator*) trans)->createInverse(*status); return result; } diff --git a/icu4c/source/test/cintltst/utransts.c b/icu4c/source/test/cintltst/utransts.c index b99657665f8..98b1b8daab9 100644 --- a/icu4c/source/test/cintltst/utransts.c +++ b/icu4c/source/test/cintltst/utransts.c @@ -143,7 +143,7 @@ static void TestAPI() { /* Test open */ utrans_getAvailableID(0, buf, BUF_CAP); - trans = utrans_open(buf, UTRANS_FORWARD, &status); + trans = utrans_open(buf, UTRANS_FORWARD,NULL,0,NULL, &status); if (U_FAILURE(status)) { log_err("FAIL: utrans_open(%s) failed, error=%s\n", buf, u_errorName(status)); @@ -186,7 +186,7 @@ static void TestOpenInverse(){ }; for(i=0; ib*/ /* Make sure it doesn't exist */ - t1=utrans_open("TestA-TestB", UTRANS_FORWARD, &status); + t1=utrans_open("TestA-TestB", UTRANS_FORWARD,NULL,0,NULL, &status); if(t1 != NULL || U_SUCCESS(status)) { log_err("FAIL: TestA-TestB already registered\n"); return; } status=U_ZERO_ERROR; /* Check inverse too */ - inverse1=utrans_open("TestA-TestB", UTRANS_REVERSE, &status); + inverse1=utrans_open("TestA-TestB", UTRANS_REVERSE, NULL,0,NULL,&status); if(inverse1 != NULL || U_SUCCESS(status)) { log_err("FAIL: TestA-TestB already registered\n"); return; } status=U_ZERO_ERROR; /* Create it */ - rules=utrans_openRules("TestA-TestB", rule, 4, UTRANS_FORWARD, NULL, &status); + rules=utrans_open("TestA-TestB",UTRANS_FORWARD, rule, 4, NULL, &status); if(U_FAILURE(status)){ log_err("FAIL: utrans_openRules(a<>B) failed with error=%s\n", myErrorName(status)); return; @@ -288,7 +288,7 @@ static void TestRegisterUnregister(){ } status=U_ZERO_ERROR; /* Now check again -- should exist now*/ - t1= utrans_open("TestA-TestB", UTRANS_FORWARD, &status); + t1= utrans_open("TestA-TestB", UTRANS_FORWARD, NULL,0,NULL,&status); if(U_FAILURE(status) || t1 == NULL){ log_err("FAIL: TestA-TestB not registered\n"); return; @@ -299,7 +299,7 @@ static void TestRegisterUnregister(){ status=U_ZERO_ERROR; utrans_unregister("TestA-TestB"); /* now Make sure it doesn't exist */ - t1=utrans_open("TestA-TestB", UTRANS_FORWARD, &status); + t1=utrans_open("TestA-TestB", UTRANS_FORWARD,NULL,0,NULL, &status); if(U_SUCCESS(status) || t1 != NULL) { log_err("FAIL: TestA-TestB isn't unregistered\n"); return; @@ -374,7 +374,7 @@ static void TestFilter() { int32_t DATA_length = sizeof(DATA) / sizeof(DATA[0]); int32_t i; - UTransliterator* hex = utrans_open("Any-Hex", UTRANS_FORWARD, &status); + UTransliterator* hex = utrans_open("Any-Hex", UTRANS_FORWARD, NULL,0,NULL,&status); if (hex == 0 || U_FAILURE(status)) { log_err("FAIL: utrans_open(Unicode-Hex) failed, error=%s\n", @@ -432,7 +432,7 @@ static void _expectRules(const char* crules, u_uastrcpy(rules, crules); - trans = utrans_openRules(crules /*use rules as ID*/, rules, -1, UTRANS_FORWARD, + trans = utrans_open(crules /*use rules as ID*/, UTRANS_FORWARD, rules, -1, &parseErr, &status); if (U_FAILURE(status)) { utrans_close(trans);