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