]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/i18n/rbt_set.cpp
ICU-64260.0.1.tar.gz
[apple/icu.git] / icuSources / i18n / rbt_set.cpp
index 2d6370657664578682d587c34f318fce414b0208..d8d0384dda6f41830d6e9926c5e7564842778d81 100644 (file)
@@ -1,12 +1,14 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 /*
-**********************************************************************
-*   Copyright (C) 1999, International Business Machines
-*   Corporation and others.  All Rights Reserved.
-**********************************************************************
-*   Date        Name        Description
-*   11/17/99    aliu        Creation.
-**********************************************************************
-*/
+ **********************************************************************
+ *   Copyright (C) 1999-2011, International Business Machines
+ *   Corporation and others.  All Rights Reserved.
+ **********************************************************************
+ *   Date        Name        Description
+ *   11/17/99    aliu        Creation.
+ **********************************************************************
+ */
 
 #include "unicode/utypes.h"
 
 
 #include "unicode/utypes.h"
 
 
 #include "unicode/unistr.h"
 #include "unicode/uniset.h"
 
 #include "unicode/unistr.h"
 #include "unicode/uniset.h"
+#include "unicode/utf16.h"
 #include "rbt_set.h"
 #include "rbt_rule.h"
 #include "cmemory.h"
 #include "rbt_set.h"
 #include "rbt_rule.h"
 #include "cmemory.h"
+#include "putilimp.h"
 
 U_CDECL_BEGIN
 
 U_CDECL_BEGIN
-static void U_EXPORT2 U_CALLCONV _deleteRule(void *rule) {
-    delete (U_NAMESPACE_QUALIFIER TransliterationRule *)rule;
+static void U_CALLCONV _deleteRule(void *rule) {
+    delete (icu::TransliterationRule *)rule;
 }
 U_CDECL_END
 
 }
 U_CDECL_END
 
