libcore_icu_NativePluralRules.cpp revision 5ec69b20ab9b3e2dcbe225d548168b09afbbbac2
17775409378596fd980dbd576f9738d337bd8a76dElliott Hughes/*
27775409378596fd980dbd576f9738d337bd8a76dElliott Hughes * Copyright (C) 2010 The Android Open Source Project
37775409378596fd980dbd576f9738d337bd8a76dElliott Hughes *
47775409378596fd980dbd576f9738d337bd8a76dElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
57775409378596fd980dbd576f9738d337bd8a76dElliott Hughes * you may not use this file except in compliance with the License.
67775409378596fd980dbd576f9738d337bd8a76dElliott Hughes * You may obtain a copy of the License at
77775409378596fd980dbd576f9738d337bd8a76dElliott Hughes *
87775409378596fd980dbd576f9738d337bd8a76dElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
97775409378596fd980dbd576f9738d337bd8a76dElliott Hughes *
107775409378596fd980dbd576f9738d337bd8a76dElliott Hughes * Unless required by applicable law or agreed to in writing, software
117775409378596fd980dbd576f9738d337bd8a76dElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
127775409378596fd980dbd576f9738d337bd8a76dElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137775409378596fd980dbd576f9738d337bd8a76dElliott Hughes * See the License for the specific language governing permissions and
147775409378596fd980dbd576f9738d337bd8a76dElliott Hughes * limitations under the License.
157775409378596fd980dbd576f9738d337bd8a76dElliott Hughes */
167775409378596fd980dbd576f9738d337bd8a76dElliott Hughes
177775409378596fd980dbd576f9738d337bd8a76dElliott Hughes#define LOG_TAG "NativePluralRules"
187775409378596fd980dbd576f9738d337bd8a76dElliott Hughes
197775409378596fd980dbd576f9738d337bd8a76dElliott Hughes#include "JNIHelp.h"
20e22935d3c7040c22b48d53bd18878844f381287cElliott Hughes#include "JniConstants.h"
21bef9ec33e1368f57c731fce63b6a8c61628c64b0Elliott Hughes#include "JniException.h"
227775409378596fd980dbd576f9738d337bd8a76dElliott Hughes#include "ScopedUtfChars.h"
237775409378596fd980dbd576f9738d337bd8a76dElliott Hughes#include "unicode/plurrule.h"
247775409378596fd980dbd576f9738d337bd8a76dElliott Hughes
257775409378596fd980dbd576f9738d337bd8a76dElliott Hughesstatic PluralRules* toPluralRules(jint address) {
267775409378596fd980dbd576f9738d337bd8a76dElliott Hughes    return reinterpret_cast<PluralRules*>(static_cast<uintptr_t>(address));
277775409378596fd980dbd576f9738d337bd8a76dElliott Hughes}
287775409378596fd980dbd576f9738d337bd8a76dElliott Hughes
297775409378596fd980dbd576f9738d337bd8a76dElliott Hughesstatic void NativePluralRules_finalizeImpl(JNIEnv*, jclass, jint address) {
307775409378596fd980dbd576f9738d337bd8a76dElliott Hughes    delete toPluralRules(address);
317775409378596fd980dbd576f9738d337bd8a76dElliott Hughes}
327775409378596fd980dbd576f9738d337bd8a76dElliott Hughes
337775409378596fd980dbd576f9738d337bd8a76dElliott Hughesstatic jint NativePluralRules_forLocaleImpl(JNIEnv* env, jclass, jstring localeName) {
347775409378596fd980dbd576f9738d337bd8a76dElliott Hughes    Locale locale = Locale::createFromName(ScopedUtfChars(env, localeName).c_str());
357775409378596fd980dbd576f9738d337bd8a76dElliott Hughes    UErrorCode status = U_ZERO_ERROR;
367775409378596fd980dbd576f9738d337bd8a76dElliott Hughes    PluralRules* result = PluralRules::forLocale(locale, status);
375ec69b20ab9b3e2dcbe225d548168b09afbbbac2Elliott Hughes    maybeThrowIcuException(env, "PluralRules::forLocale", status);
387775409378596fd980dbd576f9738d337bd8a76dElliott Hughes    return reinterpret_cast<uintptr_t>(result);
397775409378596fd980dbd576f9738d337bd8a76dElliott Hughes}
407775409378596fd980dbd576f9738d337bd8a76dElliott Hughes
417775409378596fd980dbd576f9738d337bd8a76dElliott Hughesstatic jint NativePluralRules_quantityForIntImpl(JNIEnv*, jclass, jint address, jint value) {
427775409378596fd980dbd576f9738d337bd8a76dElliott Hughes    UnicodeString keyword = toPluralRules(address)->select(value);
437775409378596fd980dbd576f9738d337bd8a76dElliott Hughes    if (keyword == "zero") {
447775409378596fd980dbd576f9738d337bd8a76dElliott Hughes        return 0;
457775409378596fd980dbd576f9738d337bd8a76dElliott Hughes    } else if (keyword == "one") {
467775409378596fd980dbd576f9738d337bd8a76dElliott Hughes        return 1;
477775409378596fd980dbd576f9738d337bd8a76dElliott Hughes    } else if (keyword == "two") {
487775409378596fd980dbd576f9738d337bd8a76dElliott Hughes        return 2;
497775409378596fd980dbd576f9738d337bd8a76dElliott Hughes    } else if (keyword == "few") {
507775409378596fd980dbd576f9738d337bd8a76dElliott Hughes        return 3;
517775409378596fd980dbd576f9738d337bd8a76dElliott Hughes    } else if (keyword == "many") {
527775409378596fd980dbd576f9738d337bd8a76dElliott Hughes        return 4;
537775409378596fd980dbd576f9738d337bd8a76dElliott Hughes    } else {
547775409378596fd980dbd576f9738d337bd8a76dElliott Hughes        return 5;
557775409378596fd980dbd576f9738d337bd8a76dElliott Hughes    }
567775409378596fd980dbd576f9738d337bd8a76dElliott Hughes}
577775409378596fd980dbd576f9738d337bd8a76dElliott Hughes
587775409378596fd980dbd576f9738d337bd8a76dElliott Hughesstatic JNINativeMethod gMethods[] = {
59e22935d3c7040c22b48d53bd18878844f381287cElliott Hughes    NATIVE_METHOD(NativePluralRules, finalizeImpl, "(I)V"),
60e22935d3c7040c22b48d53bd18878844f381287cElliott Hughes    NATIVE_METHOD(NativePluralRules, forLocaleImpl, "(Ljava/lang/String;)I"),
61e22935d3c7040c22b48d53bd18878844f381287cElliott Hughes    NATIVE_METHOD(NativePluralRules, quantityForIntImpl, "(II)I"),
627775409378596fd980dbd576f9738d337bd8a76dElliott Hughes};
637cd6760f7045d771faae8080a8c6150bf678f679Elliott Hughesvoid register_libcore_icu_NativePluralRules(JNIEnv* env) {
647cd6760f7045d771faae8080a8c6150bf678f679Elliott Hughes    jniRegisterNativeMethods(env, "libcore/icu/NativePluralRules", gMethods, NELEM(gMethods));
657775409378596fd980dbd576f9738d337bd8a76dElliott Hughes}
66