]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/i18n/fmtable.cpp
ICU-400.37.tar.gz
[apple/icu.git] / icuSources / i18n / fmtable.cpp
index b767b332166eaab883bfc2407712f8ce56ce857f..66657ff82108beede7055677760a5a6ce7a5a0af 100644 (file)
@@ -1,6 +1,6 @@
 /*
 *******************************************************************************
 /*
 *******************************************************************************
-* Copyright (C) 1997-2006, International Business Machines Corporation and    *
+* Copyright (C) 1997-2008, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 *
@@ -70,7 +70,10 @@ static inline UBool instanceOfMeasure(const UObject* a) {
  */
 static inline Formattable* createArrayCopy(const Formattable* array, int32_t count) {
     Formattable *result = new Formattable[count];
  */
 static inline Formattable* createArrayCopy(const Formattable* array, int32_t count) {
     Formattable *result = new Formattable[count];
-    for (int32_t i=0; i<count; ++i) result[i] = array[i]; // Don't memcpy!
+    if (result != NULL) {
+        for (int32_t i=0; i<count; ++i)
+            result[i] = array[i]; // Don't memcpy!
+    }
     return result;
 }
 
     return result;
 }
 
@@ -272,7 +275,11 @@ Formattable::operator==(const Formattable& that) const
         }
         break;
     case kObject:
         }
         break;
     case kObject:
-        equal = objectEquals(fValue.fObject, that.fValue.fObject);
+        if (fValue.fObject == NULL || that.fValue.fObject == NULL) {
+            equal = FALSE;
+        } else {
+            equal = objectEquals(fValue.fObject, that.fValue.fObject);
+        }
         break;
     }
 
         break;
     }
 
@@ -364,6 +371,10 @@ Formattable::getLong(UErrorCode& status) const
             return (int32_t)fValue.fDouble; // loses fraction
         }
     case Formattable::kObject:
             return (int32_t)fValue.fDouble; // loses fraction
         }
     case Formattable::kObject:
+        if (fValue.fObject == NULL) {
+            status = U_MEMORY_ALLOCATION_ERROR;
+            return 0;
+        }
         // TODO Later replace this with instanceof call
         if (instanceOfMeasure(fValue.fObject)) {
             return ((const Measure*) fValue.fObject)->
         // TODO Later replace this with instanceof call
         if (instanceOfMeasure(fValue.fObject)) {
             return ((const Measure*) fValue.fObject)->
@@ -398,6 +409,10 @@ Formattable::getInt64(UErrorCode& status) const
             return (int64_t)fValue.fDouble;
         }
     case Formattable::kObject:
             return (int64_t)fValue.fDouble;
         }
     case Formattable::kObject:
+        if (fValue.fObject == NULL) {
+            status = U_MEMORY_ALLOCATION_ERROR;
+            return 0;
+        }
         // TODO Later replace this with instanceof call
         if (instanceOfMeasure(fValue.fObject)) {
             return ((const Measure*) fValue.fObject)->
         // TODO Later replace this with instanceof call
         if (instanceOfMeasure(fValue.fObject)) {
             return ((const Measure*) fValue.fObject)->
@@ -424,6 +439,10 @@ Formattable::getDouble(UErrorCode& status) const
     case Formattable::kDouble:
         return fValue.fDouble;
     case Formattable::kObject:
     case Formattable::kDouble:
         return fValue.fDouble;
     case Formattable::kObject:
+        if (fValue.fObject == NULL) {
+            status = U_MEMORY_ALLOCATION_ERROR;
+            return 0;
+        }
         // TODO Later replace this with instanceof call
         if (instanceOfMeasure(fValue.fObject)) {
             return ((const Measure*) fValue.fObject)->
         // TODO Later replace this with instanceof call
         if (instanceOfMeasure(fValue.fObject)) {
             return ((const Measure*) fValue.fObject)->
@@ -545,7 +564,11 @@ Formattable::getString(UnicodeString& result, UErrorCode& status) const
         setError(status, U_INVALID_FORMAT_ERROR);
         result.setToBogus();
     } else {
         setError(status, U_INVALID_FORMAT_ERROR);
         result.setToBogus();
     } else {
-        result = *fValue.fString;
+        if (fValue.fString == NULL) {
+            setError(status, U_MEMORY_ALLOCATION_ERROR);
+        } else {
+            result = *fValue.fString;
+        }
     }
     return result;
 }
     }
     return result;
 }
@@ -558,6 +581,10 @@ Formattable::getString(UErrorCode& status) const
         setError(status, U_INVALID_FORMAT_ERROR);
         return *getBogus();
     }
         setError(status, U_INVALID_FORMAT_ERROR);
         return *getBogus();
     }
+    if (fValue.fString == NULL) {
+        setError(status, U_MEMORY_ALLOCATION_ERROR);
+        return *getBogus();
+    }
     return *fValue.fString;
 }
 
     return *fValue.fString;
 }
 
@@ -569,6 +596,10 @@ Formattable::getString(UErrorCode& status)
         setError(status, U_INVALID_FORMAT_ERROR);
         return *getBogus();
     }
         setError(status, U_INVALID_FORMAT_ERROR);
         return *getBogus();
     }
+    if (fValue.fString == NULL) {
+       setError(status, U_MEMORY_ALLOCATION_ERROR);
+       return *getBogus();
+    }
     return *fValue.fString;
 }
 
     return *fValue.fString;
 }