diff options
author | Jens-Heiner Rechtien <hr@openoffice.org> | 2004-02-02 18:01:40 +0000 |
---|---|---|
committer | Jens-Heiner Rechtien <hr@openoffice.org> | 2004-02-02 18:01:40 +0000 |
commit | 8737d1831b48acd8a4793c4728ad8563f77b5bf8 (patch) | |
tree | 4063d542e92e020efcfa6b619955737179df97e2 | |
parent | 0e89420518090a86ce4c5affc335f9e5915bda09 (diff) |
INTEGRATION: CWS geordi2q14 (1.21.88); FILE MERGED
2004/01/29 18:31:39 hr 1.21.88.1: #111934#: merge CWS ooo111fix2
-rw-r--r-- | sal/osl/unx/nlsupport.c | 533 |
1 files changed, 103 insertions, 430 deletions
diff --git a/sal/osl/unx/nlsupport.c b/sal/osl/unx/nlsupport.c index ae0fd7615bb0..059b80a1b603 100644 --- a/sal/osl/unx/nlsupport.c +++ b/sal/osl/unx/nlsupport.c @@ -2,9 +2,9 @@ * * $RCSfile: nlsupport.c,v $ * - * $Revision: 1.21 $ + * $Revision: 1.22 $ * - * last change: $Author: hr $ $Date: 2003-07-16 17:21:12 $ + * last change: $Author: hr $ $Date: 2004-02-02 19:01:40 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -246,7 +246,7 @@ static rtl_Locale * _parse_locale( const char * locale ) return NULL; } -#if defined(LINUX) || defined(SOLARIS) || defined(IRIX) || defined(NETBSD) || defined(FREEBSD) || defined(MACOSX) +#if defined(LINUX) || defined(SOLARIS) || defined(IRIX) || defined(NETBSD) || defined(FREEBSD) /* * This implementation of osl_getTextEncodingFromLocale maps @@ -329,7 +329,7 @@ const _pair _nl_language_list[] = { { "sjis", RTL_TEXTENCODING_SHIFT_JIS } /* Japan */ }; -#elif defined(LINUX) || defined(NETBSD) || defined(MACOSX) +#elif defined(LINUX) || defined(NETBSD) const _pair _nl_language_list[] = { { "ANSI_X3.110-1983", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-99 NAPLPS */ @@ -563,112 +563,10 @@ const _pair _nl_language_list[] = { { "UTF-8", RTL_TEXTENCODING_UTF8 } /* ISO-10646/UTF-8 */ }; -#endif /* ifdef SOLARIS IRIX LINUX FREEBSD NETBSD MACOSX */ - -#ifdef MACOSX -/* MacOS X has some special names for some of its encodings. These encoding names are - * returned by CFStringConvertEncodingToIANACharSetName() when given a CFTextEncoding - * argument from one of the ones in CFStringEncodingExt.h in the CoreFoundation framework. - */ -const _pair _macxp_language_list[] = { - { "MACINTOSH", RTL_TEXTENCODING_ISO_8859_1 }, /* kCFStringEncodingMacRoman */ - { "X-MAC-JAPANESE", RTL_TEXTENCODING_EUC_JP }, /* kCFStringEncodingMacJapanese */ - { "X-MAC-TRAD-CHINESE", RTL_TEXTENCODING_APPLE_CHINTRAD }, /* kCFStringEncodingMacChineseTrad */ - { "X-MAC-KOREAN", RTL_TEXTENCODING_EUC_KR }, /* kCFStringEncodingMacKorean */ - { "X-MAC-ARABIC", RTL_TEXTENCODING_APPLE_ARABIC }, /* kCFStringEncodingMacArabic */ - { "X-MAC-HEBREW", RTL_TEXTENCODING_APPLE_HEBREW }, /* kCFStringEncodingMacHebrew */ - { "X-MAC-GREEK", RTL_TEXTENCODING_APPLE_GREEK }, /* kCFStringEncodingMacGreek */ - { "X-MAC-CYRILLIC", RTL_TEXTENCODING_APPLE_CYRILLIC }, /* kCFStringEncodingMacCyrillic */ - { "X-MAC-DEVANAGARI", RTL_TEXTENCODING_APPLE_DEVANAGARI }, /* kCFStringEncodingMacDevanagari */ - { "X-MAC-GURMUKHI", RTL_TEXTENCODING_APPLE_GURMUKHI }, /* kCFStringEncodingMacGurmukhi */ - { "X-MAC-GUJARATI", RTL_TEXTENCODING_APPLE_GUJARATI }, /* kCFStringEncodingMacGujarati */ - { "X-MAC-ORIYA", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacOriya */ - { "X-MAC-BENGALI", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacBengali */ - { "X-MAC-TAMIL", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacTamil */ - { "X-MAC-TELUGU", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacTelugu */ - { "X-MAC-KANNADA", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacKannada */ - { "X-MAC-MALAYALAM", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacMalayalam */ - { "X-MAC-SINHALESE", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacSinhalese */ - { "X-MAC-BURMESE", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacBurmese */ - { "X-MAC-KHMER", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacKhmer */ - { "X-MAC-THAI", RTL_TEXTENCODING_APPLE_THAI }, /* kCFStringEncodingMacThai */ - { "X-MAC-LAOTIAN", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacLaotian */ - { "X-MAC-GEORGIAN", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacGeorgian */ - { "X-MAC-ARMENIAN", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacArmenian */ - { "X-MAC-SIMP-CHINESE", RTL_TEXTENCODING_APPLE_CHINSIMP }, /* kCFStringEncodingMacChineseSimp */ - { "X-MAC-TIBETAN", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacTibetan */ - { "X-MAC-MONGOLIAN", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacMongolian */ - { "X-MAC-ETHIOPIC", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacEthiopic */ - { "X-MAC-CENTRALEURROMAN", RTL_TEXTENCODING_APPLE_CENTEURO }, /* kCFStringEncodingMacCentralEurRoman */ - { "X-MAC-VIETNAMESE", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacVietnamese */ - { "X-MAC-EXTARABIC", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacExtArabic */ - { "X-MAC-SYMBOL", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacSymbol */ - { "X-MAC-DINGBATS", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacDingbats */ - { "X-MAC-TURKISH", RTL_TEXTENCODING_APPLE_TURKISH }, /* kCFStringEncodingMacTurkish */ - { "X-MAC-CROATIAN", RTL_TEXTENCODING_APPLE_CROATIAN }, /* kCFStringEncodingMacCroatian */ - { "X-MAC-ICELANDIC", RTL_TEXTENCODING_APPLE_ICELAND }, /* kCFStringEncodingMacIcelandic */ - { "X-MAC-ROMANIAN", RTL_TEXTENCODING_APPLE_ROMANIAN }, /* kCFStringEncodingMacRomanian */ - { "UNICODE-2-0", RTL_TEXTENCODING_DONTKNOW }, /* */ - { "X-MAC-FARSI", RTL_TEXTENCODING_APPLE_FARSI }, /* kCFStringEncodingMacFarsi */ - { "X-MAC-UKRAINIAN", RTL_TEXTENCODING_APPLE_UKRAINIAN }, /* kCFStringEncodingMacUkrainian */ - { "X-MAC-VT100", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacVT100 */ - { "macintosh", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingMacHFS */ - { "UTF-16BE", RTL_TEXTENCODING_UNICODE }, /* kCFStringEncodingUnicode */ - { "UNICODE-1-1", RTL_TEXTENCODING_DONTKNOW }, /* */ - { "UNICODE-1-1", RTL_TEXTENCODING_DONTKNOW }, /* */ - { "UNICODE-2-0", RTL_TEXTENCODING_DONTKNOW }, /* */ - { "csUnicode", RTL_TEXTENCODING_DONTKNOW }, /* */ - { "CP437", RTL_TEXTENCODING_IBM_437 }, /* kCFStringEncodingDOSLatinUS */ - { "CP737", RTL_TEXTENCODING_IBM_737 }, /* kCFStringEncodingDOSGreek */ - { "CP775", RTL_TEXTENCODING_IBM_775 }, /* kCFStringEncodingDOSBalticRim */ - { "CP850", RTL_TEXTENCODING_IBM_850 }, /* kCFStringEncodingDOSLatin1 */ - { "CP852", RTL_TEXTENCODING_IBM_852 }, /* kCFStringEncodingDOSGreek1 */ - { "CP857", RTL_TEXTENCODING_IBM_857 }, /* kCFStringEncodingDOSTurkish */ - { "CP861", RTL_TEXTENCODING_IBM_861 }, /* kCFStringEncodingDOSIcelandic */ - { "cp864", RTL_TEXTENCODING_IBM_864 }, /* kCFStringEncodingDOSArabic */ - { "CP866", RTL_TEXTENCODING_IBM_866 }, /* kCFStringEncodingDOSRussian */ - { "CP874", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingDOSThai */ - { "CP932", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingDOSJapanese */ - { "CP936", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingDOSChineseSimplif */ - { "CP949", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingDOSKorean */ - { "CP950", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingDOSChineseTrad */ - { "WINDOWS-1252", RTL_TEXTENCODING_MS_1252 }, /* kCFStringEncodingWindowsLatin1 */ - { "WINDOWS-1250", RTL_TEXTENCODING_MS_1250 }, /* kCFStringEncodingWindowsLatin2 */ - { "WINDOWS-1251", RTL_TEXTENCODING_MS_1251 }, /* kCFStringEncodingWindowsCyrillic */ - { "WINDOWS-1253", RTL_TEXTENCODING_MS_1253 }, /* kCFStringEncodingWindowsGreek */ - { "WINDOWS-1254", RTL_TEXTENCODING_MS_1254 }, /* kCFStringEncodingWindowsLatin5 */ - { "WINDOWS-1255", RTL_TEXTENCODING_MS_1255 }, /* kCFStringEncodingWindowsHebrew */ - { "WINDOWS-1256", RTL_TEXTENCODING_MS_1256 }, /* kCFStringEncodingWindowsArabic */ - { "WINDOWS-1257", RTL_TEXTENCODING_MS_1257 }, /* kCFStringEncodingWindowsBalticRim */ - { "WINDOWS-1258", RTL_TEXTENCODING_MS_1258 }, /* kCFStringEncodingWindowsVietnamese */ - { "US-ASCII", RTL_TEXTENCODING_ASCII_US }, /* kCFStringEncodingASCII */ - { "JIS_C6226-1983", RTL_TEXTENCODING_GB_2312 }, /* kCFStringEncodingJIS_X0208_90 */ - { "csISO58GB231280", RTL_TEXTENCODING_GB_2312 }, /* kCFStringEncodingGB_2312_80 */ - { "X-GBK", RTL_TEXTENCODING_GBK }, /* kCFStringEncodingGBK_95 */ - { "csKSC56011987", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingKSC_5601_87 */ - { "ISO-2022-JP", RTL_TEXTENCODING_ISO_2022_JP }, /* kCFStringEncodingISO_2022_JP */ - { "ISO-2022-CN", RTL_TEXTENCODING_ISO_2022_CN }, /* kCFStringEncodingISO_2022_CN */ - { "ISO-2022-CN-EXT", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingISO_2022_CN_EXT */ - { "ISO-2022-KR", RTL_TEXTENCODING_ISO_2022_KR }, /* kCFStringEncodingISO_2022_KR */ - { "EUC-JP", RTL_TEXTENCODING_EUC_JP }, /* kCFStringEncodingEUC_JP */ - { "EUC-CN", RTL_TEXTENCODING_EUC_CN }, /* kCFStringEncodingEUC_CN */ - { "EUC-TW", RTL_TEXTENCODING_EUC_TW }, /* kCFStringEncodingEUC_TW */ - { "EUC-KR", RTL_TEXTENCODING_EUC_KR }, /* kCFStringEncodingEUC_KR */ - { "SHIFT_JIS", RTL_TEXTENCODING_SHIFT_JIS }, /* kCFStringEncodingShiftJIS */ - { "KOI8-R", RTL_TEXTENCODING_KOI8_R }, /* kCFStringEncodingKOI8_R */ - { "X-MAC-ROMAN-LATIN1", RTL_TEXTENCODING_APPLE_ROMAN }, /* kCFStringEncodingMacRomanLatin1 */ - { "HZ-GB-2312", RTL_TEXTENCODING_GB_2312 }, /* kCFStringEncodingHZ_GB_2312 */ - { "Big5-HKSCS", RTL_TEXTENCODING_BIG5_HKSCS }, /* kCFStringEncodingBig5_HKSCS_1999 */ - { "X-NEXTSTEP", RTL_TEXTENCODING_DONTKNOW }, /* kCFStringEncodingNextStepLatin */ - { "cp037", RTL_TEXTENCODING_DONTKNOW } /* kCFStringEncodingEBCDIC_CP037 */ -/* ___________ Add more encodings here ___________ */ -}; -#endif /* ifdef MACOSX */ +#endif /* ifdef SOLARIS IRIX LINUX FREEBSD NETBSD */ static pthread_mutex_t aLocalMutex = PTHREAD_MUTEX_INITIALIZER; -#ifndef MACOSX - /*****************************************************************************/ /* return the text encoding corresponding to the given locale /*****************************************************************************/ @@ -787,326 +685,6 @@ int _imp_setProcessLocale( rtl_Locale * pLocale ) return ret; } -#else /* ifndef MACOSX */ - -/* - * MacOS X specific Locale manipulation code - */ - -#include <premac.h> -#include <CoreFoundation/CoreFoundation.h> -#include <postmac.h> - -/* OS X locale discovery function from dylib */ -int (*pGetOSXLocale)( char *, sal_uInt32 ); -int (*pConvertTextEncodingToIANACharsetName)( char *, unsigned int, CFStringEncoding ); - -void macxp_ConvertCFEncodingToIANACharSetName( char *buffer, unsigned int bufferLen, CFStringEncoding cfEncoding ); - -/*****************************************************************************/ -/* return the text encoding corresponding to the given locale -/*****************************************************************************/ - -rtl_TextEncoding osl_getTextEncodingFromLocale( rtl_Locale * pLocale ) -{ - const _pair *pLanguage = NULL; - char sEncoding[ 64 ] = ""; - CFStringEncoding sCFSysEncoding; - const unsigned int macxpListMembers = sizeof(_macxp_language_list) / sizeof(_pair); - const unsigned int otherListMembers = sizeof(_nl_language_list) / sizeof(_pair); - unsigned int isDarwin; - unsigned int majorVersion; - unsigned int minorVersion; - unsigned int minorMinorVersion; - - /* For retrieving the CoreFoundation text encoding, the process goes like - * this: - * 1) On MacOS X this will be the first language listed in the - * Language tab of the International preference pane. - * 2) On Darwin 5 the value is currently hardwired to - * kCFStringEncodingMacRoman. - */ - sCFSysEncoding = CFStringGetSystemEncoding(); - - /* If running on OS X, attempt to convert text encoding to a charset name using CoreFoundation calls. */ - /* Must use osl_psz_xxxx variants of functions here because otherwise osl_loadModule() tries to get the - * un-Unicode the string we pass to it, which results in this function being called again and again and - * again, finally overflowing the stack. - */ - macxp_getSystemVersion( &isDarwin, &majorVersion, &minorVersion, &minorMinorVersion ); - if( !isDarwin ) - { - /* Load the text encoding conversion library if we are running on OS X */ - const sal_Char *aTextEncConvertLibName = "libsalextra_x11osx_mxp.dylib"; - const sal_Char *aOSXTextEncConvertFunctionName = "macxp_OSXConvertCFEncodingToIANACharSetName"; - oslModule pTextEncCovertLib; - void *pFunc; - int err; - - pTextEncCovertLib = osl_psz_loadModule( aTextEncConvertLibName, SAL_LOADMODULE_DEFAULT ); - if( !pTextEncCovertLib ) - { - fprintf( stderr, "Could not load the OS X text encoding coversion library! (%s)\n", aTextEncConvertLibName ); - } - else - { - /* Grab a pointer to the text encoding conversion function and call it */ - pFunc = osl_psz_getSymbol( pTextEncCovertLib, aOSXTextEncConvertFunctionName ); - if( pFunc ) - { - pConvertTextEncodingToIANACharsetName = ( int(*)(char *, unsigned int, CFStringEncoding) )( pFunc ); - err = (*pConvertTextEncodingToIANACharsetName)( sEncoding, 64, sCFSysEncoding ); - } - else - fprintf( stderr, "Could not grab pointer to the OS X text encoding coversion routine! (%s)\n", aOSXTextEncConvertFunctionName ); - } - osl_unloadModule( pTextEncCovertLib ); - } - - if ( strlen(sEncoding) <= 0 ) - { - /* - * Darwin doesn't have a CFStringConvertEncodingToIANACharSetName(), - * so we call our own replacement. Also fall back to our replacement - * if for some reason we can't load our OS X convert library. - */ - macxp_ConvertCFEncodingToIANACharSetName( sEncoding, 64, sCFSysEncoding ); - } - - /* Try the Mac-specific list first, then non-Mac list (picks up MACINTOSH from non-Mac list) */ - pLanguage = _pair_search( sEncoding, _macxp_language_list, macxpListMembers ); - if ( pLanguage == NULL ) - pLanguage = _pair_search( sEncoding, _nl_language_list, otherListMembers ); - - OSL_ASSERT( pLanguage && ( RTL_TEXTENCODING_DONTKNOW != pLanguage->value ) ); - - /* - * a matching item in our list provides a mapping from codeset to - * rtl-codeset - */ - if ( pLanguage != NULL ) - return pLanguage->value; - - return RTL_TEXTENCODING_DONTKNOW; -} - -/*****************************************************************************/ -/* return the current process locale -/*****************************************************************************/ - -void _imp_getProcessLocale( rtl_Locale ** ppLocale ) -{ - static const char *locale = NULL; - - /* basic thread safeness */ - pthread_mutex_lock( &aLocalMutex ); - - /* Only fetch the locale once and cache it */ - if ( NULL == locale ) - { - unsigned int isDarwin; - unsigned int majorVersion; - unsigned int minorVersion; - unsigned int minorMinorVersion; - - /* If running on OS X, attempt to fetch the locale using CoreServices calls. */ - macxp_getSystemVersion( &isDarwin, &majorVersion, &minorVersion, &minorMinorVersion ); - if( !isDarwin ) - { - /* Load the locale discovery library if we are running on OS X */ - const sal_Char *aLocaleLibName = "libsalextra_x11osx_mxp.dylib"; - const sal_Char *aGetOSXLocaleFunctionName = "macxp_getOSXLocale"; - oslModule pLocaleLib; - void *pFunc; - int err; - - pLocaleLib = osl_psz_loadModule( aLocaleLibName, SAL_LOADMODULE_DEFAULT ); - if( pLocaleLib ) - { - /* Grab a pointer to the locale function and call it */ - pFunc = osl_psz_getSymbol( pLocaleLib, aGetOSXLocaleFunctionName ); - if( pFunc ) - { - pGetOSXLocale = ( int(*)(char *, sal_uInt32) )( pFunc ); - locale = (char *)malloc( 20 ); - if ( locale ) - err = (*pGetOSXLocale)( locale, 20 ); - else - fprintf( stderr, "nlsupport.c: locale allocation returned NULL!\n" ); - } - else - fprintf( stderr, "Could not load the OS X locale discovery function! (%s)\n", aGetOSXLocaleFunctionName ); - } - else - fprintf( stderr, "Could not load the OS X locale discovery library! (%s)\n", aLocaleLibName ); - - /* Let go of the module, we don't need it anymore */ - osl_unloadModule( pLocaleLib ); - } - } - - /* handle the case where OS specific method of finding locale fails */ - if ( NULL == locale ) - { - /* simulate behavior of setlocale */ - locale = getenv( "LC_ALL" ); - - if( NULL == locale ) - locale = getenv( "LC_CTYPE" ); - - if( NULL == locale ) - locale = getenv( "LANG" ); - - if( NULL == locale ) - locale = "C"; - } - - /* return the locale */ - *ppLocale = _parse_locale( locale ); -#ifdef DEBUG - fprintf( stderr, "nlsupport.c: _imp_getProcessLocale() returning %s as current locale.\n", locale ); -#endif - - pthread_mutex_unlock( &aLocalMutex ); - -} - -/*****************************************************************************/ -/* set the current process locale -/*****************************************************************************/ - -int _imp_setProcessLocale( rtl_Locale * pLocale ) -{ - /* There is not yet any way to set the locale of a process - * on Darwin or MacOS X through BSD layer functions. - * - * On MacOS X locale and language are set by the user through - * the International pane of the System Preferences application. - * - * FIXME when this can be done. - */ - return 0; -} - - -/*****************************************************************************/ -/* Get a charset name from a CoreFoundation text encoding number -/*****************************************************************************/ -void macxp_ConvertCFEncodingToIANACharSetName( char *buffer, unsigned int bufferLen, CFStringEncoding cfEncoding ) -{ - switch( cfEncoding ) - { - case 0: strncpy( buffer, "MACINTOSH", bufferLen-1 ); break; /* kCFStringEncodingMacRoman */ - case 1: strncpy( buffer, "X-MAC-JAPANESE", bufferLen-1 ); break; /* kCFStringEncodingMacJapanese */ - case 2: strncpy( buffer, "X-MAC-TRAD-CHINESE", bufferLen-1 ); break; /* kCFStringEncodingMacChineseTrad */ - case 3: strncpy( buffer, "X-MAC-KOREAN", bufferLen-1 ); break; /* kCFStringEncodingMacKorean */ - case 4: strncpy( buffer, "X-MAC-ARABIC", bufferLen-1 ); break; /* kCFStringEncodingMacArabic */ - case 5: strncpy( buffer, "X-MAC-HEBREW", bufferLen-1 ); break; /* kCFStringEncodingMacHebrew */ - case 6: strncpy( buffer, "X-MAC-GREEK", bufferLen-1 ); break; /* kCFStringEncodingMacGreek */ - case 7: strncpy( buffer, "X-MAC-CYRILLIC", bufferLen-1 ); break; /* kCFStringEncodingMacCyrillic */ - case 9: strncpy( buffer, "X-MAC-DEVANAGARI", bufferLen-1 ); break; /* kCFStringEncodingMacDevanagari */ - case 10: strncpy( buffer, "X-MAC-GURMUKHI", bufferLen-1 ); break; /* kCFStringEncodingMacGurmukhi */ - case 11: strncpy( buffer, "X-MAC-GUJARATI", bufferLen-1 ); break; /* kCFStringEncodingMacGujarati */ - case 12: strncpy( buffer, "X-MAC-ORIYA", bufferLen-1 ); break; /* kCFStringEncodingMacOriya */ - case 13: strncpy( buffer, "X-MAC-BENGALI", bufferLen-1 ); break; /* kCFStringEncodingMacBengali */ - case 14: strncpy( buffer, "X-MAC-TAMIL", bufferLen-1 ); break; /* kCFStringEncodingMacTamil */ - case 15: strncpy( buffer, "X-MAC-TELUGU", bufferLen-1 ); break; /* kCFStringEncodingMacTamil */ - case 16: strncpy( buffer, "X-MAC-KANNADA", bufferLen-1 ); break; /* kCFStringEncodingMacKannada */ - case 17: strncpy( buffer, "X-MAC-MALAYALAM", bufferLen-1 ); break; /* kCFStringEncodingMacMalayalam */ - case 18: strncpy( buffer, "X-MAC-SINHALESE", bufferLen-1 ); break; /* kCFStringEncodingMacSinhalese */ - case 19: strncpy( buffer, "X-MAC-BURMESE", bufferLen-1 ); break; /* kCFStringEncodingMacBurmese */ - case 20: strncpy( buffer, "X-MAC-KHMER", bufferLen-1 ); break; /* kCFStringEncodingMacKhmer */ - case 21: strncpy( buffer, "X-MAC-THAI", bufferLen-1 ); break; /* kCFStringEncodingMacThai */ - case 22: strncpy( buffer, "X-MAC-LAOTIAN", bufferLen-1 ); break; /* kCFStringEncodingMacLaotian */ - case 23: strncpy( buffer, "X-MAC-GEORGIAN", bufferLen-1 ); break; /* kCFStringEncodingMacGeorgian */ - case 24: strncpy( buffer, "X-MAC-ARMENIAN", bufferLen-1 ); break; /* kCFStringEncodingMacArmenian */ - case 25: strncpy( buffer, "X-MAC-SIMP-CHINESE", bufferLen-1 ); break; /* kCFStringEncodingMacChineseSimp */ - case 26: strncpy( buffer, "X-MAC-TIBETAN", bufferLen-1 ); break; /* kCFStringEncodingMacTibetan */ - case 27: strncpy( buffer, "X-MAC-MONGOLIAN", bufferLen-1 ); break; /* kCFStringEncodingMacMongolian */ - case 28: strncpy( buffer, "X-MAC-ETHIOPIC", bufferLen-1 ); break; /* kCFStringEncodingMacEthiopic */ - case 29: strncpy( buffer, "X-MAC-CENTRALEURROMAN", bufferLen-1 ); break; /* kCFStringEncodingMacCentralEurRoman */ - case 30: strncpy( buffer, "X-MAC-VIETNAMESE", bufferLen-1 ); break; /* kCFStringEncodingMacVietnamese */ - case 31: strncpy( buffer, "X-MAC-EXTARABIC", bufferLen-1 ); break; /* kCFStringEncodingMacExtArabic */ - case 33: strncpy( buffer, "X-MAC-SYMBOL", bufferLen-1 ); break; /* kCFStringEncodingMacSymbol */ - case 34: strncpy( buffer, "X-MAC-DINGBATS", bufferLen-1 ); break; /* kCFStringEncodingMacDingbats */ - case 35: strncpy( buffer, "X-MAC-TURKISH", bufferLen-1 ); break; /* kCFStringEncodingMacTurkish */ - case 36: strncpy( buffer, "X-MAC-CROATIAN", bufferLen-1 ); break; /* kCFStringEncodingMacCroatian */ - case 37: strncpy( buffer, "X-MAC-ICELANDIC", bufferLen-1 ); break; /* kCFStringEncodingMacIcelandic */ - case 38: strncpy( buffer, "X-MAC-ROMANIAN", bufferLen-1 ); break; /* kCFStringEncodingMacRomanian */ - case 126: strncpy( buffer, "UNICODE-2-0", bufferLen-1 ); break; /* */ - case 140: strncpy( buffer, "X-MAC-FARSI", bufferLen-1 ); break; /* kCFStringEncodingMacFarsi */ - case 152: strncpy( buffer, "X-MAC-UKRAINIAN", bufferLen-1 ); break; /* kCFStringEncodingMacUkrainian */ - case 252: strncpy( buffer, "X-MAC-VT100", bufferLen-1 ); break; /* kCFStringEncodingMacVT100 */ - case 255: strncpy( buffer, "macintosh", bufferLen-1 ); break; /* kCFStringEncodingMacHFS */ - case 256: strncpy( buffer, "UTF-16BE", bufferLen-1 ); break; /* kCFStringEncodingUnicode */ - case 257: strncpy( buffer, "UNICODE-1-1", bufferLen-1 ); break; /* */ - case 258: strncpy( buffer, "UNICODE-1-1", bufferLen-1 ); break; /* */ - case 259: strncpy( buffer, "UNICODE-2-0", bufferLen-1 ); break; /* */ - case 260: strncpy( buffer, "csUnicode", bufferLen-1 ); break; /* */ - case 513: strncpy( buffer, "ISO-8859-1", bufferLen-1 ); break; /* kCFStringEncodingISOLatin1 */ - case 514: strncpy( buffer, "ISO-8859-2", bufferLen-1 ); break; /* kCFStringEncodingISOLatin2 */ - case 515: strncpy( buffer, "ISO-8859-3", bufferLen-1 ); break; /* kCFStringEncodingISOLatin3 */ - case 516: strncpy( buffer, "ISO-8859-4", bufferLen-1 ); break; /* kCFStringEncodingISOLatin4 */ - case 517: strncpy( buffer, "ISO-8859-5", bufferLen-1 ); break; /* kCFStringEncodingISOLatinCyrillic */ - case 518: strncpy( buffer, "ISO-8859-6", bufferLen-1 ); break; /* kCFStringEncodingISOLatinArabic */ - case 519: strncpy( buffer, "ISO-8859-7", bufferLen-1 ); break; /* kCFStringEncodingISOLatinGreek */ - case 520: strncpy( buffer, "ISO-8859-8", bufferLen-1 ); break; /* kCFStringEncodingISOLatinHebrew */ - case 521: strncpy( buffer, "ISO-8859-9", bufferLen-1 ); break; /* kCFStringEncodingISOLatin5 */ - case 522: strncpy( buffer, "ISO-8859-10", bufferLen-1 ); break; /* kCFStringEncodingISOLatin6 */ - case 523: strncpy( buffer, "ISO-8859-11", bufferLen-1 ); break; /* kCFStringEncodingISOLatinThai */ - case 525: strncpy( buffer, "ISO-8859-13", bufferLen-1 ); break; /* kCFStringEncodingISOLatin7 */ - case 526: strncpy( buffer, "ISO-8859-14", bufferLen-1 ); break; /* kCFStringEncodingISOLatin8 */ - case 527: strncpy( buffer, "ISO-8859-15", bufferLen-1 ); break; /* kCFStringEncodingISOLatin9 */ - case 1024: strncpy( buffer, "CP437", bufferLen-1 ); break; /* kCFStringEncodingDOSLatinUS */ - case 1029: strncpy( buffer, "CP737", bufferLen-1 ); break; /* kCFStringEncodingDOSGreek */ - case 1030: strncpy( buffer, "CP775", bufferLen-1 ); break; /* kCFStringEncodingDOSBalticRim */ - case 1040: strncpy( buffer, "CP850", bufferLen-1 ); break; /* kCFStringEncodingDOSLatin1 */ - case 1042: strncpy( buffer, "CP852", bufferLen-1 ); break; /* kCFStringEncodingDOSGreek1 */ - case 1044: strncpy( buffer, "CP857", bufferLen-1 ); break; /* kCFStringEncodingDOSTurkish */ - case 1046: strncpy( buffer, "CP861", bufferLen-1 ); break; /* kCFStringEncodingDOSIcelandic */ - case 1049: strncpy( buffer, "cp864", bufferLen-1 ); break; /* kCFStringEncodingDOSArabic */ - case 1051: strncpy( buffer, "CP866", bufferLen-1 ); break; /* kCFStringEncodingDOSRussian */ - case 1053: strncpy( buffer, "CP874", bufferLen-1 ); break; /* kCFStringEncodingDOSThai */ - case 1056: strncpy( buffer, "CP932", bufferLen-1 ); break; /* kCFStringEncodingDOSJapanese */ - case 1057: strncpy( buffer, "CP936", bufferLen-1 ); break; /* kCFStringEncodingDOSChineseSimplif */ - case 1058: strncpy( buffer, "CP949", bufferLen-1 ); break; /* kCFStringEncodingDOSKorean */ - case 1059: strncpy( buffer, "CP950", bufferLen-1 ); break; /* kCFStringEncodingDOSChineseTrad */ - case 1280: strncpy( buffer, "WINDOWS-1252", bufferLen-1 ); break; /* kCFStringEncodingWindowsLatin1 */ - case 1281: strncpy( buffer, "WINDOWS-1250", bufferLen-1 ); break; /* kCFStringEncodingWindowsLatin2 */ - case 1282: strncpy( buffer, "WINDOWS-1251", bufferLen-1 ); break; /* kCFStringEncodingWindowsCyrillic */ - case 1283: strncpy( buffer, "WINDOWS-1253", bufferLen-1 ); break; /* kCFStringEncodingWindowsGreek */ - case 1284: strncpy( buffer, "WINDOWS-1254", bufferLen-1 ); break; /* kCFStringEncodingWindowsLatin5 */ - case 1285: strncpy( buffer, "WINDOWS-1255", bufferLen-1 ); break; /* kCFStringEncodingWindowsHebrew */ - case 1286: strncpy( buffer, "WINDOWS-1256", bufferLen-1 ); break; /* kCFStringEncodingWindowsArabic */ - case 1287: strncpy( buffer, "WINDOWS-1257", bufferLen-1 ); break; /* kCFStringEncodingWindowsBalticRim */ - case 1288: strncpy( buffer, "WINDOWS-1258", bufferLen-1 ); break; /* kCFStringEncodingWindowsVietnamese */ - case 1536: strncpy( buffer, "US-ASCII", bufferLen-1 ); break; /* kCFStringEncodingASCII */ - case 1570: strncpy( buffer, "JIS_C6226-1983", bufferLen-1 ); break; /* kCFStringEncodingJIS_X0208_90 */ - case 1584: strncpy( buffer, "csISO58GB231280", bufferLen-1 ); break; /* kCFStringEncodingGB_2312_80 */ - case 1585: strncpy( buffer, "X-GBK", bufferLen-1 ); break; /* kCFStringEncodingGBK_95 */ - case 1600: strncpy( buffer, "csKSC56011987", bufferLen-1 ); break; /* kCFStringEncodingKSC_5601_87 */ - case 2080: strncpy( buffer, "ISO-2022-JP", bufferLen-1 ); break; /* kCFStringEncodingISO_2022_JP */ - case 2096: strncpy( buffer, "ISO-2022-CN", bufferLen-1 ); break; /* kCFStringEncodingISO_2022_CN */ - case 2097: strncpy( buffer, "ISO-2022-CN-EXT", bufferLen-1 ); break; /* kCFStringEncodingISO_2022_CN_EXT */ - case 2112: strncpy( buffer, "ISO-2022-KR", bufferLen-1 ); break; /* kCFStringEncodingISO_2022_KR */ - case 2336: strncpy( buffer, "EUC-JP", bufferLen-1 ); break; /* kCFStringEncodingEUC_JP */ - case 2352: strncpy( buffer, "EUC-CN", bufferLen-1 ); break; /* kCFStringEncodingEUC_CN */ - case 2353: strncpy( buffer, "EUC-TW", bufferLen-1 ); break; /* kCFStringEncodingEUC_TW */ - case 2368: strncpy( buffer, "EUC-KR", bufferLen-1 ); break; /* kCFStringEncodingEUC_KR */ - case 2561: strncpy( buffer, "SHIFT_JIS", bufferLen-1 ); break; /* kCFStringEncodingShiftJIS */ - case 2562: strncpy( buffer, "KOI8-R", bufferLen-1 ); break; /* kCFStringEncodingKOI8_R */ - case 2563: strncpy( buffer, "BIG5", bufferLen-1 ); break; /* kCFStringEncodingBig5 */ - case 2564: strncpy( buffer, "X-MAC-ROMAN-LATIN1", bufferLen-1 ); break; /* kCFStringEncodingMacRomanLatin1 */ - case 2565: strncpy( buffer, "HZ-GB-2312", bufferLen-1 ); break; /* kCFStringEncodingHZ_GB_2312 */ - case 2566: strncpy( buffer, "Big5-HKSCS", bufferLen-1 ); break; /* kCFStringEncodingBig5_HKSCS_1999 */ - case 2817: strncpy( buffer, "X-NEXTSTEP", bufferLen-1 ); break; /* kCFStringEncodingNextStepLatin */ - case 3074: strncpy( buffer, "cp037", bufferLen-1 ); break; /* kCFStringEncodingEBCDIC_CP037 */ - default: strncpy( buffer, "", bufferLen-1 ); break; /* Not listed */ - } -} - -#endif /* ifndef MACOSX */ - #else /* ifdef LINUX || SOLARIS || MACOSX || NETBSD */ /* @@ -1115,6 +693,7 @@ void macxp_ConvertCFEncodingToIANACharSetName( char *buffer, unsigned int buffer */ const _pair _full_locale_list[] = { + { "ja_JP.eucJP", RTL_TEXTENCODING_EUC_JP }, { "ja_JP.EUC", RTL_TEXTENCODING_EUC_JP }, { "ko_KR.EUC", RTL_TEXTENCODING_EUC_KR }, { "zh_CN.EUC", RTL_TEXTENCODING_EUC_CN }, @@ -1170,6 +749,7 @@ const _pair _iso_language_list[] = { { "fo", RTL_TEXTENCODING_ISO_8859_1 }, { "fr", RTL_TEXTENCODING_ISO_8859_1 }, { "gr", RTL_TEXTENCODING_ISO_8859_7 }, + { "he", RTL_TEXTENCODING_ISO_8859_8 }, { "hi", RTL_TEXTENCODING_DONTKNOW }, { "hr", RTL_TEXTENCODING_ISO_8859_2 }, { "hu", RTL_TEXTENCODING_ISO_8859_2 }, @@ -1267,7 +847,99 @@ rtl_TextEncoding osl_getTextEncodingFromLocale( rtl_Locale * pLocale ) return RTL_TEXTENCODING_DONTKNOW; } +#ifdef MACOSX +#include <premac.h> +#include <CoreFoundation/CoreFoundation.h> +#include <postmac.h> + +/* OS X locale discovery function from dylib */ +int (*pGetOSXLocale)( char *, sal_uInt32 ); +/*****************************************************************************/ +/* return the current process locale +/*****************************************************************************/ + +void _imp_getProcessLocale( rtl_Locale ** ppLocale ) +{ + static const char *locale = NULL; + + /* basic thread safeness */ +// pthread_mutex_lock( &aLocalMutex ); + + /* Only fetch the locale once and cache it */ + if ( NULL == locale ) + { + unsigned int isDarwin; + unsigned int majorVersion; + unsigned int minorVersion; + unsigned int minorMinorVersion; + + /* If running on OS X, attempt to fetch the locale using CoreServices calls. */ + macxp_getSystemVersion( &isDarwin, &majorVersion, &minorVersion, &minorMinorVersion ); + if( !isDarwin ) + { + /* Load the locale discovery library if we are running on OS X */ + const sal_Char *aLocaleLibName = "libsalextra_x11osx_mxp.dylib"; + const sal_Char *aGetOSXLocaleFunctionName = "macxp_getOSXLocale"; + oslModule pLocaleLib; + void *pFunc; + int err; + + pLocaleLib = osl_psz_loadModule( aLocaleLibName, SAL_LOADMODULE_DEFAULT ); + if( pLocaleLib ) + { + /* Grab a pointer to the locale function and call it */ + pFunc = osl_psz_getSymbol( pLocaleLib, aGetOSXLocaleFunctionName ); + if( pFunc ) + { + pGetOSXLocale = ( int(*)(char *, sal_uInt32) )( pFunc ); + locale = (char *)malloc( 20 ); + if ( locale ) + err = (*pGetOSXLocale)( locale, 20 ); + else + fprintf( stderr, "nlsupport.c: locale allocation returned NULL!\n" ); + } + else + fprintf( stderr, "Could not load the OS X locale discovery function! (%s)\n", aGetOSXLocaleFunctionName ); + } + else + fprintf( stderr, "Could not load the OS X locale discovery library! (%s)\n", aLocaleLibName ); + + /* Let go of the module, we don't need it anymore */ + osl_unloadModule( pLocaleLib ); + } + } + + /* handle the case where OS specific method of finding locale fails */ + if ( NULL == locale ) + { + /* simulate behavior of setlocale */ + locale = getenv( "LC_ALL" ); + if( NULL == locale ) + locale = getenv( "LC_CTYPE" ); + + if( NULL == locale ) + locale = getenv( "LANG" ); + + if( NULL == locale ) + locale = "C"; + } + + /* return the locale */ + *ppLocale = _parse_locale( locale ); + + setenv( "LC_ALL", locale, 1); + setenv("LC_CTYPE", locale, 1 ); + setenv("LANG", locale, 1 ); + +#ifdef DEBUG + fprintf( stderr, "nlsupport.c: _imp_getProcessLocale() returning %s as current locale.\n", locale ); +#endif + +// pthread_mutex_unlock( &aLocalMutex ); + +} +#else /*****************************************************************************/ /* return the current process locale /*****************************************************************************/ @@ -1288,6 +960,7 @@ void _imp_getProcessLocale( rtl_Locale ** ppLocale ) *ppLocale = _parse_locale( locale ); } +#endif /*****************************************************************************/ /* set the current process locale @@ -1309,7 +982,7 @@ int _imp_setProcessLocale( rtl_Locale * pLocale ) snprintf(env_buf, sizeof(env_buf), "LC_ALL=%s", locale_buf); env_buf[sizeof(env_buf)] = '\0'; putenv(env_buf); -#elif defined( FREEBSD ) || defined( NETBSD ) +#elif defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX ) setenv( "LC_ALL", locale_buf, 1); #else setenv( "LC_ALL", locale_buf ); @@ -1321,7 +994,7 @@ int _imp_setProcessLocale( rtl_Locale * pLocale ) snprintf(env_buf, sizeof(env_buf), "LC_CTYPE=%s", locale_buf); env_buf[sizeof(env_buf)] = '\0'; putenv(env_buf); -#elif defined( FREEBSD ) || defined( NETBSD ) +#elif defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX ) setenv("LC_CTYPE", locale_buf, 1 ); #else setenv( "LC_CTYPE", locale_buf ); @@ -1333,7 +1006,7 @@ int _imp_setProcessLocale( rtl_Locale * pLocale ) snprintf(env_buf, sizeof(env_buf), "LANG=%s", locale_buf); env_buf[sizeof(env_buf)] = '\0'; putenv(env_buf); -#elif defined( FREEBSD ) || defined( NETBSD ) +#elif defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX ) setenv("LC_CTYPE", locale_buf, 1 ); #else setenv( "LANG", locale_buf ); |