@@ -89,7 +93,7 @@ UnicodeString& _escape(const UnicodeString &source,
                        UnicodeString &target) {
     for (int32_t i = 0; i < source.length(); ) {
         UChar32 ch = source.char32At(i);
                        UnicodeString &target) {
     for (int32_t i = 0; i < source.length(); ) {
         UChar32 ch = source.char32At(i);
-        i += UTF_CHAR_LENGTH(ch);
+        i += U16_LENGTH(ch);
         if (ch < 0x09 || (ch > 0x0A && ch < 0x20)|| ch > 0x7E) {
             if (ch <= 0xFFFF) {
                 target += "\\u";
         if (ch < 0x09 || (ch > 0x0A && ch < 0x20)|| ch > 0x7E) {
             if (ch <= 0xFFFF) {
                 target += "\\u";
@@ -119,7 +123,7 @@ inline void _debugOut(const char* msg, TransliterationRule* rule,
     UnicodeString esc;
     _escape(buf, esc);
     CharString cbuf(esc);
     UnicodeString esc;
     _escape(buf, esc);
     CharString cbuf(esc);
-    printf("%s\n", (char*) cbuf);
+    printf("%s\n", (const char*) cbuf);
 }
 
 #else
 }
 
 #else
@@ -132,10 +136,10 @@ inline void _debugOut(const char* msg, TransliterationRule* rule,
 
 // Fill the precontext and postcontext with the patterns of the rules
 // that are masking one another.
 
 // Fill the precontext and postcontext with the patterns of the rules
 // that are masking one another.
-static void maskingError(const U_NAMESPACE_QUALIFIER TransliterationRule& rule1,
-                         const U_NAMESPACE_QUALIFIER TransliterationRule& rule2,
+static void maskingError(const icu::TransliterationRule& rule1,
+                         const icu::TransliterationRule& rule2,
                          UParseError& parseError) {
                          UParseError& parseError) {
-    U_NAMESPACE_QUALIFIER UnicodeString r;
+    icu::UnicodeString r;
     int32_t len;
 
     parseError.line = parseError.offset = -1;
     int32_t len;
 
     parseError.line = parseError.offset = -1;
@@ -161,11 +165,14 @@ U_NAMESPACE_BEGIN
  */
 TransliterationRuleSet::TransliterationRuleSet(UErrorCode& status) : UMemory() {
     ruleVector = new UVector(&_deleteRule, NULL, status);
  */
 TransliterationRuleSet::TransliterationRuleSet(UErrorCode& status) : UMemory() {
     ruleVector = new UVector(&_deleteRule, NULL, status);
-    rules = NULL;
-    maxContextLength = 0;
+    if (U_FAILURE(status)) {
+        return;
+    }
     if (ruleVector == NULL) {
         status = U_MEMORY_ALLOCATION_ERROR;
     }
     if (ruleVector == NULL) {
         status = U_MEMORY_ALLOCATION_ERROR;
     }
+    rules = NULL;
+    maxContextLength = 0;
 }
 
 /**
 }
 
 /**
@@ -184,11 +191,19 @@ TransliterationRuleSet::TransliterationRuleSet(const TransliterationRuleSet& oth
     if (other.ruleVector != 0 && ruleVector != 0 && U_SUCCESS(status)) {
         len = other.ruleVector->size();
         for (i=0; i<len && U_SUCCESS(status); ++i) {
     if (other.ruleVector != 0 && ruleVector != 0 && U_SUCCESS(status)) {
         len = other.ruleVector->size();
         for (i=0; i<len && U_SUCCESS(status); ++i) {
-            ruleVector->addElement(new TransliterationRule(
-              *(TransliterationRule*)other.ruleVector->elementAt(i)), status);
+            TransliterationRule *tempTranslitRule = new TransliterationRule(*(TransliterationRule*)other.ruleVector->elementAt(i));
+            // Null pointer test
+            if (tempTranslitRule == NULL) {
+                status = U_MEMORY_ALLOCATION_ERROR;
+                break;
+            }
+            ruleVector->addElement(tempTranslitRule, status);
+            if (U_FAILURE(status)) {
+                break;
+            }
         }
     }
         }
     }
-    if (other.rules != 0) {
+    if (other.rules != 0 && U_SUCCESS(status)) {
         UParseError p;
         freeze(p, status);
     }
         UParseError p;
         freeze(p, status);
     }
@@ -404,7 +419,7 @@ UBool TransliterationRuleSet::transliterate(Replaceable& text,
         }
     }
     // No match or partial match from any rule
         }
     }
     // No match or partial match from any rule
-    pos.start += UTF_CHAR_LENGTH(text.char32At(pos.start));
+    pos.start += U16_LENGTH(text.char32At(pos.start));
     _debugOut("no match", NULL, text, pos);
     return TRUE;
 }
     _debugOut("no match", NULL, text, pos);
     return TRUE;
 }
@@ -433,17 +448,18 @@ UnicodeString& TransliterationRuleSet::toRules(UnicodeString& ruleSource,
  * (getTarget=false) or emitted (getTarget=true) by this set.
  */
 UnicodeSet& TransliterationRuleSet::getSourceTargetSet(UnicodeSet& result,
  * (getTarget=false) or emitted (getTarget=true) by this set.
  */
 UnicodeSet& TransliterationRuleSet::getSourceTargetSet(UnicodeSet& result,
-                                                      UBool getTarget) const {
+                               UBool getTarget) const
+{
     result.clear();
     int32_t count = ruleVector->size();
     for (int32_t i=0; i<count; ++i) {
     result.clear();
     int32_t count = ruleVector->size();
     for (int32_t i=0; i<count; ++i) {
-       TransliterationRule* r =
-           (TransliterationRule*) ruleVector->elementAt(i);
-       if (getTarget) {
-           r->addTargetSetTo(result);
-       } else {
-           r->addSourceSetTo(result);
-       }
+        TransliterationRule* r =
+            (TransliterationRule*) ruleVector->elementAt(i);
+        if (getTarget) {
+            r->addTargetSetTo(result);
+        } else {
+            r->addSourceSetTo(result);
+        }
     }
     return result;
 }
     }
     return result;
 }