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 }
|