Lines 63-73
Link Here
|
63 |
#include <osl/diagnose.h> |
63 |
#include <osl/diagnose.h> |
64 |
#include <osl/process.h> |
64 |
#include <osl/process.h> |
65 |
|
65 |
|
66 |
#if defined(LINUX) || defined(SOLARIS) || defined(IRIX) || defined(NETBSD) || defined(FREEBSD) |
66 |
#if defined(LINUX) || defined(SOLARIS) || defined(IRIX) || defined(NETBSD) || defined(FREEBSD) || defined(MACOSX) |
67 |
#include <pthread.h> |
67 |
#include <pthread.h> |
68 |
#include <locale.h> |
68 |
#ifndef MACOSX |
69 |
#include <langinfo.h> |
69 |
#include <locale.h> |
70 |
#endif |
70 |
#include <langinfo.h> |
|
|
71 |
#else |
72 |
#include <osl/module.h> |
73 |
#include <osl/thread.h> |
74 |
#include <unxmacxp_protos.h> |
75 |
#endif /* !MACOSX */ |
76 |
#endif /* LINUX || SOLARIS || IRIX || NETBSD || MACOSX */ |
71 |
|
77 |
|
72 |
/*****************************************************************************/ |
78 |
/*****************************************************************************/ |
73 |
/* typedefs |
79 |
/* typedefs |
Lines 240-246
Link Here
|
240 |
return NULL; |
246 |
return NULL; |
241 |
} |
247 |
} |
242 |
|
248 |
|
243 |
#if defined(LINUX) || defined(SOLARIS) || defined(IRIX) || defined(NETBSD) || defined(FREEBSD) |
249 |
#if defined(LINUX) || defined(SOLARIS) || defined(IRIX) || defined(NETBSD) || defined(FREEBSD) || defined(MACOSX) |
244 |
|
250 |
|
245 |
/* |
251 |
/* |
246 |
* This implementation of osl_getTextEncodingFromLocale maps |
252 |
* This implementation of osl_getTextEncodingFromLocale maps |
Lines 323-329
Link Here
|
323 |
{ "sjis", RTL_TEXTENCODING_SHIFT_JIS } /* Japan */ |
329 |
{ "sjis", RTL_TEXTENCODING_SHIFT_JIS } /* Japan */ |
324 |
}; |
330 |
}; |
325 |
|
331 |
|
326 |
#elif defined(LINUX) || defined(NETBSD) |
332 |
#elif defined(LINUX) || defined(NETBSD) || defined(MACOSX) |
327 |
|
333 |
|
328 |
const _pair _nl_language_list[] = { |
334 |
const _pair _nl_language_list[] = { |
329 |
{ "ANSI_X3.110-1983", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-99 NAPLPS */ |
335 |
{ "ANSI_X3.110-1983", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-99 NAPLPS */ |
Lines 557-566
Link Here
|
557 |
{ "UTF-8", RTL_TEXTENCODING_UTF8 } /* ISO-10646/UTF-8 */ |
563 |
{ "UTF-8", RTL_TEXTENCODING_UTF8 } /* ISO-10646/UTF-8 */ |
558 |
}; |
564 |
}; |
559 |
|
565 |
|
560 |
#endif /* ifdef SOLARIS IRIX LINUX FREEBSD NETBSD */ |
566 |
#endif /* ifdef SOLARIS IRIX LINUX FREEBSD NETBSD MACOSX */ |
|
|
567 |
|
568 |
#ifdef MACOSX |
569 |
/* MacOS X has some special names for some of its encodings. These encoding names are |
570 |
* returned by CFStringConvertEncodingToIANACharSetName() when given a CFTextEncoding |
571 |
* argument from one of the ones in CFStringEncodingExt.h in the CoreFoundation framework. |
572 |
*/ |
573 |
const _pair _macxp_language_list[] = { |
574 |
{ "MACINTOSH", RTL_TEXTENCODING_ISO_8859_1 }, /* kCFStringEncodingMacRoman */ |
575 |
{ "X-MAC-JAPANESE", RTL_TEXTENCODING_EUC_JP }, /* kCFStringEncodingMacJapanese */ |
576 |
{ "X-MAC-TRAD-CHINESE", RTL_TEXTENCODING_APPLE_CHINTRAD }, /* kCFStringEncodingMacChineseTrad */ |
577 |
{ "X-MAC-KOREAN", RTL_TEXTENCODING_EUC_KR }, /* kCFStringEncodingMacKorean */ |
578 |
{ "X-MAC-ARABIC", RTL_TEXTENCODING_APPLE_ARABIC }, /* kCFStringEncodingMacArabic */ |
579 |
{ "X-MAC-HEBREW", RTL_TEXTENCODING_APPLE_HEBREW }, /* kCFStringEncodingMacHebrew */ |
580 |
{ "X-MAC-GREEK", RTL_TEXTENCODING_APPLE_GREEK }, /* kCFStringEncodingMacGreek */ |
581 |
{ "X-MAC-CYRILLIC", RTL_TEXTENCODING_APPLE_CYRILLIC }, /* kCFStringEncodingMacCyrillic */ |
582 |
{ "X-MAC-DEVANAGARI", RTL_TEXTENCODING_APPLE_DEVANAGARI }, /* kCFStringEncodingMacDevanagari */ |
583 |
{ "X-MAC-GURMUKHI", RTL_TEXTENCODING_APPLE_GURMUKHI }, /* kCFStringEncodingMacGurmukhi */ |
584 |
{ "X-MAC-GUJARATI", RTL_TEXTENCODING_APPLE_GUJARATI }, /* kCFStringEncodingMacGujarati */ |
585 |
{ "X-MAC-ORIYA", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacOriya */ |
586 |
{ "X-MAC-BENGALI", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacBengali */ |
587 |
{ "X-MAC-TAMIL", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacTamil */ |
588 |
{ "X-MAC-TELUGU", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacTelugu */ |
589 |
{ "X-MAC-KANNADA", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacKannada */ |
590 |
{ "X-MAC-MALAYALAM", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacMalayalam */ |
591 |
{ "X-MAC-SINHALESE", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacSinhalese */ |
592 |
{ "X-MAC-BURMESE", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacBurmese */ |
593 |
{ "X-MAC-KHMER", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacKhmer */ |
594 |
{ "X-MAC-THAI", RTL_TEXTENCODING_APPLE_THAI }, /* kCFStringEncodingMacThai */ |
595 |
{ "X-MAC-LAOTIAN", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacLaotian */ |
596 |
{ "X-MAC-GEORGIAN", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacGeorgian */ |
597 |
{ "X-MAC-ARMENIAN", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacArmenian */ |
598 |
{ "X-MAC-SIMP-CHINESE", RTL_TEXTENCODING_APPLE_CHINSIMP }, /* kCFStringEncodingMacChineseSimp */ |
599 |
{ "X-MAC-TIBETAN", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacTibetan */ |
600 |
{ "X-MAC-MONGOLIAN", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacMongolian */ |
601 |
{ "X-MAC-ETHIOPIC", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacEthiopic */ |
602 |
{ "X-MAC-CENTRALEURROMAN", RTL_TEXTENCODING_APPLE_CENTEURO }, /* kCFStringEncodingMacCentralEurRoman */ |
603 |
{ "X-MAC-VIETNAMESE", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacVietnamese */ |
604 |
{ "X-MAC-EXTARABIC", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacExtArabic */ |
605 |
{ "X-MAC-SYMBOL", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacSymbol */ |
606 |
{ "X-MAC-DINGBATS", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacDingbats */ |
607 |
{ "X-MAC-TURKISH", RTL_TEXTENCODING_APPLE_TURKISH }, /* kCFStringEncodingMacTurkish */ |
608 |
{ "X-MAC-CROATIAN", RTL_TEXTENCODING_APPLE_CROATIAN }, /* kCFStringEncodingMacCroatian */ |
609 |
{ "X-MAC-ICELANDIC", RTL_TEXTENCODING_APPLE_ICELAND }, /* kCFStringEncodingMacIcelandic */ |
610 |
{ "X-MAC-ROMANIAN", RTL_TEXTENCODING_APPLE_ROMANIAN }, /* kCFStringEncodingMacRomanian */ |
611 |
{ "UNICODE-2-0", RTL_TEXTENCODING_DONTKNOW }, /* */ |
612 |
{ "X-MAC-FARSI", RTL_TEXTENCODING_APPLE_FARSI }, /* kCFStringEncodingMacFarsi */ |
613 |
{ "X-MAC-UKRAINIAN", RTL_TEXTENCODING_APPLE_UKRAINIAN }, /* kCFStringEncodingMacUkrainian */ |
614 |
{ "X-MAC-VT100", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacVT100 */ |
615 |
{ "macintosh", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacHFS */ |
616 |
{ "UTF-16BE", RTL_TEXTENCODING_UNICODE }, /* kCFStringEncodingUnicode */ |
617 |
{ "UNICODE-1-1", RTL_TEXTENCODING_DONTKNOW }, /* */ |
618 |
{ "UNICODE-1-1", RTL_TEXTENCODING_DONTKNOW }, /* */ |
619 |
{ "UNICODE-2-0", RTL_TEXTENCODING_DONTKNOW }, /* */ |
620 |
{ "csUnicode", RTL_TEXTENCODING_DONTKNOW }, /* */ |
621 |
{ "CP437", RTL_TEXTENCODING_IBM_437 }, /* kCFStringEncodingDOSLatinUS */ |
622 |
{ "CP737", RTL_TEXTENCODING_IBM_737 }, /* kCFStringEncodingDOSGreek */ |
623 |
{ "CP775", RTL_TEXTENCODING_IBM_775 }, /* kCFStringEncodingDOSBalticRim */ |
624 |
{ "CP850", RTL_TEXTENCODING_IBM_850 }, /* kCFStringEncodingDOSLatin1 */ |
625 |
{ "CP852", RTL_TEXTENCODING_IBM_852 }, /* kCFStringEncodingDOSGreek1 */ |
626 |
{ "CP857", RTL_TEXTENCODING_IBM_857 }, /* kCFStringEncodingDOSTurkish */ |
627 |
{ "CP861", RTL_TEXTENCODING_IBM_861 }, /* kCFStringEncodingDOSIcelandic */ |
628 |
{ "cp864", RTL_TEXTENCODING_IBM_864 }, /* kCFStringEncodingDOSArabic */ |
629 |
{ "CP866", RTL_TEXTENCODING_IBM_866 }, /* kCFStringEncodingDOSRussian */ |
630 |
{ "CP874", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingDOSThai */ |
631 |
{ "CP932", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingDOSJapanese */ |
632 |
{ "CP936", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingDOSChineseSimplif */ |
633 |
{ "CP949", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingDOSKorean */ |
634 |
{ "CP950", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingDOSChineseTrad */ |
635 |
{ "WINDOWS-1252", RTL_TEXTENCODING_MS_1252 }, /* kCFStringEncodingWindowsLatin1 */ |
636 |
{ "WINDOWS-1250", RTL_TEXTENCODING_MS_1250 }, /* kCFStringEncodingWindowsLatin2 */ |
637 |
{ "WINDOWS-1251", RTL_TEXTENCODING_MS_1251 }, /* kCFStringEncodingWindowsCyrillic */ |
638 |
{ "WINDOWS-1253", RTL_TEXTENCODING_MS_1253 }, /* kCFStringEncodingWindowsGreek */ |
639 |
{ "WINDOWS-1254", RTL_TEXTENCODING_MS_1254 }, /* kCFStringEncodingWindowsLatin5 */ |
640 |
{ "WINDOWS-1255", RTL_TEXTENCODING_MS_1255 }, /* kCFStringEncodingWindowsHebrew */ |
641 |
{ "WINDOWS-1256", RTL_TEXTENCODING_MS_1256 }, /* kCFStringEncodingWindowsArabic */ |
642 |
{ "WINDOWS-1257", RTL_TEXTENCODING_MS_1257 }, /* kCFStringEncodingWindowsBalticRim */ |
643 |
{ "WINDOWS-1258", RTL_TEXTENCODING_MS_1258 }, /* kCFStringEncodingWindowsVietnamese */ |
644 |
{ "US-ASCII", RTL_TEXTENCODING_ASCII_US }, /* kCFStringEncodingASCII */ |
645 |
{ "JIS_C6226-1983", RTL_TEXTENCODING_GB_2312 }, /* kCFStringEncodingJIS_X0208_90 */ |
646 |
{ "csISO58GB231280", RTL_TEXTENCODING_GB_2312 }, /* kCFStringEncodingGB_2312_80 */ |
647 |
{ "X-GBK", RTL_TEXTENCODING_GBK }, /* kCFStringEncodingGBK_95 */ |
648 |
{ "csKSC56011987", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingKSC_5601_87 */ |
649 |
{ "ISO-2022-JP", RTL_TEXTENCODING_ISO_2022_JP }, /* kCFStringEncodingISO_2022_JP */ |
650 |
{ "ISO-2022-CN", RTL_TEXTENCODING_ISO_2022_CN }, /* kCFStringEncodingISO_2022_CN */ |
651 |
{ "ISO-2022-CN-EXT", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingISO_2022_CN_EXT */ |
652 |
{ "ISO-2022-KR", RTL_TEXTENCODING_ISO_2022_KR }, /* kCFStringEncodingISO_2022_KR */ |
653 |
{ "EUC-JP", RTL_TEXTENCODING_EUC_JP }, /* kCFStringEncodingEUC_JP */ |
654 |
{ "EUC-CN", RTL_TEXTENCODING_EUC_CN }, /* kCFStringEncodingEUC_CN */ |
655 |
{ "EUC-TW", RTL_TEXTENCODING_EUC_TW }, /* kCFStringEncodingEUC_TW */ |
656 |
{ "EUC-KR", RTL_TEXTENCODING_EUC_KR }, /* kCFStringEncodingEUC_KR */ |
657 |
{ "SHIFT_JIS", RTL_TEXTENCODING_SHIFT_JIS }, /* kCFStringEncodingShiftJIS */ |
658 |
{ "KOI8-R", RTL_TEXTENCODING_KOI8_R }, /* kCFStringEncodingKOI8_R */ |
659 |
{ "X-MAC-ROMAN-LATIN1", RTL_TEXTENCODING_APPLE_ROMAN }, /* kCFStringEncodingMacRomanLatin1 */ |
660 |
{ "HZ-GB-2312", RTL_TEXTENCODING_GB_2312 }, /* kCFStringEncodingHZ_GB_2312 */ |
661 |
{ "Big5-HKSCS", RTL_TEXTENCODING_BIG5_HKSCS }, /* kCFStringEncodingBig5_HKSCS_1999 */ |
662 |
{ "X-NEXTSTEP", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingNextStepLatin */ |
663 |
{ "cp037", RTL_TEXTENCODING_DONTKNOW } /* kCFStringEncodingEBCDIC_CP037 */ |
664 |
/* ___________ Add more encodings here ___________ */ |
665 |
}; |
666 |
#endif /* ifdef MACOSX */ |
561 |
|
667 |
|
562 |
static pthread_mutex_t aLocalMutex = PTHREAD_MUTEX_INITIALIZER; |
668 |
static pthread_mutex_t aLocalMutex = PTHREAD_MUTEX_INITIALIZER; |
563 |
|
669 |
|
|
|
670 |
#ifndef MACOSX |
671 |
|
564 |
/*****************************************************************************/ |
672 |
/*****************************************************************************/ |
565 |
/* return the text encoding corresponding to the given locale |
673 |
/* return the text encoding corresponding to the given locale |
566 |
/*****************************************************************************/ |
674 |
/*****************************************************************************/ |
Lines 679-697
Link Here
|
679 |
return ret; |
787 |
return ret; |
680 |
} |
788 |
} |
681 |
|
789 |
|
682 |
#elif defined(MACOSX) /* ifdef LINUX || SOLARIS || NETBSD */ |
790 |
#else /* ifndef MACOSX */ |
683 |
|
791 |
|
684 |
/* |
792 |
/* |
685 |
* FIXME: the MacOS X implemetation is missing |
793 |
* MacOS X specific Locale manipulation code |
686 |
*/ |
794 |
*/ |
687 |
|
795 |
|
|
|
796 |
#include <premac.h> |
797 |
#include <CoreFoundation/CoreFoundation.h> |
798 |
#include <postmac.h> |
799 |
|
800 |
/* OS X locale discovery function from dylib */ |
801 |
int (*pGetOSXLocale)( char *, sal_uInt32 ); |
802 |
int (*pConvertTextEncodingToIANACharsetName)( char *, unsigned int, CFStringEncoding ); |
803 |
|
804 |
void macxp_ConvertCFEncodingToIANACharSetName( char *buffer, unsigned int bufferLen, CFStringEncoding cfEncoding ); |
805 |
|
688 |
/*****************************************************************************/ |
806 |
/*****************************************************************************/ |
689 |
/* return the text encoding corresponding to the given locale |
807 |
/* return the text encoding corresponding to the given locale |
690 |
/*****************************************************************************/ |
808 |
/*****************************************************************************/ |
691 |
|
809 |
|
692 |
rtl_TextEncoding osl_getTextEncodingFromLocale( rtl_Locale * pLocale ) |
810 |
rtl_TextEncoding osl_getTextEncodingFromLocale( rtl_Locale * pLocale ) |
693 |
{ |
811 |
{ |
694 |
return RTL_TEXTENCODING_DONTKNOW; |
812 |
const _pair *pLanguage = NULL; |
|
|
813 |
char sEncoding[ 64 ] = ""; |
814 |
CFStringEncoding sCFSysEncoding; |
815 |
const unsigned int macxpListMembers = sizeof(_macxp_language_list) / sizeof(_pair); |
816 |
const unsigned int otherListMembers = sizeof(_nl_language_list) / sizeof(_pair); |
817 |
unsigned int isDarwin; |
818 |
unsigned int majorVersion; |
819 |
unsigned int minorVersion; |
820 |
unsigned int minorMinorVersion; |
821 |
|
822 |
/* For retrieving the CoreFoundation text encoding, the process goes like |
823 |
* this: |
824 |
* 1) On MacOS X this will be the first language listed in the |
825 |
* Language tab of the International preference pane. |
826 |
* 2) On Darwin 5 the value is currently hardwired to |
827 |
* kCFStringEncodingMacRoman. |
828 |
*/ |
829 |
sCFSysEncoding = CFStringGetSystemEncoding(); |
830 |
|
831 |
/* If running on OS X, attempt to convert text encoding to a charset name using CoreFoundation calls. */ |
832 |
/* Must use osl_psz_xxxx variants of functions here because otherwise osl_loadModule() tries to get the |
833 |
* un-Unicode the string we pass to it, which results in this function being called again and again and |
834 |
* again, finally overflowing the stack. |
835 |
*/ |
836 |
macxp_getSystemVersion( &isDarwin, &majorVersion, &minorVersion, &minorMinorVersion ); |
837 |
if( !isDarwin ) |
838 |
{ |
839 |
/* Load the text encoding conversion library if we are running on OS X */ |
840 |
const sal_Char *aTextEncConvertLibName = "libsalextra_x11osx_mxp.dylib"; |
841 |
const sal_Char *aOSXTextEncConvertFunctionName = "macxp_OSXConvertCFEncodingToIANACharSetName"; |
842 |
oslModule pTextEncCovertLib; |
843 |
void *pFunc; |
844 |
int err; |
845 |
|
846 |
pTextEncCovertLib = osl_psz_loadModule( aTextEncConvertLibName, SAL_LOADMODULE_DEFAULT ); |
847 |
if( !pTextEncCovertLib ) |
848 |
{ |
849 |
fprintf( stderr, "Could not load the OS X text encoding coversion library! (%s)\n", aTextEncConvertLibName ); |
850 |
} |
851 |
else |
852 |
{ |
853 |
/* Grab a pointer to the text encoding conversion function and call it */ |
854 |
pFunc = osl_psz_getSymbol( pTextEncCovertLib, aOSXTextEncConvertFunctionName ); |
855 |
if( pFunc ) |
856 |
{ |
857 |
pConvertTextEncodingToIANACharsetName = ( int(*)(char *, unsigned int, CFStringEncoding) )( pFunc ); |
858 |
err = (*pConvertTextEncodingToIANACharsetName)( sEncoding, 64, sCFSysEncoding ); |
859 |
} |
860 |
else |
861 |
fprintf( stderr, "Could not grab pointer to the OS X text encoding coversion routine! (%s)\n", aOSXTextEncConvertFunctionName ); |
862 |
} |
863 |
osl_unloadModule( pTextEncCovertLib ); |
864 |
} |
865 |
|
866 |
if ( strlen(sEncoding) <= 0 ) |
867 |
{ |
868 |
/* |
869 |
* Darwin doesn't have a CFStringConvertEncodingToIANACharSetName(), |
870 |
* so we call our own replacement. Also fall back to our replacement |
871 |
* if for some reason we can't load our OS X convert library. |
872 |
*/ |
873 |
macxp_ConvertCFEncodingToIANACharSetName( sEncoding, 64, sCFSysEncoding ); |
874 |
} |
875 |
|
876 |
/* Try the Mac-specific list first, then non-Mac list (picks up MACINTOSH from non-Mac list) */ |
877 |
pLanguage = _pair_search( sEncoding, _macxp_language_list, macxpListMembers ); |
878 |
if ( pLanguage == NULL ) |
879 |
pLanguage = _pair_search( sEncoding, _nl_language_list, otherListMembers ); |
880 |
|
881 |
OSL_ASSERT( pLanguage && ( RTL_TEXTENCODING_DONTKNOW != pLanguage->value ) ); |
882 |
|
883 |
/* |
884 |
* a matching item in our list provides a mapping from codeset to |
885 |
* rtl-codeset |
886 |
*/ |
887 |
if ( pLanguage != NULL ) |
888 |
return pLanguage->value; |
889 |
|
890 |
return RTL_TEXTENCODING_DONTKNOW; |
695 |
} |
891 |
} |
696 |
|
892 |
|
697 |
/*****************************************************************************/ |
893 |
/*****************************************************************************/ |
Lines 700-706
Link Here
|
700 |
|
896 |
|
701 |
void _imp_getProcessLocale( rtl_Locale ** ppLocale ) |
897 |
void _imp_getProcessLocale( rtl_Locale ** ppLocale ) |
702 |
{ |
898 |
{ |
703 |
*ppLocale = _parse_locale( "C" ); |
899 |
static const char *locale = NULL; |
|
|
900 |
|
901 |
/* basic thread safeness */ |
902 |
pthread_mutex_lock( &aLocalMutex ); |
903 |
|
904 |
/* Only fetch the locale once and cache it */ |
905 |
if ( NULL == locale ) |
906 |
{ |
907 |
unsigned int isDarwin; |
908 |
unsigned int majorVersion; |
909 |
unsigned int minorVersion; |
910 |
unsigned int minorMinorVersion; |
911 |
|
912 |
/* If running on OS X, attempt to fetch the locale using CoreServices calls. */ |
913 |
macxp_getSystemVersion( &isDarwin, &majorVersion, &minorVersion, &minorMinorVersion ); |
914 |
if( !isDarwin ) |
915 |
{ |
916 |
/* Load the locale discovery library if we are running on OS X */ |
917 |
const sal_Char *aLocaleLibName = "libsalextra_x11osx_mxp.dylib"; |
918 |
const sal_Char *aGetOSXLocaleFunctionName = "macxp_getOSXLocale"; |
919 |
oslModule pLocaleLib; |
920 |
void *pFunc; |
921 |
int err; |
922 |
|
923 |
pLocaleLib = osl_psz_loadModule( aLocaleLibName, SAL_LOADMODULE_DEFAULT ); |
924 |
if( pLocaleLib ) |
925 |
{ |
926 |
/* Grab a pointer to the locale function and call it */ |
927 |
pFunc = osl_psz_getSymbol( pLocaleLib, aGetOSXLocaleFunctionName ); |
928 |
if( pFunc ) |
929 |
{ |
930 |
pGetOSXLocale = ( int(*)(char *, sal_uInt32) )( pFunc ); |
931 |
locale = (char *)malloc( 20 ); |
932 |
if ( locale ) |
933 |
err = (*pGetOSXLocale)( locale, 20 ); |
934 |
else |
935 |
fprintf( stderr, "nlsupport.c: locale allocation returned NULL!\n" ); |
936 |
} |
937 |
else |
938 |
fprintf( stderr, "Could not load the OS X locale discovery function! (%s)\n", aGetOSXLocaleFunctionName ); |
939 |
} |
940 |
else |
941 |
fprintf( stderr, "Could not load the OS X locale discovery library! (%s)\n", aLocaleLibName ); |
942 |
|
943 |
/* Let go of the module, we don't need it anymore */ |
944 |
osl_unloadModule( pLocaleLib ); |
945 |
} |
946 |
} |
947 |
|
948 |
/* handle the case where OS specific method of finding locale fails */ |
949 |
if ( NULL == locale ) |
950 |
{ |
951 |
/* simulate behavior of setlocale */ |
952 |
locale = getenv( "LC_ALL" ); |
953 |
|
954 |
if( NULL == locale ) |
955 |
locale = getenv( "LC_CTYPE" ); |
956 |
|
957 |
if( NULL == locale ) |
958 |
locale = getenv( "LANG" ); |
959 |
|
960 |
if( NULL == locale ) |
961 |
locale = "C"; |
962 |
} |
963 |
|
964 |
/* return the locale */ |
965 |
*ppLocale = _parse_locale( locale ); |
966 |
#ifdef DEBUG |
967 |
fprintf( stderr, "nlsupport.c: _imp_getProcessLocale() returning %s as current locale.\n", locale ); |
968 |
#endif |
969 |
|
970 |
pthread_mutex_unlock( &aLocalMutex ); |
971 |
|
704 |
} |
972 |
} |
705 |
|
973 |
|
706 |
/*****************************************************************************/ |
974 |
/*****************************************************************************/ |
Lines 709-716
Link Here
|
709 |
|
977 |
|
710 |
int _imp_setProcessLocale( rtl_Locale * pLocale ) |
978 |
int _imp_setProcessLocale( rtl_Locale * pLocale ) |
711 |
{ |
979 |
{ |
712 |
return 0; |
980 |
/* There is not yet any way to set the locale of a process |
|
|
981 |
* on Darwin or MacOS X through BSD layer functions. |
982 |
* |
983 |
* On MacOS X locale and language are set by the user through |
984 |
* the International pane of the System Preferences application. |
985 |
* |
986 |
* FIXME when this can be done. |
987 |
*/ |
988 |
return 0; |
713 |
} |
989 |
} |
|
|
990 |
|
991 |
|
992 |
/*****************************************************************************/ |
993 |
/* Get a charset name from a CoreFoundation text encoding number |
994 |
/*****************************************************************************/ |
995 |
void macxp_ConvertCFEncodingToIANACharSetName( char *buffer, unsigned int bufferLen, CFStringEncoding cfEncoding ) |
996 |
{ |
997 |
switch( cfEncoding ) |
998 |
{ |
999 |
case 0: strncpy( buffer, "MACINTOSH", bufferLen-1 ); break; /* kCFStringEncodingMacRoman */ |
1000 |
case 1: strncpy( buffer, "X-MAC-JAPANESE", bufferLen-1 ); break; /* kCFStringEncodingMacJapanese */ |
1001 |
case 2: strncpy( buffer, "X-MAC-TRAD-CHINESE", bufferLen-1 ); break; /* kCFStringEncodingMacChineseTrad */ |
1002 |
case 3: strncpy( buffer, "X-MAC-KOREAN", bufferLen-1 ); break; /* kCFStringEncodingMacKorean */ |
1003 |
case 4: strncpy( buffer, "X-MAC-ARABIC", bufferLen-1 ); break; /* kCFStringEncodingMacArabic */ |
1004 |
case 5: strncpy( buffer, "X-MAC-HEBREW", bufferLen-1 ); break; /* kCFStringEncodingMacHebrew */ |
1005 |
case 6: strncpy( buffer, "X-MAC-GREEK", bufferLen-1 ); break; /* kCFStringEncodingMacGreek */ |
1006 |
case 7: strncpy( buffer, "X-MAC-CYRILLIC", bufferLen-1 ); break; /* kCFStringEncodingMacCyrillic */ |
1007 |
case 9: strncpy( buffer, "X-MAC-DEVANAGARI", bufferLen-1 ); break; /* kCFStringEncodingMacDevanagari */ |
1008 |
case 10: strncpy( buffer, "X-MAC-GURMUKHI", bufferLen-1 ); break; /* kCFStringEncodingMacGurmukhi */ |
1009 |
case 11: strncpy( buffer, "X-MAC-GUJARATI", bufferLen-1 ); break; /* kCFStringEncodingMacGujarati */ |
1010 |
case 12: strncpy( buffer, "X-MAC-ORIYA", bufferLen-1 ); break; /* kCFStringEncodingMacOriya */ |
1011 |
case 13: strncpy( buffer, "X-MAC-BENGALI", bufferLen-1 ); break; /* kCFStringEncodingMacBengali */ |
1012 |
case 14: strncpy( buffer, "X-MAC-TAMIL", bufferLen-1 ); break; /* kCFStringEncodingMacTamil */ |
1013 |
case 15: strncpy( buffer, "X-MAC-TELUGU", bufferLen-1 ); break; /* kCFStringEncodingMacTamil */ |
1014 |
case 16: strncpy( buffer, "X-MAC-KANNADA", bufferLen-1 ); break; /* kCFStringEncodingMacKannada */ |
1015 |
case 17: strncpy( buffer, "X-MAC-MALAYALAM", bufferLen-1 ); break; /* kCFStringEncodingMacMalayalam */ |
1016 |
case 18: strncpy( buffer, "X-MAC-SINHALESE", bufferLen-1 ); break; /* kCFStringEncodingMacSinhalese */ |
1017 |
case 19: strncpy( buffer, "X-MAC-BURMESE", bufferLen-1 ); break; /* kCFStringEncodingMacBurmese */ |
1018 |
case 20: strncpy( buffer, "X-MAC-KHMER", bufferLen-1 ); break; /* kCFStringEncodingMacKhmer */ |
1019 |
case 21: strncpy( buffer, "X-MAC-THAI", bufferLen-1 ); break; /* kCFStringEncodingMacThai */ |
1020 |
case 22: strncpy( buffer, "X-MAC-LAOTIAN", bufferLen-1 ); break; /* kCFStringEncodingMacLaotian */ |
1021 |
case 23: strncpy( buffer, "X-MAC-GEORGIAN", bufferLen-1 ); break; /* kCFStringEncodingMacGeorgian */ |
1022 |
case 24: strncpy( buffer, "X-MAC-ARMENIAN", bufferLen-1 ); break; /* kCFStringEncodingMacArmenian */ |
1023 |
case 25: strncpy( buffer, "X-MAC-SIMP-CHINESE", bufferLen-1 ); break; /* kCFStringEncodingMacChineseSimp */ |
1024 |
case 26: strncpy( buffer, "X-MAC-TIBETAN", bufferLen-1 ); break; /* kCFStringEncodingMacTibetan */ |
1025 |
case 27: strncpy( buffer, "X-MAC-MONGOLIAN", bufferLen-1 ); break; /* kCFStringEncodingMacMongolian */ |
1026 |
case 28: strncpy( buffer, "X-MAC-ETHIOPIC", bufferLen-1 ); break; /* kCFStringEncodingMacEthiopic */ |
1027 |
case 29: strncpy( buffer, "X-MAC-CENTRALEURROMAN", bufferLen-1 ); break; /* kCFStringEncodingMacCentralEurRoman */ |
1028 |
case 30: strncpy( buffer, "X-MAC-VIETNAMESE", bufferLen-1 ); break; /* kCFStringEncodingMacVietnamese */ |
1029 |
case 31: strncpy( buffer, "X-MAC-EXTARABIC", bufferLen-1 ); break; /* kCFStringEncodingMacExtArabic */ |
1030 |
case 33: strncpy( buffer, "X-MAC-SYMBOL", bufferLen-1 ); break; /* kCFStringEncodingMacSymbol */ |
1031 |
case 34: strncpy( buffer, "X-MAC-DINGBATS", bufferLen-1 ); break; /* kCFStringEncodingMacDingbats */ |
1032 |
case 35: strncpy( buffer, "X-MAC-TURKISH", bufferLen-1 ); break; /* kCFStringEncodingMacTurkish */ |
1033 |
case 36: strncpy( buffer, "X-MAC-CROATIAN", bufferLen-1 ); break; /* kCFStringEncodingMacCroatian */ |
1034 |
case 37: strncpy( buffer, "X-MAC-ICELANDIC", bufferLen-1 ); break; /* kCFStringEncodingMacIcelandic */ |
1035 |
case 38: strncpy( buffer, "X-MAC-ROMANIAN", bufferLen-1 ); break; /* kCFStringEncodingMacRomanian */ |
1036 |
case 126: strncpy( buffer, "UNICODE-2-0", bufferLen-1 ); break; /* */ |
1037 |
case 140: strncpy( buffer, "X-MAC-FARSI", bufferLen-1 ); break; /* kCFStringEncodingMacFarsi */ |
1038 |
case 152: strncpy( buffer, "X-MAC-UKRAINIAN", bufferLen-1 ); break; /* kCFStringEncodingMacUkrainian */ |
1039 |
case 252: strncpy( buffer, "X-MAC-VT100", bufferLen-1 ); break; /* kCFStringEncodingMacVT100 */ |
1040 |
case 255: strncpy( buffer, "macintosh", bufferLen-1 ); break; /* kCFStringEncodingMacHFS */ |
1041 |
case 256: strncpy( buffer, "UTF-16BE", bufferLen-1 ); break; /* kCFStringEncodingUnicode */ |
1042 |
case 257: strncpy( buffer, "UNICODE-1-1", bufferLen-1 ); break; /* */ |
1043 |
case 258: strncpy( buffer, "UNICODE-1-1", bufferLen-1 ); break; /* */ |
1044 |
case 259: strncpy( buffer, "UNICODE-2-0", bufferLen-1 ); break; /* */ |
1045 |
case 260: strncpy( buffer, "csUnicode", bufferLen-1 ); break; /* */ |
1046 |
case 513: strncpy( buffer, "ISO-8859-1", bufferLen-1 ); break; /* kCFStringEncodingISOLatin1 */ |
1047 |
case 514: strncpy( buffer, "ISO-8859-2", bufferLen-1 ); break; /* kCFStringEncodingISOLatin2 */ |
1048 |
case 515: strncpy( buffer, "ISO-8859-3", bufferLen-1 ); break; /* kCFStringEncodingISOLatin3 */ |
1049 |
case 516: strncpy( buffer, "ISO-8859-4", bufferLen-1 ); break; /* kCFStringEncodingISOLatin4 */ |
1050 |
case 517: strncpy( buffer, "ISO-8859-5", bufferLen-1 ); break; /* kCFStringEncodingISOLatinCyrillic */ |
1051 |
case 518: strncpy( buffer, "ISO-8859-6", bufferLen-1 ); break; /* kCFStringEncodingISOLatinArabic */ |
1052 |
case 519: strncpy( buffer, "ISO-8859-7", bufferLen-1 ); break; /* kCFStringEncodingISOLatinGreek */ |
1053 |
case 520: strncpy( buffer, "ISO-8859-8", bufferLen-1 ); break; /* kCFStringEncodingISOLatinHebrew */ |
1054 |
case 521: strncpy( buffer, "ISO-8859-9", bufferLen-1 ); break; /* kCFStringEncodingISOLatin5 */ |
1055 |
case 522: strncpy( buffer, "ISO-8859-10", bufferLen-1 ); break; /* kCFStringEncodingISOLatin6 */ |
1056 |
case 523: strncpy( buffer, "ISO-8859-11", bufferLen-1 ); break; /* kCFStringEncodingISOLatinThai */ |
1057 |
case 525: strncpy( buffer, "ISO-8859-13", bufferLen-1 ); break; /* kCFStringEncodingISOLatin7 */ |
1058 |
case 526: strncpy( buffer, "ISO-8859-14", bufferLen-1 ); break; /* kCFStringEncodingISOLatin8 */ |
1059 |
case 527: strncpy( buffer, "ISO-8859-15", bufferLen-1 ); break; /* kCFStringEncodingISOLatin9 */ |
1060 |
case 1024: strncpy( buffer, "CP437", bufferLen-1 ); break; /* kCFStringEncodingDOSLatinUS */ |
1061 |
case 1029: strncpy( buffer, "CP737", bufferLen-1 ); break; /* kCFStringEncodingDOSGreek */ |
1062 |
case 1030: strncpy( buffer, "CP775", bufferLen-1 ); break; /* kCFStringEncodingDOSBalticRim */ |
1063 |
case 1040: strncpy( buffer, "CP850", bufferLen-1 ); break; /* kCFStringEncodingDOSLatin1 */ |
1064 |
case 1042: strncpy( buffer, "CP852", bufferLen-1 ); break; /* kCFStringEncodingDOSGreek1 */ |
1065 |
case 1044: strncpy( buffer, "CP857", bufferLen-1 ); break; /* kCFStringEncodingDOSTurkish */ |
1066 |
case 1046: strncpy( buffer, "CP861", bufferLen-1 ); break; /* kCFStringEncodingDOSIcelandic */ |
1067 |
case 1049: strncpy( buffer, "cp864", bufferLen-1 ); break; /* kCFStringEncodingDOSArabic */ |
1068 |
case 1051: strncpy( buffer, "CP866", bufferLen-1 ); break; /* kCFStringEncodingDOSRussian */ |
1069 |
case 1053: strncpy( buffer, "CP874", bufferLen-1 ); break; /* kCFStringEncodingDOSThai */ |
1070 |
case 1056: strncpy( buffer, "CP932", bufferLen-1 ); break; /* kCFStringEncodingDOSJapanese */ |
1071 |
case 1057: strncpy( buffer, "CP936", bufferLen-1 ); break; /* kCFStringEncodingDOSChineseSimplif */ |
1072 |
case 1058: strncpy( buffer, "CP949", bufferLen-1 ); break; /* kCFStringEncodingDOSKorean */ |
1073 |
case 1059: strncpy( buffer, "CP950", bufferLen-1 ); break; /* kCFStringEncodingDOSChineseTrad */ |
1074 |
case 1280: strncpy( buffer, "WINDOWS-1252", bufferLen-1 ); break; /* kCFStringEncodingWindowsLatin1 */ |
1075 |
case 1281: strncpy( buffer, "WINDOWS-1250", bufferLen-1 ); break; /* kCFStringEncodingWindowsLatin2 */ |
1076 |
case 1282: strncpy( buffer, "WINDOWS-1251", bufferLen-1 ); break; /* kCFStringEncodingWindowsCyrillic */ |
1077 |
case 1283: strncpy( buffer, "WINDOWS-1253", bufferLen-1 ); break; /* kCFStringEncodingWindowsGreek */ |
1078 |
case 1284: strncpy( buffer, "WINDOWS-1254", bufferLen-1 ); break; /* kCFStringEncodingWindowsLatin5 */ |
1079 |
case 1285: strncpy( buffer, "WINDOWS-1255", bufferLen-1 ); break; /* kCFStringEncodingWindowsHebrew */ |
1080 |
case 1286: strncpy( buffer, "WINDOWS-1256", bufferLen-1 ); break; /* kCFStringEncodingWindowsArabic */ |
1081 |
case 1287: strncpy( buffer, "WINDOWS-1257", bufferLen-1 ); break; /* kCFStringEncodingWindowsBalticRim */ |
1082 |
case 1288: strncpy( buffer, "WINDOWS-1258", bufferLen-1 ); break; /* kCFStringEncodingWindowsVietnamese */ |
1083 |
case 1536: strncpy( buffer, "US-ASCII", bufferLen-1 ); break; /* kCFStringEncodingASCII */ |
1084 |
case 1570: strncpy( buffer, "JIS_C6226-1983", bufferLen-1 ); break; /* kCFStringEncodingJIS_X0208_90 */ |
1085 |
case 1584: strncpy( buffer, "csISO58GB231280", bufferLen-1 ); break; /* kCFStringEncodingGB_2312_80 */ |
1086 |
case 1585: strncpy( buffer, "X-GBK", bufferLen-1 ); break; /* kCFStringEncodingGBK_95 */ |
1087 |
case 1600: strncpy( buffer, "csKSC56011987", bufferLen-1 ); break; /* kCFStringEncodingKSC_5601_87 */ |
1088 |
case 2080: strncpy( buffer, "ISO-2022-JP", bufferLen-1 ); break; /* kCFStringEncodingISO_2022_JP */ |
1089 |
case 2096: strncpy( buffer, "ISO-2022-CN", bufferLen-1 ); break; /* kCFStringEncodingISO_2022_CN */ |
1090 |
case 2097: strncpy( buffer, "ISO-2022-CN-EXT", bufferLen-1 ); break; /* kCFStringEncodingISO_2022_CN_EXT */ |
1091 |
case 2112: strncpy( buffer, "ISO-2022-KR", bufferLen-1 ); break; /* kCFStringEncodingISO_2022_KR */ |
1092 |
case 2336: strncpy( buffer, "EUC-JP", bufferLen-1 ); break; /* kCFStringEncodingEUC_JP */ |
1093 |
case 2352: strncpy( buffer, "EUC-CN", bufferLen-1 ); break; /* kCFStringEncodingEUC_CN */ |
1094 |
case 2353: strncpy( buffer, "EUC-TW", bufferLen-1 ); break; /* kCFStringEncodingEUC_TW */ |
1095 |
case 2368: strncpy( buffer, "EUC-KR", bufferLen-1 ); break; /* kCFStringEncodingEUC_KR */ |
1096 |
case 2561: strncpy( buffer, "SHIFT_JIS", bufferLen-1 ); break; /* kCFStringEncodingShiftJIS */ |
1097 |
case 2562: strncpy( buffer, "KOI8-R", bufferLen-1 ); break; /* kCFStringEncodingKOI8_R */ |
1098 |
case 2563: strncpy( buffer, "BIG5", bufferLen-1 ); break; /* kCFStringEncodingBig5 */ |
1099 |
case 2564: strncpy( buffer, "X-MAC-ROMAN-LATIN1", bufferLen-1 ); break; /* kCFStringEncodingMacRomanLatin1 */ |
1100 |
case 2565: strncpy( buffer, "HZ-GB-2312", bufferLen-1 ); break; /* kCFStringEncodingHZ_GB_2312 */ |
1101 |
case 2566: strncpy( buffer, "Big5-HKSCS", bufferLen-1 ); break; /* kCFStringEncodingBig5_HKSCS_1999 */ |
1102 |
case 2817: strncpy( buffer, "X-NEXTSTEP", bufferLen-1 ); break; /* kCFStringEncodingNextStepLatin */ |
1103 |
case 3074: strncpy( buffer, "cp037", bufferLen-1 ); break; /* kCFStringEncodingEBCDIC_CP037 */ |
1104 |
default: strncpy( buffer, "", bufferLen-1 ); break; /* Not listed */ |
1105 |
} |
1106 |
} |
1107 |
|
1108 |
#endif /* ifndef MACOSX */ |
714 |
|
1109 |
|
715 |
#else /* ifdef LINUX || SOLARIS || MACOSX || NETBSD */ |
1110 |
#else /* ifdef LINUX || SOLARIS || MACOSX || NETBSD */ |
716 |
|
1111 |
|