src/macosx/native/sun/util/locale/provider/HostLocaleProviderAdapter_md.c

Print this page
rev 6809 : imported patch 7091601


  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 #include "sun_util_locale_provider_HostLocaleProviderAdapterImpl.h"
  27 #include <CoreFoundation/CoreFoundation.h>
  28 #include <stdio.h>
  29 
  30 #define BUFLEN 256
  31 
  32 static CFDateFormatterStyle convertDateFormatterStyle(jint javaStyle);
  33 static CFNumberFormatterStyle convertNumberFormatterStyle(jint javaStyle);
  34 static void copyArrayElements(JNIEnv *env, CFArrayRef cfarray, jobjectArray jarray, CFIndex sindex, int dindex, int count);
  35 static jstring getNumberSymbolString(JNIEnv *env, jstring jdefault, CFStringRef type);
  36 static jchar getNumberSymbolChar(jchar jdefault, CFStringRef type);
  37 
  38 // from java_props_macosx.c
  39 extern char * getMacOSXLocale(int cat);
  40 extern char * getPosixLocale(int cat);
  41 
  42 /*
  43  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
  44  * Method:    getDefaultLocale
  45  * Signature: (I)Ljava/lang/String;
  46  */
  47 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getDefaultLocale
  48   (JNIEnv *env, jclass cls, jint cat) {
  49     char * localeString = NULL;
  50     int posixCat;
  51     jstring ret = NULL;
  52 
  53     switch (cat) {
  54         case sun_util_locale_provider_HostLocaleProviderAdapterImpl_CAT_DISPLAY:
  55             posixCat = LC_MESSAGES;
  56             break;


 305         if (nf != NULL) {
 306             char buf[BUFLEN];
 307             CFStringRef formatStr = CFNumberFormatterGetFormat(nf);
 308             CFStringGetCString(formatStr, buf, BUFLEN, kCFStringEncodingUTF8);
 309             ret = (*env)->NewStringUTF(env, buf);
 310             CFRelease(nf);
 311         }
 312         CFRelease(cflocale);
 313     }
 314 
 315     return ret;
 316 }
 317 
 318 /*
 319  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 320  * Method:    getCurrencySymbol
 321  * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 322  */
 323 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getCurrencySymbol
 324   (JNIEnv *env, jclass cls, jstring jlangtag, jstring currencySymbol) {
 325     return getNumberSymbolString(env, currencySymbol, kCFNumberFormatterCurrencySymbol);
 326 }
 327 
 328 /*
 329  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 330  * Method:    getDecimalSeparator
 331  * Signature: (Ljava/lang/String;C)C
 332  */
 333 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getDecimalSeparator
 334   (JNIEnv *env, jclass cls, jstring jlangtag, jchar decimalSeparator) {
 335     return getNumberSymbolChar(decimalSeparator, kCFNumberFormatterDecimalSeparator);
 336 }
 337 
 338 /*
 339  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 340  * Method:    getGroupingSeparator
 341  * Signature: (Ljava/lang/String;C)C
 342  */
 343 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getGroupingSeparator
 344   (JNIEnv *env, jclass cls, jstring jlangtag, jchar groupingSeparator) {
 345     return getNumberSymbolChar(groupingSeparator, kCFNumberFormatterGroupingSeparator);
 346 }
 347 
 348 /*
 349  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 350  * Method:    getInfinity
 351  * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 352  */
 353 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getInfinity
 354   (JNIEnv *env, jclass cls, jstring jlangtag, jstring infinity) {
 355     return getNumberSymbolString(env, infinity, kCFNumberFormatterInfinitySymbol);
 356 }
 357 
 358 /*
 359  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 360  * Method:    getInternationalCurrencySymbol
 361  * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 362  */
 363 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getInternationalCurrencySymbol
 364   (JNIEnv *env, jclass cls, jstring jlangtag, jstring internationalCurrencySymbol) {
 365     return getNumberSymbolString(env, internationalCurrencySymbol, kCFNumberFormatterInternationalCurrencySymbol);
 366 }
 367 
 368 /*
 369  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 370  * Method:    getMinusSign
 371  * Signature: (Ljava/lang/String;C)C
 372  */
 373 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getMinusSign
 374   (JNIEnv *env, jclass cls, jstring jlangtag, jchar minusSign) {
 375     return getNumberSymbolChar(minusSign, kCFNumberFormatterMinusSign);
 376 }
 377 
 378 /*
 379  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 380  * Method:    getMonetaryDecimalSeparator
 381  * Signature: (Ljava/lang/String;C)C
 382  */
 383 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getMonetaryDecimalSeparator
 384   (JNIEnv *env, jclass cls, jstring jlangtag, jchar monetaryDecimalSeparator) {
 385     return getNumberSymbolChar(monetaryDecimalSeparator, kCFNumberFormatterCurrencyDecimalSeparator);
 386 }
 387 
 388 /*
 389  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 390  * Method:    getNaN
 391  * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 392  */
 393 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getNaN
 394   (JNIEnv *env, jclass cls, jstring jlangtag, jstring nan) {
 395     return getNumberSymbolString(env, nan, kCFNumberFormatterNaNSymbol);
 396 }
 397 
 398 /*
 399  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 400  * Method:    getPercent
 401  * Signature: (Ljava/lang/String;C)C
 402  */
 403 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getPercent
 404   (JNIEnv *env, jclass cls, jstring jlangtag, jchar percent) {
 405     return getNumberSymbolChar(percent, kCFNumberFormatterPercentSymbol);
 406 }
 407 
 408 /*
 409  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 410  * Method:    getPerMill
 411  * Signature: (Ljava/lang/String;C)C
 412  */
 413 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getPerMill
 414   (JNIEnv *env, jclass cls, jstring jlangtag, jchar perMill) {
 415     return getNumberSymbolChar(perMill, kCFNumberFormatterPerMillSymbol);
 416 }
 417 
 418 /*
 419  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 420  * Method:    getZeroDigit
 421  * Signature: (Ljava/lang/String;C)C
 422  */
 423 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getZeroDigit
 424   (JNIEnv *env, jclass cls, jstring jlangtag, jchar zeroDigit) {
 425     return getNumberSymbolChar(zeroDigit, kCFNumberFormatterZeroSymbol);





























 426 }
 427 
 428 /*
 429  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 430  * Method:    getExponentSeparator
 431  * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 432  */
 433 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getExponentSeparator
 434   (JNIEnv *env, jclass cls, jstring jlangtag, jstring exponent) {
 435     return getNumberSymbolString(env, exponent, kCFNumberFormatterExponentSymbol);
 436 }
 437 
 438 /*
 439  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 440  * Method:    getCalendarInt
 441  * Signature: (Ljava/lang/String;I)I
 442  */
 443 JNIEXPORT jint JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getCalendarInt
 444   (JNIEnv *env, jclass cls, jstring jlangtag, jint type) {
 445     jint ret = 0;
 446     CFCalendarRef cfcal = CFCalendarCopyCurrent();
 447 
 448     if (cfcal != NULL) {
 449         switch (type) {
 450             case sun_util_locale_provider_HostLocaleProviderAdapterImpl_CD_FIRSTDAYOFWEEK:
 451                 ret = CFCalendarGetFirstWeekday(cfcal);
 452                 break;
 453             case sun_util_locale_provider_HostLocaleProviderAdapterImpl_CD_MINIMALDAYSINFIRSTWEEK:
 454                 ret = CFCalendarGetMinimumDaysInFirstWeek(cfcal);
 455                 break;


 608         case sun_util_locale_provider_HostLocaleProviderAdapterImpl_NF_INTEGER:
 609             return kCFNumberFormatterDecimalStyle;
 610         case sun_util_locale_provider_HostLocaleProviderAdapterImpl_NF_NUMBER:
 611             return kCFNumberFormatterDecimalStyle;
 612         case sun_util_locale_provider_HostLocaleProviderAdapterImpl_NF_PERCENT:
 613             return kCFNumberFormatterPercentStyle;
 614         default:
 615             return kCFNumberFormatterNoStyle;
 616     }
 617 }
 618 
 619 static void copyArrayElements(JNIEnv *env, CFArrayRef cfarray, jobjectArray jarray, CFIndex sindex, int dindex, int count) {
 620     char buf[BUFLEN];
 621 
 622     for (; count > 0; sindex++, dindex++, count--) {
 623         CFStringGetCString(CFArrayGetValueAtIndex(cfarray, sindex), buf, BUFLEN, kCFStringEncodingUTF8);
 624         (*env)->SetObjectArrayElement(env, jarray, dindex, (*env)->NewStringUTF(env, buf));
 625     }
 626 }
 627 
 628 static jstring getNumberSymbolString(JNIEnv *env, jstring jdefault, CFStringRef type) {
 629     char buf[BUFLEN];
 630     jstring ret = jdefault;
 631     CFLocaleRef cflocale = CFLocaleCopyCurrent();
 632 
 633     if (cflocale != NULL) {
 634         CFNumberFormatterRef nf = CFNumberFormatterCreate(kCFAllocatorDefault,
 635                                                   cflocale,
 636                                                   kCFNumberFormatterDecimalStyle);
 637         if (nf != NULL) {
 638             CFStringRef str = CFNumberFormatterCopyProperty(nf, type);
 639             if (str != NULL) {
 640                 CFStringGetCString(str, buf, BUFLEN, kCFStringEncodingUTF8);
 641                 CFRelease(str);
 642                 ret = (*env)->NewStringUTF(env, buf);
 643             }
 644 
 645             CFRelease(nf);
 646         }
 647 
 648         CFRelease(cflocale);
 649     }
 650 
 651     return ret;
 652 }
 653 
 654 static jchar getNumberSymbolChar(jchar jdefault, CFStringRef type) {
 655     char buf[BUFLEN];
 656     jchar ret = jdefault;
 657     CFLocaleRef cflocale = CFLocaleCopyCurrent();
 658 
 659     if (cflocale != NULL) {
 660         CFNumberFormatterRef nf = CFNumberFormatterCreate(kCFAllocatorDefault,
 661                                                   cflocale,
 662                                                   kCFNumberFormatterDecimalStyle);
 663         if (nf != NULL) {
 664             CFStringRef str = CFNumberFormatterCopyProperty(nf, type);
 665             if (str != NULL) {
 666                 CFStringGetCString(str, buf, BUFLEN, kCFStringEncodingUTF8);


 667                 CFRelease(str);
 668                 ret = buf[0];
 669             }
 670 
 671             CFRelease(nf);
 672         }
 673 
 674         CFRelease(cflocale);
 675     }
 676 
 677     return ret;
 678 }


  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 #include "sun_util_locale_provider_HostLocaleProviderAdapterImpl.h"
  27 #include <CoreFoundation/CoreFoundation.h>
  28 #include <stdio.h>
  29 
  30 #define BUFLEN 256
  31 
  32 static CFDateFormatterStyle convertDateFormatterStyle(jint javaStyle);
  33 static CFNumberFormatterStyle convertNumberFormatterStyle(jint javaStyle);
  34 static void copyArrayElements(JNIEnv *env, CFArrayRef cfarray, jobjectArray jarray, CFIndex sindex, int dindex, int count);
  35 static jstring getNumberSymbolString(JNIEnv *env, jstring jlangtag, jstring jdefault, CFStringRef type);
  36 static jchar getNumberSymbolChar(JNIEnv *env, jstring jlangtag, jchar jdefault, CFStringRef type);
  37 
  38 // from java_props_macosx.c
  39 extern char * getMacOSXLocale(int cat);
  40 extern char * getPosixLocale(int cat);
  41 
  42 /*
  43  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
  44  * Method:    getDefaultLocale
  45  * Signature: (I)Ljava/lang/String;
  46  */
  47 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getDefaultLocale
  48   (JNIEnv *env, jclass cls, jint cat) {
  49     char * localeString = NULL;
  50     int posixCat;
  51     jstring ret = NULL;
  52 
  53     switch (cat) {
  54         case sun_util_locale_provider_HostLocaleProviderAdapterImpl_CAT_DISPLAY:
  55             posixCat = LC_MESSAGES;
  56             break;


 305         if (nf != NULL) {
 306             char buf[BUFLEN];
 307             CFStringRef formatStr = CFNumberFormatterGetFormat(nf);
 308             CFStringGetCString(formatStr, buf, BUFLEN, kCFStringEncodingUTF8);
 309             ret = (*env)->NewStringUTF(env, buf);
 310             CFRelease(nf);
 311         }
 312         CFRelease(cflocale);
 313     }
 314 
 315     return ret;
 316 }
 317 
 318 /*
 319  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 320  * Method:    getCurrencySymbol
 321  * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 322  */
 323 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getCurrencySymbol
 324   (JNIEnv *env, jclass cls, jstring jlangtag, jstring currencySymbol) {
 325     return getNumberSymbolString(env, jlangtag, currencySymbol, kCFNumberFormatterCurrencySymbol);
 326 }
 327 
 328 /*
 329  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 330  * Method:    getDecimalSeparator
 331  * Signature: (Ljava/lang/String;C)C
 332  */
 333 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getDecimalSeparator
 334   (JNIEnv *env, jclass cls, jstring jlangtag, jchar decimalSeparator) {
 335     return getNumberSymbolChar(env, jlangtag, decimalSeparator, kCFNumberFormatterDecimalSeparator);
 336 }
 337 
 338 /*
 339  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 340  * Method:    getGroupingSeparator
 341  * Signature: (Ljava/lang/String;C)C
 342  */
 343 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getGroupingSeparator
 344   (JNIEnv *env, jclass cls, jstring jlangtag, jchar groupingSeparator) {
 345     return getNumberSymbolChar(env, jlangtag, groupingSeparator, kCFNumberFormatterGroupingSeparator);
 346 }
 347 
 348 /*
 349  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 350  * Method:    getInfinity
 351  * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 352  */
 353 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getInfinity
 354   (JNIEnv *env, jclass cls, jstring jlangtag, jstring infinity) {
 355     return getNumberSymbolString(env, jlangtag, infinity, kCFNumberFormatterInfinitySymbol);
 356 }
 357 
 358 /*
 359  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 360  * Method:    getInternationalCurrencySymbol
 361  * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 362  */
 363 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getInternationalCurrencySymbol
 364   (JNIEnv *env, jclass cls, jstring jlangtag, jstring internationalCurrencySymbol) {
 365     return getNumberSymbolString(env, jlangtag, internationalCurrencySymbol, kCFNumberFormatterInternationalCurrencySymbol);
 366 }
 367 
 368 /*
 369  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 370  * Method:    getMinusSign
 371  * Signature: (Ljava/lang/String;C)C
 372  */
 373 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getMinusSign
 374   (JNIEnv *env, jclass cls, jstring jlangtag, jchar minusSign) {
 375     return getNumberSymbolChar(env, jlangtag, minusSign, kCFNumberFormatterMinusSign);
 376 }
 377 
 378 /*
 379  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 380  * Method:    getMonetaryDecimalSeparator
 381  * Signature: (Ljava/lang/String;C)C
 382  */
 383 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getMonetaryDecimalSeparator
 384   (JNIEnv *env, jclass cls, jstring jlangtag, jchar monetaryDecimalSeparator) {
 385     return getNumberSymbolChar(env, jlangtag, monetaryDecimalSeparator, kCFNumberFormatterCurrencyDecimalSeparator);
 386 }
 387 
 388 /*
 389  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 390  * Method:    getNaN
 391  * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 392  */
 393 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getNaN
 394   (JNIEnv *env, jclass cls, jstring jlangtag, jstring nan) {
 395     return getNumberSymbolString(env, jlangtag, nan, kCFNumberFormatterNaNSymbol);
 396 }
 397 
 398 /*
 399  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 400  * Method:    getPercent
 401  * Signature: (Ljava/lang/String;C)C
 402  */
 403 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getPercent
 404   (JNIEnv *env, jclass cls, jstring jlangtag, jchar percent) {
 405     return getNumberSymbolChar(env, jlangtag, percent, kCFNumberFormatterPercentSymbol);
 406 }
 407 
 408 /*
 409  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 410  * Method:    getPerMill
 411  * Signature: (Ljava/lang/String;C)C
 412  */
 413 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getPerMill
 414   (JNIEnv *env, jclass cls, jstring jlangtag, jchar perMill) {
 415     return getNumberSymbolChar(env, jlangtag, perMill, kCFNumberFormatterPerMillSymbol);
 416 }
 417 
 418 /*
 419  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 420  * Method:    getZeroDigit
 421  * Signature: (Ljava/lang/String;C)C
 422  */
 423 JNIEXPORT jchar JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getZeroDigit
 424   (JNIEnv *env, jclass cls, jstring jlangtag, jchar zeroDigit) {
 425     // The following code *should* work, but not for some reason :o
 426     //
 427     //return getNumberSymbolChar(env, jlangtag, zeroDigit, kCFNumberFormatterZeroSymbol);
 428     //
 429     // so here is a workaround.
 430     jchar ret = zeroDigit;
 431     CFLocaleRef cflocale = CFLocaleCopyCurrent();
 432 
 433     if (cflocale != NULL) {
 434         CFNumberFormatterRef nf = CFNumberFormatterCreate(kCFAllocatorDefault,
 435                                                   cflocale,
 436                                                   kCFNumberFormatterNoStyle);
 437         if (nf != NULL) {
 438             int zero = 0;
 439             CFStringRef str = CFNumberFormatterCreateStringWithValue(kCFAllocatorDefault,
 440                               nf, kCFNumberIntType, &zero);
 441             if (str != NULL) {
 442                 if (CFStringGetLength(str) > 0) {
 443                     ret = CFStringGetCharacterAtIndex(str, 0);
 444                 }
 445                 CFRelease(str);
 446             }
 447 
 448             CFRelease(nf);
 449         }
 450 
 451         CFRelease(cflocale);
 452     }
 453 
 454     return ret;
 455 }
 456 
 457 /*
 458  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 459  * Method:    getExponentSeparator
 460  * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 461  */
 462 JNIEXPORT jstring JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getExponentSeparator
 463   (JNIEnv *env, jclass cls, jstring jlangtag, jstring exponent) {
 464     return getNumberSymbolString(env, jlangtag, exponent, kCFNumberFormatterExponentSymbol);
 465 }
 466 
 467 /*
 468  * Class:     sun_util_locale_provider_HostLocaleProviderAdapterImpl
 469  * Method:    getCalendarInt
 470  * Signature: (Ljava/lang/String;I)I
 471  */
 472 JNIEXPORT jint JNICALL Java_sun_util_locale_provider_HostLocaleProviderAdapterImpl_getCalendarInt
 473   (JNIEnv *env, jclass cls, jstring jlangtag, jint type) {
 474     jint ret = 0;
 475     CFCalendarRef cfcal = CFCalendarCopyCurrent();
 476 
 477     if (cfcal != NULL) {
 478         switch (type) {
 479             case sun_util_locale_provider_HostLocaleProviderAdapterImpl_CD_FIRSTDAYOFWEEK:
 480                 ret = CFCalendarGetFirstWeekday(cfcal);
 481                 break;
 482             case sun_util_locale_provider_HostLocaleProviderAdapterImpl_CD_MINIMALDAYSINFIRSTWEEK:
 483                 ret = CFCalendarGetMinimumDaysInFirstWeek(cfcal);
 484                 break;


 637         case sun_util_locale_provider_HostLocaleProviderAdapterImpl_NF_INTEGER:
 638             return kCFNumberFormatterDecimalStyle;
 639         case sun_util_locale_provider_HostLocaleProviderAdapterImpl_NF_NUMBER:
 640             return kCFNumberFormatterDecimalStyle;
 641         case sun_util_locale_provider_HostLocaleProviderAdapterImpl_NF_PERCENT:
 642             return kCFNumberFormatterPercentStyle;
 643         default:
 644             return kCFNumberFormatterNoStyle;
 645     }
 646 }
 647 
 648 static void copyArrayElements(JNIEnv *env, CFArrayRef cfarray, jobjectArray jarray, CFIndex sindex, int dindex, int count) {
 649     char buf[BUFLEN];
 650 
 651     for (; count > 0; sindex++, dindex++, count--) {
 652         CFStringGetCString(CFArrayGetValueAtIndex(cfarray, sindex), buf, BUFLEN, kCFStringEncodingUTF8);
 653         (*env)->SetObjectArrayElement(env, jarray, dindex, (*env)->NewStringUTF(env, buf));
 654     }
 655 }
 656 
 657 static jstring getNumberSymbolString(JNIEnv *env, jstring jlangtag, jstring jdefault, CFStringRef type) {
 658     char buf[BUFLEN];
 659     jstring ret = jdefault;
 660     CFLocaleRef cflocale = CFLocaleCopyCurrent();
 661 
 662     if (cflocale != NULL) {
 663         CFNumberFormatterRef nf = CFNumberFormatterCreate(kCFAllocatorDefault,
 664                                                   cflocale,
 665                                                   kCFNumberFormatterNoStyle);
 666         if (nf != NULL) {
 667             CFStringRef str = CFNumberFormatterCopyProperty(nf, type);
 668             if (str != NULL) {
 669                 CFStringGetCString(str, buf, BUFLEN, kCFStringEncodingUTF8);
 670                 CFRelease(str);
 671                 ret = (*env)->NewStringUTF(env, buf);
 672             }
 673 
 674             CFRelease(nf);
 675         }
 676 
 677         CFRelease(cflocale);
 678     }
 679 
 680     return ret;
 681 }
 682 
 683 static jchar getNumberSymbolChar(JNIEnv *env, jstring jlangtag, jchar jdefault, CFStringRef type) {

 684     jchar ret = jdefault;
 685     CFLocaleRef cflocale = CFLocaleCopyCurrent();
 686 
 687     if (cflocale != NULL) {
 688         CFNumberFormatterRef nf = CFNumberFormatterCreate(kCFAllocatorDefault,
 689                                                   cflocale,
 690                                                   kCFNumberFormatterNoStyle);
 691         if (nf != NULL) {
 692             CFStringRef str = CFNumberFormatterCopyProperty(nf, type);
 693             if (str != NULL) {
 694                 if (CFStringGetLength(str) > 0) {
 695                     ret = CFStringGetCharacterAtIndex(str, 0);
 696                 }
 697                 CFRelease(str);

 698             }
 699 
 700             CFRelease(nf);
 701         }
 702 
 703         CFRelease(cflocale);
 704     }
 705 
 706     return ret;
 707 }