diff options
author | Elliott Hughes <enh@google.com> | 2013-09-04 15:38:20 -0700 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2013-09-04 15:38:20 -0700 |
commit | 8c80e6bbbe48bc1a3a2c0c0a2eed252e1c04ea2c (patch) | |
tree | 896dfe983407a6db9d10b1cd429b2f7591fa3eb9 /luni/src/main/native | |
parent | 1730b1d96c7d73848866ba6c52856924d2ae78bc (diff) | |
download | libcore-8c80e6bbbe48bc1a3a2c0c0a2eed252e1c04ea2c.zip libcore-8c80e6bbbe48bc1a3a2c0c0a2eed252e1c04ea2c.tar.gz libcore-8c80e6bbbe48bc1a3a2c0c0a2eed252e1c04ea2c.tar.bz2 |
Only use public API for icu4c's FieldPositionIterator.
Change-Id: I247f7c644537b8e9f67f4f27360ce1449fa04300
Diffstat (limited to 'luni/src/main/native')
-rw-r--r-- | luni/src/main/native/IcuUtilities.h | 1 | ||||
-rw-r--r-- | luni/src/main/native/libcore_icu_NativeDecimalFormat.cpp | 71 |
2 files changed, 43 insertions, 29 deletions
diff --git a/luni/src/main/native/IcuUtilities.h b/luni/src/main/native/IcuUtilities.h index cff1e0d..ffcfcda 100644 --- a/luni/src/main/native/IcuUtilities.h +++ b/luni/src/main/native/IcuUtilities.h @@ -17,6 +17,7 @@ #ifndef ICU_UTILITIES_H_included #define ICU_UTILITIES_H_included +#undef U_HAVE_STD_STRING #define U_HAVE_STD_STRING 1 // For UnicodeString::toUTF8String(std::string&). #include "jni.h" diff --git a/luni/src/main/native/libcore_icu_NativeDecimalFormat.cpp b/luni/src/main/native/libcore_icu_NativeDecimalFormat.cpp index 94ef08d..af1d8fe 100644 --- a/luni/src/main/native/libcore_icu_NativeDecimalFormat.cpp +++ b/luni/src/main/native/libcore_icu_NativeDecimalFormat.cpp @@ -16,25 +16,28 @@ #define LOG_TAG "NativeDecimalFormat" +#include <stdlib.h> +#include <string.h> + +#include <vector> + +#include "cutils/log.h" +#include "digitlst.h" #include "IcuUtilities.h" -#include "JNIHelp.h" #include "JniConstants.h" #include "JniException.h" +#include "JNIHelp.h" #include "ScopedJavaUnicodeString.h" #include "ScopedPrimitiveArray.h" #include "ScopedStringChars.h" #include "ScopedUtfChars.h" -#include "UniquePtr.h" -#include "cutils/log.h" -#include "digitlst.h" #include "unicode/decimfmt.h" #include "unicode/fmtable.h" #include "unicode/numfmt.h" #include "unicode/unum.h" #include "unicode/ustring.h" +#include "UniquePtr.h" #include "valueOf.h" -#include <stdlib.h> -#include <string.h> static DecimalFormat* toDecimalFormat(jlong addr) { return reinterpret_cast<DecimalFormat*>(static_cast<uintptr_t>(addr)); @@ -216,59 +219,69 @@ static jstring NativeDecimalFormat_toPatternImpl(JNIEnv* env, jclass, jlong addr return env->NewString(pattern.getBuffer(), pattern.length()); } -static jcharArray formatResult(JNIEnv* env, const UnicodeString& str, FieldPositionIterator* fpi, jobject fpIter) { +static jcharArray formatResult(JNIEnv* env, const UnicodeString& s, FieldPositionIterator* fpi, jobject javaFieldPositionIterator) { static jmethodID gFPI_setData = env->GetMethodID(JniConstants::fieldPositionIteratorClass, "setData", "([I)V"); if (fpi != NULL) { - int length = fpi->getData(NULL, 0); - jintArray data = NULL; - if (length > 0) { - data = env->NewIntArray(length); - if (data == NULL) { + std::vector<int32_t> data; + FieldPosition fp; + while (fpi->next(fp)) { + data.push_back(fp.getField()); + data.push_back(fp.getBeginIndex()); + data.push_back(fp.getEndIndex()); + } + + jintArray javaData = NULL; + if (!data.empty()) { + javaData = env->NewIntArray(data.size()); + if (javaData == NULL) { return NULL; } - ScopedIntArrayRW ints(env, data); + ScopedIntArrayRW ints(env, javaData); if (ints.get() == NULL) { return NULL; } - fpi->getData(ints.get(), length); + memcpy(ints.get(), &data[0], data.size() * sizeof(int32_t)); } - env->CallVoidMethod(fpIter, gFPI_setData, data); + env->CallVoidMethod(javaFieldPositionIterator, gFPI_setData, javaData); } - jcharArray result = env->NewCharArray(str.length()); + jcharArray result = env->NewCharArray(s.length()); if (result != NULL) { - env->SetCharArrayRegion(result, 0, str.length(), str.getBuffer()); + env->SetCharArrayRegion(result, 0, s.length(), s.getBuffer()); } return result; } template <typename T> -static jcharArray format(JNIEnv* env, jlong addr, jobject fpIter, T val) { +static jcharArray format(JNIEnv* env, jlong addr, jobject javaFieldPositionIterator, T value) { UErrorCode status = U_ZERO_ERROR; - UnicodeString str; + UnicodeString s; DecimalFormat* fmt = toDecimalFormat(addr); - FieldPositionIterator fpi; - FieldPositionIterator* pfpi = fpIter ? &fpi : NULL; - fmt->format(val, str, pfpi, status); - return formatResult(env, str, pfpi, fpIter); + FieldPositionIterator nativeFieldPositionIterator; + FieldPositionIterator* fpi = javaFieldPositionIterator ? &nativeFieldPositionIterator : NULL; + fmt->format(value, s, fpi, status); + if (maybeThrowIcuException(env, "DecimalFormat::format", status)) { + return NULL; + } + return formatResult(env, s, fpi, javaFieldPositionIterator); } -static jcharArray NativeDecimalFormat_formatLong(JNIEnv* env, jclass, jlong addr, jlong value, jobject fpIter) { - return format<int64_t>(env, addr, fpIter, value); +static jcharArray NativeDecimalFormat_formatLong(JNIEnv* env, jclass, jlong addr, jlong value, jobject javaFieldPositionIterator) { + return format<int64_t>(env, addr, javaFieldPositionIterator, value); } -static jcharArray NativeDecimalFormat_formatDouble(JNIEnv* env, jclass, jlong addr, jdouble value, jobject fpIter) { - return format<double>(env, addr, fpIter, value); +static jcharArray NativeDecimalFormat_formatDouble(JNIEnv* env, jclass, jlong addr, jdouble value, jobject javaFieldPositionIterator) { + return format<double>(env, addr, javaFieldPositionIterator, value); } -static jcharArray NativeDecimalFormat_formatDigitList(JNIEnv* env, jclass, jlong addr, jstring value, jobject fpIter) { +static jcharArray NativeDecimalFormat_formatDigitList(JNIEnv* env, jclass, jlong addr, jstring value, jobject javaFieldPositionIterator) { ScopedUtfChars chars(env, value); if (chars.c_str() == NULL) { return NULL; } StringPiece sp(chars.c_str()); - return format(env, addr, fpIter, sp); + return format(env, addr, javaFieldPositionIterator, sp); } static jobject newBigDecimal(JNIEnv* env, const char* value, jsize len) { |