]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/i18n/msgfmt.cpp
ICU-57132.0.1.tar.gz
[apple/icu.git] / icuSources / i18n / msgfmt.cpp
index f9b353fcbe114a6393b549bb40cd168d27d382cc..1fe2c8d622e04be9dfba3bb2fb6511a17f3d0530 100644 (file)
@@ -1,6 +1,6 @@
 /********************************************************************
  * COPYRIGHT:
 /********************************************************************
  * COPYRIGHT:
- * Copyright (c) 1997-2013, International Business Machines Corporation and
+ * Copyright (c) 1997-2015, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************
  *
  * others. All Rights Reserved.
  ********************************************************************
  *
@@ -46,6 +46,7 @@
 #include "ustrfmt.h"
 #include "util.h"
 #include "uvector.h"
 #include "ustrfmt.h"
 #include "util.h"
 #include "uvector.h"
+#include "visibledigits.h"
 
 // *****************************************************************************
 // class MessageFormat
 
 // *****************************************************************************
 // class MessageFormat
@@ -413,7 +414,7 @@ MessageFormat::operator==(const Format& rhs) const
     if (count != rhs_count) {
         return FALSE;
     }
     if (count != rhs_count) {
         return FALSE;
     }
-    int32_t idx = 0, rhs_idx = 0, pos = -1, rhs_pos = -1;
+    int32_t idx = 0, rhs_idx = 0, pos = UHASH_FIRST, rhs_pos = UHASH_FIRST;
     for (; idx < count && rhs_idx < rhs_count && U_SUCCESS(ec); ++idx, ++rhs_idx) {
         const UHashElement* cur = uhash_nextElement(customFormatArgStarts, &pos);
         const UHashElement* rhs_cur = uhash_nextElement(that.customFormatArgStarts, &rhs_pos);
     for (; idx < count && rhs_idx < rhs_count && U_SUCCESS(ec); ++idx, ++rhs_idx) {
         const UHashElement* cur = uhash_nextElement(customFormatArgStarts, &pos);
         const UHashElement* rhs_cur = uhash_nextElement(that.customFormatArgStarts, &rhs_pos);
@@ -786,16 +787,12 @@ MessageFormat::setFormat(const UnicodeString& formatName,
         (partIndex = nextTopLevelArgStart(partIndex)) >= 0 && U_SUCCESS(status);
     ) {
         if (argNameMatches(partIndex + 1, formatName, argNumber)) {
         (partIndex = nextTopLevelArgStart(partIndex)) >= 0 && U_SUCCESS(status);
     ) {
         if (argNameMatches(partIndex + 1, formatName, argNumber)) {
-            if (&newFormat == NULL) {
-                setCustomArgStartFormat(partIndex, NULL, status);
-            } else {
-                Format* new_format = newFormat.clone();
-                if (new_format == NULL) {
-                    status = U_MEMORY_ALLOCATION_ERROR;
-                    return;
-                }
-                setCustomArgStartFormat(partIndex, new_format, status);
+            Format* new_format = newFormat.clone();
+            if (new_format == NULL) {
+                status = U_MEMORY_ALLOCATION_ERROR;
+                return;
             }
             }
+            setCustomArgStartFormat(partIndex, new_format, status);
         }
     }
 }
         }
     }
 }
@@ -1336,7 +1333,7 @@ void MessageFormat::copyObjects(const MessageFormat& that, UErrorCode& ec) {
 
         const int32_t count = uhash_count(that.cachedFormatters);
         int32_t pos, idx;
 
         const int32_t count = uhash_count(that.cachedFormatters);
         int32_t pos, idx;
-        for (idx = 0, pos = -1; idx < count && U_SUCCESS(ec); ++idx) {
+        for (idx = 0, pos = UHASH_FIRST; idx < count && U_SUCCESS(ec); ++idx) {
             const UHashElement* cur = uhash_nextElement(that.cachedFormatters, &pos);
             Format* newFormat = ((Format*)(cur->value.pointer))->clone();
             if (newFormat) {
             const UHashElement* cur = uhash_nextElement(that.cachedFormatters, &pos);
             Format* newFormat = ((Format*)(cur->value.pointer))->clone();
             if (newFormat) {
@@ -1354,7 +1351,7 @@ void MessageFormat::copyObjects(const MessageFormat& that, UErrorCode& ec) {
         }
         const int32_t count = uhash_count(that.customFormatArgStarts);
         int32_t pos, idx;
         }
         const int32_t count = uhash_count(that.customFormatArgStarts);
         int32_t pos, idx;
-        for (idx = 0, pos = -1; idx < count && U_SUCCESS(ec); ++idx) {
+        for (idx = 0, pos = UHASH_FIRST; idx < count && U_SUCCESS(ec); ++idx) {
             const UHashElement* cur = uhash_nextElement(that.customFormatArgStarts, &pos);
             uhash_iputi(customFormatArgStarts, cur->key.integer, cur->value.integer, &ec);
         }
             const UHashElement* cur = uhash_nextElement(that.customFormatArgStarts, &pos);
             uhash_iputi(customFormatArgStarts, cur->key.integer, cur->value.integer, &ec);
         }
@@ -1959,8 +1956,12 @@ UnicodeString MessageFormat::PluralSelectorProvider::select(void *ctx, double nu
     context.formatter->format(context.number, context.numberString, ec);
     const DecimalFormat *decFmt = dynamic_cast<const DecimalFormat *>(context.formatter);
     if(decFmt != NULL) {
     context.formatter->format(context.number, context.numberString, ec);
     const DecimalFormat *decFmt = dynamic_cast<const DecimalFormat *>(context.formatter);
     if(decFmt != NULL) {
-        FixedDecimal dec = decFmt->getFixedDecimal(context.number, ec);
-        return rules->select(dec);
+        VisibleDigitsWithExponent digits;
+        decFmt->initVisibleDigitsWithExponent(context.number, digits, ec);
+        if (U_FAILURE(ec)) {
+            return UnicodeString(FALSE, OTHER_STRING, 5);
+        }
+        return rules->select(digits);
     } else {
         return rules->select(number);
     }
     } else {
         return rules->select(number);
     }