xref: /aoo42x/main/sal/osl/unx/nlsupport.c (revision d2b26721)
1647f063dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3647f063dSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4647f063dSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5647f063dSAndrew Rist  * distributed with this work for additional information
6647f063dSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7647f063dSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8647f063dSAndrew Rist  * "License"); you may not use this file except in compliance
9647f063dSAndrew Rist  * with the License.  You may obtain a copy of the License at
10647f063dSAndrew Rist  *
11647f063dSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12647f063dSAndrew Rist  *
13647f063dSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14647f063dSAndrew Rist  * software distributed under the License is distributed on an
15647f063dSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16647f063dSAndrew Rist  * KIND, either express or implied.  See the License for the
17647f063dSAndrew Rist  * specific language governing permissions and limitations
18647f063dSAndrew Rist  * under the License.
19647f063dSAndrew Rist  *
20647f063dSAndrew Rist  *************************************************************/
21647f063dSAndrew Rist 
22647f063dSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include <osl/nlsupport.h>
25cdf0e10cSrcweir #include <osl/diagnose.h>
26cdf0e10cSrcweir #include <osl/process.h>
27cdf0e10cSrcweir #include <rtl/memory.h>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #if defined(LINUX) || defined(SOLARIS) || defined(NETBSD) || defined(FREEBSD) || defined(MACOSX)
30cdf0e10cSrcweir #include <pthread.h>
31cdf0e10cSrcweir #ifndef MACOSX
32cdf0e10cSrcweir  #include <locale.h>
33cdf0e10cSrcweir  #include <langinfo.h>
34cdf0e10cSrcweir #else
35cdf0e10cSrcweir #include <osl/module.h>
36cdf0e10cSrcweir #include <osl/thread.h>
37cdf0e10cSrcweir #endif	/* !MACOSX */
38cdf0e10cSrcweir #endif	/* LINUX || SOLARIS || NETBSD || MACOSX */
39cdf0e10cSrcweir 
40cdf0e10cSrcweir #include <string.h>
41cdf0e10cSrcweir 
42cdf0e10cSrcweir /*****************************************************************************
43cdf0e10cSrcweir  typedefs
44cdf0e10cSrcweir  *****************************************************************************/
45cdf0e10cSrcweir 
46cdf0e10cSrcweir 
47cdf0e10cSrcweir typedef struct {
48cdf0e10cSrcweir     const char              *key;
49cdf0e10cSrcweir     const rtl_TextEncoding   value;
50cdf0e10cSrcweir } _pair;
51cdf0e10cSrcweir 
52cdf0e10cSrcweir 
53cdf0e10cSrcweir /*****************************************************************************
54cdf0e10cSrcweir  compare function for binary search
55cdf0e10cSrcweir  *****************************************************************************/
56cdf0e10cSrcweir 
57cdf0e10cSrcweir static int
_pair_compare(const char * key,const _pair * pair)58cdf0e10cSrcweir _pair_compare (const char *key, const _pair *pair)
59cdf0e10cSrcweir {
60cdf0e10cSrcweir     int result = rtl_str_compareIgnoreAsciiCase( key, pair->key );
61cdf0e10cSrcweir     return result;
62cdf0e10cSrcweir }
63cdf0e10cSrcweir 
64cdf0e10cSrcweir /*****************************************************************************
65cdf0e10cSrcweir  binary search on encoding tables
66cdf0e10cSrcweir  *****************************************************************************/
67cdf0e10cSrcweir 
68cdf0e10cSrcweir static const _pair*
_pair_search(const char * key,const _pair * base,unsigned int member)69cdf0e10cSrcweir _pair_search (const char *key, const _pair *base, unsigned int member )
70cdf0e10cSrcweir {
71cdf0e10cSrcweir     unsigned int lower = 0;
72cdf0e10cSrcweir     unsigned int upper = member;
73cdf0e10cSrcweir     unsigned int current;
74cdf0e10cSrcweir     int comparison;
75cdf0e10cSrcweir 
76cdf0e10cSrcweir     /* check for validity of input */
77cdf0e10cSrcweir     if ( (key == NULL) || (base == NULL) || (member == 0) )
78cdf0e10cSrcweir         return NULL;
79cdf0e10cSrcweir 
80cdf0e10cSrcweir     /* binary search */
81cdf0e10cSrcweir     while ( lower < upper )
82cdf0e10cSrcweir     {
83cdf0e10cSrcweir         current = (lower + upper) / 2;
84cdf0e10cSrcweir         comparison = _pair_compare( key, base + current );
85cdf0e10cSrcweir         if (comparison < 0)
86cdf0e10cSrcweir             upper = current;
87cdf0e10cSrcweir         else if (comparison > 0)
88cdf0e10cSrcweir             lower = current + 1;
89cdf0e10cSrcweir         else
90cdf0e10cSrcweir             return base + current;
91cdf0e10cSrcweir     }
92cdf0e10cSrcweir 
93cdf0e10cSrcweir     return NULL;
94cdf0e10cSrcweir }
95cdf0e10cSrcweir 
96cdf0e10cSrcweir 
97cdf0e10cSrcweir /*****************************************************************************
98cdf0e10cSrcweir  convert rtl_Locale to locale string
99cdf0e10cSrcweir  *****************************************************************************/
100cdf0e10cSrcweir 
_compose_locale(rtl_Locale * pLocale,char * buffer,size_t n)101cdf0e10cSrcweir static char * _compose_locale( rtl_Locale * pLocale, char * buffer, size_t n )
102cdf0e10cSrcweir {
103cdf0e10cSrcweir     /* check if a valid locale is specified */
104cdf0e10cSrcweir     if( pLocale && pLocale->Language &&
105cdf0e10cSrcweir             (pLocale->Language->length == 2 || pLocale->Language->length == 3) )
106cdf0e10cSrcweir     {
107cdf0e10cSrcweir         size_t offset = 0;
108cdf0e10cSrcweir 
109cdf0e10cSrcweir         /* convert language code to ascii */
110cdf0e10cSrcweir         {
111cdf0e10cSrcweir             rtl_String *pLanguage = NULL;
112cdf0e10cSrcweir 
113cdf0e10cSrcweir             rtl_uString2String( &pLanguage,
114cdf0e10cSrcweir                 pLocale->Language->buffer, pLocale->Language->length,
115cdf0e10cSrcweir                 RTL_TEXTENCODING_ASCII_US, OUSTRING_TO_OSTRING_CVTFLAGS );
116cdf0e10cSrcweir 
117cdf0e10cSrcweir             if( SAL_INT_CAST(sal_uInt32, pLanguage->length) < n )
118cdf0e10cSrcweir             {
119cdf0e10cSrcweir                 strcpy( buffer, pLanguage->buffer );
120cdf0e10cSrcweir                 offset = pLanguage->length;
121cdf0e10cSrcweir             }
122cdf0e10cSrcweir 
123cdf0e10cSrcweir             rtl_string_release( pLanguage );
124cdf0e10cSrcweir         }
125cdf0e10cSrcweir 
126cdf0e10cSrcweir         /* convert country code to ascii */
127cdf0e10cSrcweir         if( pLocale->Country && (pLocale->Country->length == 2) )
128cdf0e10cSrcweir         {
129cdf0e10cSrcweir             rtl_String *pCountry = NULL;
130cdf0e10cSrcweir 
131cdf0e10cSrcweir             rtl_uString2String( &pCountry,
132cdf0e10cSrcweir                 pLocale->Country->buffer, pLocale->Country->length,
133cdf0e10cSrcweir                 RTL_TEXTENCODING_ASCII_US, OUSTRING_TO_OSTRING_CVTFLAGS );
134cdf0e10cSrcweir 
135cdf0e10cSrcweir             if( offset + pCountry->length + 1 < n )
136cdf0e10cSrcweir             {
137cdf0e10cSrcweir                 strcpy( buffer + offset++, "_" );
138cdf0e10cSrcweir                 strcpy( buffer + offset, pCountry->buffer );
139cdf0e10cSrcweir                 offset += pCountry->length;
140cdf0e10cSrcweir             }
141cdf0e10cSrcweir 
142cdf0e10cSrcweir             rtl_string_release( pCountry );
143cdf0e10cSrcweir         }
144cdf0e10cSrcweir 
145cdf0e10cSrcweir         /* convert variant to ascii - check if there is enough space for the variant string */
146cdf0e10cSrcweir         if( pLocale->Variant && pLocale->Variant->length &&
147cdf0e10cSrcweir             ( SAL_INT_CAST(sal_uInt32, pLocale->Variant->length) < n - 6 ) )
148cdf0e10cSrcweir         {
149cdf0e10cSrcweir             rtl_String *pVariant = NULL;
150cdf0e10cSrcweir 
151cdf0e10cSrcweir             rtl_uString2String( &pVariant,
152cdf0e10cSrcweir                 pLocale->Variant->buffer, pLocale->Variant->length,
153cdf0e10cSrcweir                 RTL_TEXTENCODING_ASCII_US, OUSTRING_TO_OSTRING_CVTFLAGS );
154cdf0e10cSrcweir 
155cdf0e10cSrcweir             if( offset + pVariant->length + 1 < n )
156cdf0e10cSrcweir             {
157cdf0e10cSrcweir                 strcpy( buffer + offset, pVariant->buffer );
158cdf0e10cSrcweir                 offset += pVariant->length;
159cdf0e10cSrcweir             }
160cdf0e10cSrcweir 
161cdf0e10cSrcweir             rtl_string_release( pVariant );
162cdf0e10cSrcweir         }
163cdf0e10cSrcweir 
164cdf0e10cSrcweir         return buffer;
165cdf0e10cSrcweir     }
166cdf0e10cSrcweir 
167cdf0e10cSrcweir     return NULL;
168cdf0e10cSrcweir }
169cdf0e10cSrcweir 
170cdf0e10cSrcweir /*****************************************************************************
171cdf0e10cSrcweir  convert locale string to rtl_Locale
172cdf0e10cSrcweir  *****************************************************************************/
173cdf0e10cSrcweir 
_parse_locale(const char * locale)174cdf0e10cSrcweir static rtl_Locale * _parse_locale( const char * locale )
175cdf0e10cSrcweir {
176cdf0e10cSrcweir     static sal_Unicode c_locale[2] = { (sal_Unicode) 'C', 0 };
177cdf0e10cSrcweir 
178cdf0e10cSrcweir     /* check if locale contains a valid string */
179cdf0e10cSrcweir     if( locale )
180cdf0e10cSrcweir     {
181cdf0e10cSrcweir         size_t len = strlen( locale );
182cdf0e10cSrcweir 
183cdf0e10cSrcweir         if( len >= 2 )
184cdf0e10cSrcweir         {
185cdf0e10cSrcweir             rtl_uString * pLanguage = NULL;
186cdf0e10cSrcweir             rtl_uString * pCountry  = NULL;
187cdf0e10cSrcweir             rtl_uString * pVariant  = NULL;
188cdf0e10cSrcweir 
189cdf0e10cSrcweir             size_t offset = 2;
190cdf0e10cSrcweir 
191cdf0e10cSrcweir             rtl_Locale * ret;
192cdf0e10cSrcweir 
193cdf0e10cSrcweir             /* language is a two or three letter code */
194cdf0e10cSrcweir             if( (len > 3 && '_' == locale[3]) || (len == 3 && '_' != locale[2]) )
195cdf0e10cSrcweir                 offset = 3;
196cdf0e10cSrcweir 
197cdf0e10cSrcweir             /* convert language code to unicode */
198cdf0e10cSrcweir             rtl_string2UString( &pLanguage, locale, offset, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS );
199cdf0e10cSrcweir             OSL_ASSERT(pLanguage != NULL);
200cdf0e10cSrcweir 
201cdf0e10cSrcweir             /* convert country code to unicode */
202cdf0e10cSrcweir             if( len >= offset+3 && '_' == locale[offset] )
203cdf0e10cSrcweir             {
204cdf0e10cSrcweir                 rtl_string2UString( &pCountry, locale + offset + 1, 2, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS );
205cdf0e10cSrcweir                 OSL_ASSERT(pCountry != NULL);
206cdf0e10cSrcweir                 offset += 3;
207cdf0e10cSrcweir             }
208cdf0e10cSrcweir 
209cdf0e10cSrcweir             /* convert variant code to unicode - do not rely on "." as delimiter */
210cdf0e10cSrcweir             if( len > offset ) {
211cdf0e10cSrcweir                 rtl_string2UString( &pVariant, locale + offset, len - offset, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS );
212cdf0e10cSrcweir                 OSL_ASSERT(pVariant != NULL);
213cdf0e10cSrcweir             }
214cdf0e10cSrcweir 
215cdf0e10cSrcweir             ret =  rtl_locale_register( pLanguage->buffer, pCountry ? pCountry->buffer : c_locale + 1, pVariant ? pVariant->buffer : c_locale + 1 );
216cdf0e10cSrcweir 
217cdf0e10cSrcweir             if (pVariant) rtl_uString_release(pVariant);
218cdf0e10cSrcweir             if (pCountry) rtl_uString_release(pCountry);
219cdf0e10cSrcweir             if (pLanguage) rtl_uString_release(pLanguage);
220cdf0e10cSrcweir 
221cdf0e10cSrcweir 			return ret;
222cdf0e10cSrcweir         }
223cdf0e10cSrcweir         else
224cdf0e10cSrcweir             return rtl_locale_register( c_locale, c_locale + 1, c_locale + 1 );
225cdf0e10cSrcweir     }
226cdf0e10cSrcweir 
227cdf0e10cSrcweir     return NULL;
228cdf0e10cSrcweir }
229cdf0e10cSrcweir 
230cdf0e10cSrcweir #if defined(LINUX) || defined(SOLARIS) || defined(NETBSD) || defined(FREEBSD)
231cdf0e10cSrcweir 
232cdf0e10cSrcweir /*
233cdf0e10cSrcweir  * This implementation of osl_getTextEncodingFromLocale maps
234cdf0e10cSrcweir  * from nl_langinfo(CODESET) to rtl_textencoding defines.
235cdf0e10cSrcweir  * nl_langinfo() is supported only on Linux, Solaris,
236cdf0e10cSrcweir  * >= NetBSD 1.6 and >= FreeBSD 4.4
237cdf0e10cSrcweir  *
238cdf0e10cSrcweir  * This routine is SLOW because of the setlocale call, so
239cdf0e10cSrcweir  * grab the result and cache it.
240cdf0e10cSrcweir  *
241cdf0e10cSrcweir  * XXX this code has the usual mt problems aligned with setlocale() XXX
242cdf0e10cSrcweir  */
243cdf0e10cSrcweir 
244cdf0e10cSrcweir #ifdef LINUX
245cdf0e10cSrcweir #if !defined(CODESET)
246cdf0e10cSrcweir #define CODESET _NL_CTYPE_CODESET_NAME
247cdf0e10cSrcweir #endif
248cdf0e10cSrcweir #endif
249cdf0e10cSrcweir 
250cdf0e10cSrcweir /*
251cdf0e10cSrcweir  * _nl_language_list[] is an array list of supported encodings. Because
252cdf0e10cSrcweir  * we are using a binary search, the list has to be in ascending order.
253*d2b26721Smseidel  * We are comparing the encodings case insensitive, so the list has
254*d2b26721Smseidel  * to be completely upper- , or lowercase.
255cdf0e10cSrcweir  */
256cdf0e10cSrcweir 
257cdf0e10cSrcweir #if defined(SOLARIS)
258cdf0e10cSrcweir 
259cdf0e10cSrcweir /* The values in the below list can be obtained with a script like
260cdf0e10cSrcweir  *  #!/bin/sh
261cdf0e10cSrcweir  *  for i in `locale -a`; do
262cdf0e10cSrcweir  *    LC_ALL=$i locale -k code_set_name
263cdf0e10cSrcweir  *  done
264cdf0e10cSrcweir  */
265cdf0e10cSrcweir const _pair _nl_language_list[] = {
266cdf0e10cSrcweir     { "5601",           RTL_TEXTENCODING_EUC_KR         }, /* ko_KR.EUC */
267cdf0e10cSrcweir     { "646",            RTL_TEXTENCODING_ISO_8859_1     }, /* fake: ASCII_US */
268cdf0e10cSrcweir     { "ANSI-1251",      RTL_TEXTENCODING_MS_1251        }, /* ru_RU.ANSI1251 */
269cdf0e10cSrcweir     { "BIG5",           RTL_TEXTENCODING_BIG5           }, /* zh_CN.BIG5 */
270cdf0e10cSrcweir     { "BIG5-HKSCS",     RTL_TEXTENCODING_BIG5_HKSCS     }, /* zh_CN.BIG5HK */
271cdf0e10cSrcweir     { "CNS11643",       RTL_TEXTENCODING_EUC_TW         }, /* zh_TW.EUC */
272cdf0e10cSrcweir     { "EUCJP",          RTL_TEXTENCODING_EUC_JP         }, /* ja_JP.eucjp */
273cdf0e10cSrcweir     { "GB18030",        RTL_TEXTENCODING_GB_18030       }, /* zh_CN.GB18030 */
274cdf0e10cSrcweir     { "GB2312",         RTL_TEXTENCODING_GB_2312        }, /* zh_CN */
275cdf0e10cSrcweir     { "GBK",            RTL_TEXTENCODING_GBK            }, /* zh_CN.GBK */
276cdf0e10cSrcweir     { "ISO8859-1",      RTL_TEXTENCODING_ISO_8859_1     },
277cdf0e10cSrcweir     { "ISO8859-10",     RTL_TEXTENCODING_ISO_8859_10    },
278cdf0e10cSrcweir     { "ISO8859-13",     RTL_TEXTENCODING_ISO_8859_13    }, /* lt_LT lv_LV */
279cdf0e10cSrcweir     { "ISO8859-14",     RTL_TEXTENCODING_ISO_8859_14    },
280cdf0e10cSrcweir     { "ISO8859-15",     RTL_TEXTENCODING_ISO_8859_15    },
281cdf0e10cSrcweir     { "ISO8859-2",      RTL_TEXTENCODING_ISO_8859_2     },
282cdf0e10cSrcweir     { "ISO8859-3",      RTL_TEXTENCODING_ISO_8859_3     },
283cdf0e10cSrcweir     { "ISO8859-4",      RTL_TEXTENCODING_ISO_8859_4     },
284cdf0e10cSrcweir     { "ISO8859-5",      RTL_TEXTENCODING_ISO_8859_5     },
285cdf0e10cSrcweir     { "ISO8859-6",      RTL_TEXTENCODING_ISO_8859_6     },
286cdf0e10cSrcweir     { "ISO8859-7",      RTL_TEXTENCODING_ISO_8859_7     },
287cdf0e10cSrcweir     { "ISO8859-8",      RTL_TEXTENCODING_ISO_8859_8     },
288cdf0e10cSrcweir     { "ISO8859-9",      RTL_TEXTENCODING_ISO_8859_9     },
289cdf0e10cSrcweir     { "KOI8-R",         RTL_TEXTENCODING_KOI8_R         },
290cdf0e10cSrcweir     { "KOI8-U",         RTL_TEXTENCODING_KOI8_U         },
291cdf0e10cSrcweir     { "PCK",            RTL_TEXTENCODING_MS_932         },
292cdf0e10cSrcweir     { "SUN_EU_GREEK",   RTL_TEXTENCODING_ISO_8859_7     }, /* 8859-7 + Euro */
293cdf0e10cSrcweir     { "TIS620.2533",    RTL_TEXTENCODING_MS_874         }, /* th_TH.TIS620 */
294cdf0e10cSrcweir     { "UTF-8",          RTL_TEXTENCODING_UTF8           }
295cdf0e10cSrcweir };
296cdf0e10cSrcweir 
297cdf0e10cSrcweir /* XXX MS-874 is an extension to tis620, so this is not
298cdf0e10cSrcweir  * really equivalent */
299cdf0e10cSrcweir 
300cdf0e10cSrcweir #elif defined(LINUX) || defined(NETBSD)
301cdf0e10cSrcweir 
302cdf0e10cSrcweir const _pair _nl_language_list[] = {
303cdf0e10cSrcweir     { "ANSI_X3.110-1983",           RTL_TEXTENCODING_DONTKNOW   },  /* ISO-IR-99 NAPLPS */
304cdf0e10cSrcweir     { "ANSI_X3.4-1968",             RTL_TEXTENCODING_ISO_8859_1 },  /* fake: ASCII_US */
305cdf0e10cSrcweir     { "ASMO_449",                   RTL_TEXTENCODING_DONTKNOW },    /* ISO_9036 ARABIC7 */
306cdf0e10cSrcweir     { "BALTIC",                     RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-179 */
307cdf0e10cSrcweir     { "BIG5",                       RTL_TEXTENCODING_BIG5 },        /* locale: zh_TW */
308cdf0e10cSrcweir     { "BIG5-HKSCS",                 RTL_TEXTENCODING_BIG5_HKSCS },  /* locale: zh_CN.BIG5HK */
309cdf0e10cSrcweir     { "BIG5HKSCS",                  RTL_TEXTENCODING_BIG5_HKSCS },  /* depricated */
310cdf0e10cSrcweir     { "BS_4730",                    RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-4 ISO646-GB */
311cdf0e10cSrcweir     { "BS_VIEWDATA",                RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-47 */
312cdf0e10cSrcweir     { "CP1250",                     RTL_TEXTENCODING_MS_1250 },     /* MS-EE */
313cdf0e10cSrcweir     { "CP1251",                     RTL_TEXTENCODING_MS_1251 },     /* MS-CYRL */
314cdf0e10cSrcweir     { "CP1252",                     RTL_TEXTENCODING_MS_1252 },     /* MS-ANSI */
315cdf0e10cSrcweir     { "CP1253",                     RTL_TEXTENCODING_MS_1253 },     /* MS-GREEK */
316cdf0e10cSrcweir     { "CP1254",                     RTL_TEXTENCODING_MS_1254 },     /* MS-TURK */
317cdf0e10cSrcweir     { "CP1255",                     RTL_TEXTENCODING_MS_1255 },     /* MS-HEBR */
318cdf0e10cSrcweir     { "CP1256",                     RTL_TEXTENCODING_MS_1256 },     /* MS-ARAB */
319cdf0e10cSrcweir     { "CP1257",                     RTL_TEXTENCODING_MS_1257 },     /* WINBALTRIM */
320cdf0e10cSrcweir     { "CSA_Z243.4-1985-1",          RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-121 */
321cdf0e10cSrcweir     { "CSA_Z243.4-1985-2",          RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-122 CSA7-2 */
322cdf0e10cSrcweir     { "CSA_Z243.4-1985-GR",         RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-123 */
323cdf0e10cSrcweir     { "CSN_369103",                 RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-139 */
324cdf0e10cSrcweir     { "CWI",                        RTL_TEXTENCODING_DONTKNOW },    /* CWI-2 CP-HU */
325cdf0e10cSrcweir     { "DEC-MCS",                    RTL_TEXTENCODING_DONTKNOW },    /* DEC */
326cdf0e10cSrcweir     { "DIN_66003",                  RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-21 */
327cdf0e10cSrcweir     { "DS_2089",                    RTL_TEXTENCODING_DONTKNOW },    /* DS2089 ISO646-DK */
328cdf0e10cSrcweir     { "EBCDIC-AT-DE",               RTL_TEXTENCODING_DONTKNOW },
329cdf0e10cSrcweir     { "EBCDIC-AT-DE-A",             RTL_TEXTENCODING_DONTKNOW },
330cdf0e10cSrcweir     { "EBCDIC-CA-FR",               RTL_TEXTENCODING_DONTKNOW },
331cdf0e10cSrcweir     { "EBCDIC-DK-NO",               RTL_TEXTENCODING_DONTKNOW },
332cdf0e10cSrcweir     { "EBCDIC-DK-NO-A",             RTL_TEXTENCODING_DONTKNOW },
333cdf0e10cSrcweir     { "EBCDIC-ES",                  RTL_TEXTENCODING_DONTKNOW },
334cdf0e10cSrcweir     { "EBCDIC-ES-A",                RTL_TEXTENCODING_DONTKNOW },
335cdf0e10cSrcweir     { "EBCDIC-ES-S",                RTL_TEXTENCODING_DONTKNOW },
336cdf0e10cSrcweir     { "EBCDIC-FI-SE",               RTL_TEXTENCODING_DONTKNOW },
337cdf0e10cSrcweir     { "EBCDIC-FI-SE-A",             RTL_TEXTENCODING_DONTKNOW },
338cdf0e10cSrcweir     { "EBCDIC-FR",                  RTL_TEXTENCODING_DONTKNOW },
339cdf0e10cSrcweir     { "EBCDIC-IS-FRISS",            RTL_TEXTENCODING_DONTKNOW },    /*  FRISS */
340cdf0e10cSrcweir     { "EBCDIC-IT",                  RTL_TEXTENCODING_DONTKNOW },
341cdf0e10cSrcweir     { "EBCDIC-PT",                  RTL_TEXTENCODING_DONTKNOW },
342cdf0e10cSrcweir     { "EBCDIC-UK",                  RTL_TEXTENCODING_DONTKNOW },
343cdf0e10cSrcweir     { "EBCDIC-US",                  RTL_TEXTENCODING_DONTKNOW },
344cdf0e10cSrcweir     { "ECMA-CYRILLIC",              RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-111 */
345cdf0e10cSrcweir     { "ES",                         RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-17 */
346cdf0e10cSrcweir     { "ES2",                        RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-85 */
347cdf0e10cSrcweir     { "EUC-JP",                     RTL_TEXTENCODING_EUC_JP },      /* locale: ja_JP.eucjp */
348cdf0e10cSrcweir     { "EUC-KR",                     RTL_TEXTENCODING_EUC_KR },      /* locale: ko_KR.euckr */
349cdf0e10cSrcweir     { "EUC-TW",                     RTL_TEXTENCODING_EUC_TW },      /* locale: zh_TW.euctw */
350cdf0e10cSrcweir     { "GB18030",                    RTL_TEXTENCODING_GB_18030 },    /* locale: zh_CN.gb18030 */
351cdf0e10cSrcweir     { "GB2312",                     RTL_TEXTENCODING_GB_2312 },     /* locale: zh_CN */
352cdf0e10cSrcweir     { "GB_1988-80",                 RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-57 */
353cdf0e10cSrcweir     { "GBK",                        RTL_TEXTENCODING_GBK },         /* locale: zh_CN.GBK */
354cdf0e10cSrcweir     { "GOST_19768-74",              RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-153 */
355cdf0e10cSrcweir     { "GREEK-CCITT",                RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-150 */
356cdf0e10cSrcweir     { "GREEK7",                     RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-88 */
357cdf0e10cSrcweir     { "GREEK7-OLD",                 RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-18 */
358cdf0e10cSrcweir     { "HP-ROMAN8",                  RTL_TEXTENCODING_DONTKNOW },    /* ROMAN8 R8 */
359cdf0e10cSrcweir     { "IBM037",                     RTL_TEXTENCODING_DONTKNOW },    /* EBCDIC-[US|CA|WT] */
360cdf0e10cSrcweir     { "IBM038",                     RTL_TEXTENCODING_DONTKNOW },    /* EBCDIC-INT CP038 */
361cdf0e10cSrcweir     { "IBM1004",                    RTL_TEXTENCODING_DONTKNOW },    /* CP1004 OS2LATIN1 */
362cdf0e10cSrcweir     { "IBM1026",                    RTL_TEXTENCODING_DONTKNOW },    /* CP1026 1026 */
363cdf0e10cSrcweir     { "IBM1047",                    RTL_TEXTENCODING_DONTKNOW },    /* CP1047 1047 */
364cdf0e10cSrcweir     { "IBM256",                     RTL_TEXTENCODING_DONTKNOW },    /* EBCDIC-INT1 */
365cdf0e10cSrcweir     { "IBM273",                     RTL_TEXTENCODING_DONTKNOW },    /* CP273 */
366cdf0e10cSrcweir     { "IBM274",                     RTL_TEXTENCODING_DONTKNOW },    /* EBCDIC-BE CP274 */
367cdf0e10cSrcweir     { "IBM275",                     RTL_TEXTENCODING_DONTKNOW },    /* EBCDIC-BR CP275 */
368cdf0e10cSrcweir     { "IBM277",                     RTL_TEXTENCODING_DONTKNOW },    /* EBCDIC-CP-[DK|NO] */
369cdf0e10cSrcweir     { "IBM278",                     RTL_TEXTENCODING_DONTKNOW },    /* EBCDIC-CP-[FISE]*/
370cdf0e10cSrcweir     { "IBM280",                     RTL_TEXTENCODING_DONTKNOW },    /* CP280 EBCDIC-CP-IT*/
371cdf0e10cSrcweir     { "IBM281",                     RTL_TEXTENCODING_DONTKNOW },    /* EBCDIC-JP-E CP281 */
372cdf0e10cSrcweir     { "IBM284",                     RTL_TEXTENCODING_DONTKNOW },    /* CP284 EBCDIC-CP-ES */
373cdf0e10cSrcweir     { "IBM285",                     RTL_TEXTENCODING_DONTKNOW },    /* CP285 EBCDIC-CP-GB */
374cdf0e10cSrcweir     { "IBM290",                     RTL_TEXTENCODING_DONTKNOW },    /* EBCDIC-JP-KANA */
375cdf0e10cSrcweir     { "IBM297",                     RTL_TEXTENCODING_DONTKNOW },    /* EBCDIC-CP-FR */
376cdf0e10cSrcweir     { "IBM420",                     RTL_TEXTENCODING_DONTKNOW },    /* EBCDIC-CP-AR1 */
377cdf0e10cSrcweir     { "IBM423",                     RTL_TEXTENCODING_DONTKNOW },    /* CP423 EBCDIC-CP-GR */
378cdf0e10cSrcweir     { "IBM424",                     RTL_TEXTENCODING_DONTKNOW },    /* CP424 EBCDIC-CP-HE */
379cdf0e10cSrcweir     { "IBM437",                     RTL_TEXTENCODING_IBM_437 },     /* CP437 437 */
380cdf0e10cSrcweir     { "IBM500",                     RTL_TEXTENCODING_DONTKNOW },    /* EBCDIC-CP-[BE|CH] */
381cdf0e10cSrcweir     { "IBM850",                     RTL_TEXTENCODING_IBM_850 },     /* CP850 850 */
382cdf0e10cSrcweir     { "IBM851",                     RTL_TEXTENCODING_DONTKNOW },    /* CP851 851 */
383cdf0e10cSrcweir     { "IBM852",                     RTL_TEXTENCODING_IBM_852 },     /* CP852 852 */
384cdf0e10cSrcweir     { "IBM855",                     RTL_TEXTENCODING_IBM_855 },     /* CP855 855 */
385cdf0e10cSrcweir     { "IBM857",                     RTL_TEXTENCODING_IBM_857 },     /* CP857 857 */
386cdf0e10cSrcweir     { "IBM860",                     RTL_TEXTENCODING_IBM_860 },     /* CP860 860 */
387cdf0e10cSrcweir     { "IBM861",                     RTL_TEXTENCODING_IBM_861 },     /* CP861 861 CP-IS */
388cdf0e10cSrcweir     { "IBM862",                     RTL_TEXTENCODING_IBM_862 },     /* CP862 862 */
389cdf0e10cSrcweir     { "IBM863",                     RTL_TEXTENCODING_IBM_863 },     /* CP863 863 */
390cdf0e10cSrcweir     { "IBM864",                     RTL_TEXTENCODING_IBM_864 },     /* CP864 */
391cdf0e10cSrcweir     { "IBM865",                     RTL_TEXTENCODING_IBM_865 },     /* CP865 865 */
392cdf0e10cSrcweir     { "IBM866",                     RTL_TEXTENCODING_IBM_866 },     /* CP866 866 */
393cdf0e10cSrcweir     { "IBM868",                     RTL_TEXTENCODING_DONTKNOW },    /* CP868 CP-AR */
394cdf0e10cSrcweir     { "IBM869",                     RTL_TEXTENCODING_IBM_869 },     /* CP869 869 CP-GR */
395cdf0e10cSrcweir     { "IBM870",                     RTL_TEXTENCODING_DONTKNOW },    /* EBCDIC-[ROECE|YU] */
396cdf0e10cSrcweir     { "IBM871",                     RTL_TEXTENCODING_DONTKNOW },    /* CP871 EBCDIC-CP-IS */
397cdf0e10cSrcweir     { "IBM875",                     RTL_TEXTENCODING_DONTKNOW },    /* CP875 EBCDIC-GREEK */
398cdf0e10cSrcweir     { "IBM880",                     RTL_TEXTENCODING_DONTKNOW },    /* EBCDIC-CYRILLIC */
399cdf0e10cSrcweir     { "IBM891",                     RTL_TEXTENCODING_DONTKNOW },    /* CP891 */
400cdf0e10cSrcweir     { "IBM903",                     RTL_TEXTENCODING_DONTKNOW },    /* CP903 */
401cdf0e10cSrcweir     { "IBM904",                     RTL_TEXTENCODING_DONTKNOW },    /* CP904 904 */
402cdf0e10cSrcweir     { "IBM905",                     RTL_TEXTENCODING_DONTKNOW },    /* CP905 EBCDIC-CP-TR */
403cdf0e10cSrcweir     { "IBM918",                     RTL_TEXTENCODING_DONTKNOW },    /* CP918 EBCDIC-AR2 */
404cdf0e10cSrcweir     { "IEC_P27-1",                  RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-143 */
405cdf0e10cSrcweir     { "INIS",                       RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-49 */
406cdf0e10cSrcweir     { "INIS-8",                     RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-50 */
407cdf0e10cSrcweir     { "INIS-CYRILLIC",              RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-51 */
408cdf0e10cSrcweir     { "INVARIANT",                  RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-170 */
409cdf0e10cSrcweir     { "ISO-8859-1",                 RTL_TEXTENCODING_ISO_8859_1 },  /* ISO-IR-100 CP819 */
410cdf0e10cSrcweir     { "ISO-8859-10",                RTL_TEXTENCODING_ISO_8859_10 }, /* ISO-IR-157 LATIN6 */
411cdf0e10cSrcweir     { "ISO-8859-13",                RTL_TEXTENCODING_ISO_8859_13 }, /* ISO-IR-179 LATIN7 */
412cdf0e10cSrcweir     { "ISO-8859-14",                RTL_TEXTENCODING_ISO_8859_14 }, /* LATIN8 L8 */
413cdf0e10cSrcweir     { "ISO-8859-15",                RTL_TEXTENCODING_ISO_8859_15 },
414cdf0e10cSrcweir     { "ISO-8859-2",                 RTL_TEXTENCODING_ISO_8859_2 },  /* LATIN2 L2 */
415cdf0e10cSrcweir     { "ISO-8859-3",                 RTL_TEXTENCODING_ISO_8859_3 },  /* LATIN3 L3 */
416cdf0e10cSrcweir     { "ISO-8859-4",                 RTL_TEXTENCODING_ISO_8859_4 },  /* LATIN4 L4 */
417cdf0e10cSrcweir     { "ISO-8859-5",                 RTL_TEXTENCODING_ISO_8859_5 },  /* CYRILLIC */
418cdf0e10cSrcweir     { "ISO-8859-6",                 RTL_TEXTENCODING_ISO_8859_6 },  /* ECMA-114 ARABIC */
419cdf0e10cSrcweir     { "ISO-8859-7",                 RTL_TEXTENCODING_ISO_8859_7 },  /* ECMA-118 GREEK8 */
420cdf0e10cSrcweir     { "ISO-8859-8",                 RTL_TEXTENCODING_ISO_8859_8 },  /* ISO_8859-8 HEBREW */
421cdf0e10cSrcweir     { "ISO-8859-9",                 RTL_TEXTENCODING_ISO_8859_9 },  /* ISO_8859-9 LATIN5 */
422cdf0e10cSrcweir     { "ISO-IR-90",                  RTL_TEXTENCODING_DONTKNOW },    /* ISO_6937-2:1983 */
423cdf0e10cSrcweir     { "ISO_10367-BOX",              RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-155 */
424cdf0e10cSrcweir     { "ISO_2033-1983",              RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-98 E13B */
425cdf0e10cSrcweir     { "ISO_5427",                   RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-37 KOI-7 */
426cdf0e10cSrcweir     { "ISO_5427-EXT",               RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-54  */
427cdf0e10cSrcweir     { "ISO_5428",                   RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-55 */
428cdf0e10cSrcweir     { "ISO_646.BASIC",              RTL_TEXTENCODING_ASCII_US },    /* REF */
429cdf0e10cSrcweir     { "ISO_646.IRV",                RTL_TEXTENCODING_ASCII_US },    /* ISO-IR-2 IRV */
430cdf0e10cSrcweir     { "ISO_646.IRV:1983",           RTL_TEXTENCODING_ISO_8859_1 },  /* fake: ASCII_US, used for "C" locale*/
431cdf0e10cSrcweir     { "ISO_6937",                   RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-156 ISO6937*/
432cdf0e10cSrcweir     { "ISO_6937-2-25",              RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-152 */
433cdf0e10cSrcweir     { "ISO_6937-2-ADD",             RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-142 */
434cdf0e10cSrcweir     { "ISO_8859-SUPP",              RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-154 */
435cdf0e10cSrcweir     { "IT",                         RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-15  */
436cdf0e10cSrcweir     { "JIS_C6220-1969-JP",          RTL_TEXTENCODING_DONTKNOW },    /* KATAKANA X0201-7 */
437cdf0e10cSrcweir     { "JIS_C6220-1969-RO",          RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-14 */
438cdf0e10cSrcweir     { "JIS_C6229-1984-A",           RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-91 */
439cdf0e10cSrcweir     { "JIS_C6229-1984-B",           RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-92 */
440cdf0e10cSrcweir     { "JIS_C6229-1984-B-ADD",       RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-93 */
441cdf0e10cSrcweir     { "JIS_C6229-1984-HAND",        RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-94 */
442cdf0e10cSrcweir     { "JIS_C6229-1984-HAND-ADD",    RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-95 */
443cdf0e10cSrcweir     { "JIS_C6229-1984-KANA",        RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-96 */
444cdf0e10cSrcweir     { "JIS_X0201",                  RTL_TEXTENCODING_DONTKNOW },    /* X0201 */
445cdf0e10cSrcweir     { "JUS_I.B1.002",               RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-141 */
446cdf0e10cSrcweir     { "JUS_I.B1.003-MAC",           RTL_TEXTENCODING_DONTKNOW },    /* MACEDONIAN */
447cdf0e10cSrcweir     { "JUS_I.B1.003-SERB",          RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-146 SERBIAN */
448cdf0e10cSrcweir     { "KOI-8",                      RTL_TEXTENCODING_DONTKNOW },
449cdf0e10cSrcweir     { "KOI8-R",                     RTL_TEXTENCODING_KOI8_R },
450cdf0e10cSrcweir     { "KOI8-U",                     RTL_TEXTENCODING_KOI8_U },
451cdf0e10cSrcweir     { "KSC5636",                    RTL_TEXTENCODING_DONTKNOW },    /* ISO646-KR */
452cdf0e10cSrcweir     { "LATIN-GREEK",                RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-19 */
453cdf0e10cSrcweir     { "LATIN-GREEK-1",              RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-27 */
454cdf0e10cSrcweir     { "MAC-IS",                     RTL_TEXTENCODING_APPLE_ROMAN },
455cdf0e10cSrcweir     { "MAC-UK",                     RTL_TEXTENCODING_APPLE_ROMAN },
456cdf0e10cSrcweir     { "MACINTOSH",                  RTL_TEXTENCODING_APPLE_ROMAN }, /* MAC */
457cdf0e10cSrcweir     { "MSZ_7795.3",                 RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-86 */
458cdf0e10cSrcweir     { "NATS-DANO",                  RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-9-1 */
459cdf0e10cSrcweir     { "NATS-DANO-ADD",              RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-9-2 */
460cdf0e10cSrcweir     { "NATS-SEFI",                  RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-8-1 */
461cdf0e10cSrcweir     { "NATS-SEFI-ADD",              RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-8-2 */
462cdf0e10cSrcweir     { "NC_NC00-10",                 RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-151 */
463cdf0e10cSrcweir     { "NEXTSTEP",                   RTL_TEXTENCODING_DONTKNOW },    /* NEXT */
464cdf0e10cSrcweir     { "NF_Z_62-010",                RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-69 */
465cdf0e10cSrcweir     { "NF_Z_62-010_(1973)",         RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-25 */
466cdf0e10cSrcweir     { "NS_4551-1",                  RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-60 */
467cdf0e10cSrcweir     { "NS_4551-2",                  RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-61 */
468cdf0e10cSrcweir     { "PT",                         RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-16 */
469cdf0e10cSrcweir     { "PT2",                        RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-84 */
470cdf0e10cSrcweir     { "SAMI",                       RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-158 */
471cdf0e10cSrcweir     { "SEN_850200_B",               RTL_TEXTENCODING_DONTKNOW },    /* ISO646-[FI|SE] */
472cdf0e10cSrcweir     { "SEN_850200_C",               RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-11 */
473cdf0e10cSrcweir     { "T.101-G2",                   RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-128 */
474cdf0e10cSrcweir     { "T.61-7BIT",                  RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-102 */
475cdf0e10cSrcweir     { "T.61-8BIT",                  RTL_TEXTENCODING_DONTKNOW },    /* T.61 ISO-IR-103 */
476cdf0e10cSrcweir     { "TIS-620",                    RTL_TEXTENCODING_MS_874 },     /* locale: th_TH */
477cdf0e10cSrcweir     { "UTF-8",                      RTL_TEXTENCODING_UTF8 },        /* ISO-10646/UTF-8 */
478cdf0e10cSrcweir     { "VIDEOTEX-SUPPL",             RTL_TEXTENCODING_DONTKNOW },    /* ISO-IR-70 */
479cdf0e10cSrcweir     { "WIN-SAMI-2",                 RTL_TEXTENCODING_DONTKNOW }     /* WS2 */
480cdf0e10cSrcweir };
481cdf0e10cSrcweir 
482cdf0e10cSrcweir #elif defined(FREEBSD)
483cdf0e10cSrcweir 
484cdf0e10cSrcweir const _pair _nl_language_list[] = {
485cdf0e10cSrcweir     { "ASCII",         RTL_TEXTENCODING_ASCII_US       }, /* US-ASCII */
486cdf0e10cSrcweir     { "BIG5",          RTL_TEXTENCODING_BIG5           }, /* China - Traditional Chinese */
487cdf0e10cSrcweir     { "CP1251",        RTL_TEXTENCODING_MS_1251        }, /* MS-CYRL */
488cdf0e10cSrcweir     { "CP866",         RTL_TEXTENCODING_IBM_866        }, /* CP866 866 */
489cdf0e10cSrcweir     { "EUCCN",         RTL_TEXTENCODING_EUC_CN         }, /* China - Simplified Chinese */
490cdf0e10cSrcweir     { "EUCJP",         RTL_TEXTENCODING_EUC_JP         }, /* Japan */
491cdf0e10cSrcweir     { "EUCKR",         RTL_TEXTENCODING_EUC_KR         }, /* Korea */
492cdf0e10cSrcweir     { "ISO8859-1",     RTL_TEXTENCODING_ISO_8859_1     }, /* Western */
493cdf0e10cSrcweir     { "ISO8859-15",    RTL_TEXTENCODING_ISO_8859_15    }, /* Western Updated (w/Euro sign) */
494cdf0e10cSrcweir     { "ISO8859-2",     RTL_TEXTENCODING_ISO_8859_2     }, /* Central European */
495cdf0e10cSrcweir     { "ISO8859-4",     RTL_TEXTENCODING_ISO_8859_4     }, /* LATIN4 L4 */
496cdf0e10cSrcweir     { "ISO8859-5",     RTL_TEXTENCODING_ISO_8859_5     }, /* Cyrillic */
497cdf0e10cSrcweir     { "ISO8859-7",     RTL_TEXTENCODING_ISO_8859_7     }, /* Greek */
498cdf0e10cSrcweir     { "ISO8859-9",     RTL_TEXTENCODING_ISO_8859_9     }, /* Turkish */
499cdf0e10cSrcweir     { "KOI8-R",        RTL_TEXTENCODING_KOI8_R         }, /* KOI8-R */
500cdf0e10cSrcweir     { "KOI8-U",        RTL_TEXTENCODING_KOI8_U         }, /* KOI8-U */
501cdf0e10cSrcweir     { "SJIS",          RTL_TEXTENCODING_SHIFT_JIS      }, /* Japan */
502cdf0e10cSrcweir     { "US-ASCII",      RTL_TEXTENCODING_ASCII_US       }, /* US-ASCII */
503cdf0e10cSrcweir     { "UTF-8",         RTL_TEXTENCODING_UTF8           }  /* ISO-10646/UTF-8 */
504cdf0e10cSrcweir };
505cdf0e10cSrcweir 
506cdf0e10cSrcweir #elif defined(NETBSD)
507cdf0e10cSrcweir 
508cdf0e10cSrcweir const _pair _nl_language_list[] = {
509cdf0e10cSrcweir     { "ASCII",         RTL_TEXTENCODING_ASCII_US       }, /* US-ASCII */
510cdf0e10cSrcweir     { "BIG5",          RTL_TEXTENCODING_BIG5           }, /* China - Traditional Chinese */
511cdf0e10cSrcweir     { "CP1251",        RTL_TEXTENCODING_MS_1251        }, /* MS-CYRL */
512cdf0e10cSrcweir     { "CP866",         RTL_TEXTENCODING_IBM_866        }, /* CP866 866 */
513cdf0e10cSrcweir     { "CTEXT",         RTL_TEXTENCODING_ASCII_US       }, /* US-ASCII */
514cdf0e10cSrcweir     { "EUCCN",         RTL_TEXTENCODING_EUC_CN         }, /* China - Simplified Chinese */
515cdf0e10cSrcweir     { "EUCJP",         RTL_TEXTENCODING_EUC_JP         }, /* Japan */
516cdf0e10cSrcweir     { "EUCKR",         RTL_TEXTENCODING_EUC_KR         }, /* Korea */
517cdf0e10cSrcweir     { "EUCTW",         RTL_TEXTENCODING_EUC_TW         }, /* China - Traditional Chinese */
518cdf0e10cSrcweir     { "ISO-2022-JP",   RTL_TEXTENCODING_DONTKNOW       }, /* */
519cdf0e10cSrcweir     { "ISO-2022-JP-2", RTL_TEXTENCODING_DONTKNOW       }, /* */
520cdf0e10cSrcweir     { "ISO8859-1",     RTL_TEXTENCODING_ISO_8859_1     }, /* Western */
521cdf0e10cSrcweir     { "ISO8859-15",    RTL_TEXTENCODING_ISO_8859_15    }, /* Western Updated (w/Euro sign) */
522cdf0e10cSrcweir     { "ISO8859-2",     RTL_TEXTENCODING_ISO_8859_2     }, /* Central European */
523cdf0e10cSrcweir     { "ISO8859-4",     RTL_TEXTENCODING_ISO_8859_4     }, /* LATIN4 L4 */
524cdf0e10cSrcweir     { "ISO8859-5",     RTL_TEXTENCODING_ISO_8859_5     }, /* Cyrillic */
525cdf0e10cSrcweir     { "ISO8859-7",     RTL_TEXTENCODING_ISO_8859_7     }, /* Greek */
526cdf0e10cSrcweir     { "ISO8859-9",     RTL_TEXTENCODING_ISO_8859_9     }, /* Turkish */
527cdf0e10cSrcweir     { "KOI8-R",        RTL_TEXTENCODING_KOI8_R         }, /* KOI8-R */
528cdf0e10cSrcweir     { "KOI8-U",        RTL_TEXTENCODING_KOI8_U         }, /* KOI8-U */
529cdf0e10cSrcweir     { "SJIS",          RTL_TEXTENCODING_SHIFT_JIS      }, /* Japan */
530cdf0e10cSrcweir     { "US-ASCII",      RTL_TEXTENCODING_ASCII_US       }, /* US-ASCII */
531cdf0e10cSrcweir     { "UTF-8",         RTL_TEXTENCODING_UTF8           }  /* ISO-10646/UTF-8 */
532cdf0e10cSrcweir };
533cdf0e10cSrcweir 
534cdf0e10cSrcweir #endif /* ifdef SOLARIS LINUX FREEBSD NETBSD */
535cdf0e10cSrcweir 
536cdf0e10cSrcweir static pthread_mutex_t aLocalMutex = PTHREAD_MUTEX_INITIALIZER;
537cdf0e10cSrcweir 
538cdf0e10cSrcweir /*****************************************************************************
539cdf0e10cSrcweir  return the text encoding corresponding to the given locale
540cdf0e10cSrcweir  *****************************************************************************/
541cdf0e10cSrcweir 
osl_getTextEncodingFromLocale(rtl_Locale * pLocale)542cdf0e10cSrcweir rtl_TextEncoding osl_getTextEncodingFromLocale( rtl_Locale * pLocale )
543cdf0e10cSrcweir {
544509a48ffSpfg     const _pair *language=NULL;
545cdf0e10cSrcweir 
546cdf0e10cSrcweir     char  locale_buf[64] = "";
547cdf0e10cSrcweir     char  codeset_buf[64];
548cdf0e10cSrcweir 
549509a48ffSpfg     char *ctype_locale = NULL;
550509a48ffSpfg     char *codeset      = NULL;
551cdf0e10cSrcweir 
552cdf0e10cSrcweir     /* default to process locale if pLocale == NULL */
553cdf0e10cSrcweir     if( NULL == pLocale )
554cdf0e10cSrcweir         osl_getProcessLocale( &pLocale );
555cdf0e10cSrcweir 
556cdf0e10cSrcweir     /* convert rtl_Locale to locale string */
557cdf0e10cSrcweir     _compose_locale( pLocale, locale_buf, 64 );
558cdf0e10cSrcweir 
559cdf0e10cSrcweir     /* basic thread safeness */
560cdf0e10cSrcweir     pthread_mutex_lock( &aLocalMutex );
561cdf0e10cSrcweir 
562cdf0e10cSrcweir     /* remember the charset as indicated by the LC_CTYPE locale */
563cdf0e10cSrcweir     ctype_locale = setlocale( LC_CTYPE, NULL );
564cdf0e10cSrcweir 
565cdf0e10cSrcweir     /* set the desired LC_CTYPE locale */
566cdf0e10cSrcweir     if( NULL == setlocale( LC_CTYPE, locale_buf ) )
567cdf0e10cSrcweir     {
568cdf0e10cSrcweir         pthread_mutex_unlock(&aLocalMutex);
569cdf0e10cSrcweir         return RTL_TEXTENCODING_DONTKNOW;
570cdf0e10cSrcweir     }
571cdf0e10cSrcweir 
572cdf0e10cSrcweir     /* get the charset as indicated by the LC_CTYPE locale */
573cdf0e10cSrcweir #if defined(NETBSD) && !defined(CODESET)
574cdf0e10cSrcweir     codeset = NULL;
575cdf0e10cSrcweir #else
576cdf0e10cSrcweir     codeset = nl_langinfo( CODESET );
577cdf0e10cSrcweir #endif
578cdf0e10cSrcweir 
579cdf0e10cSrcweir     if ( codeset != NULL )
580cdf0e10cSrcweir     {
581cdf0e10cSrcweir         /* get codeset into mt save memory */
582cdf0e10cSrcweir         strncpy( codeset_buf, codeset, sizeof(codeset_buf) );
583cdf0e10cSrcweir         codeset_buf[sizeof(codeset_buf) - 1] = 0;
584cdf0e10cSrcweir         codeset = codeset_buf;
585cdf0e10cSrcweir     }
586cdf0e10cSrcweir 
587cdf0e10cSrcweir     /* restore the original value of locale */
588cdf0e10cSrcweir     if ( ctype_locale != NULL )
589cdf0e10cSrcweir         setlocale( LC_CTYPE, ctype_locale );
590cdf0e10cSrcweir 
591cdf0e10cSrcweir     pthread_mutex_unlock( &aLocalMutex );
592cdf0e10cSrcweir 
593cdf0e10cSrcweir     /* search the codeset in our language list */
594cdf0e10cSrcweir     if ( codeset != NULL )
595cdf0e10cSrcweir     {
596cdf0e10cSrcweir         const unsigned int members = sizeof(_nl_language_list) / sizeof(_pair);
597cdf0e10cSrcweir         language = _pair_search (codeset, _nl_language_list, members);
598cdf0e10cSrcweir     }
599cdf0e10cSrcweir 
600cdf0e10cSrcweir     OSL_ASSERT( language && ( RTL_TEXTENCODING_DONTKNOW != language->value ) );
601cdf0e10cSrcweir 
602cdf0e10cSrcweir     /* a matching item in our list provides a mapping from codeset to
603cdf0e10cSrcweir      * rtl-codeset */
604cdf0e10cSrcweir     if ( language != NULL )
605cdf0e10cSrcweir         return language->value;
606cdf0e10cSrcweir 
607cdf0e10cSrcweir     return RTL_TEXTENCODING_DONTKNOW;
608cdf0e10cSrcweir }
609cdf0e10cSrcweir 
610cdf0e10cSrcweir /*****************************************************************************
611cdf0e10cSrcweir  return the current process locale
612cdf0e10cSrcweir  *****************************************************************************/
613cdf0e10cSrcweir 
_imp_getProcessLocale(rtl_Locale ** ppLocale)614cdf0e10cSrcweir void _imp_getProcessLocale( rtl_Locale ** ppLocale )
615cdf0e10cSrcweir {
616cdf0e10cSrcweir     char * locale;
617cdf0e10cSrcweir 
618cdf0e10cSrcweir     /* basic thread safeness */
619cdf0e10cSrcweir     pthread_mutex_lock( &aLocalMutex );
620cdf0e10cSrcweir 
621cdf0e10cSrcweir     /* set the locale defined by the env vars */
622cdf0e10cSrcweir     locale = setlocale( LC_CTYPE, "" );
623cdf0e10cSrcweir 
624cdf0e10cSrcweir     /* fallback to the current locale */
625cdf0e10cSrcweir     if( NULL == locale )
626cdf0e10cSrcweir         locale = setlocale( LC_CTYPE, NULL );
627cdf0e10cSrcweir 
628cdf0e10cSrcweir     /* return the LC_CTYPE locale */
629cdf0e10cSrcweir     *ppLocale = _parse_locale( locale );
630cdf0e10cSrcweir 
631cdf0e10cSrcweir     pthread_mutex_unlock( &aLocalMutex );
632cdf0e10cSrcweir }
633cdf0e10cSrcweir 
634cdf0e10cSrcweir /*****************************************************************************
635cdf0e10cSrcweir  set the current process locale
636cdf0e10cSrcweir  *****************************************************************************/
637cdf0e10cSrcweir 
_imp_setProcessLocale(rtl_Locale * pLocale)638cdf0e10cSrcweir int _imp_setProcessLocale( rtl_Locale * pLocale )
639cdf0e10cSrcweir {
640cdf0e10cSrcweir     char  locale_buf[64] = "";
641cdf0e10cSrcweir     int   ret = 0;
642cdf0e10cSrcweir 
643cdf0e10cSrcweir     /* convert rtl_Locale to locale string */
644cdf0e10cSrcweir     _compose_locale( pLocale, locale_buf, 64 );
645cdf0e10cSrcweir 
646cdf0e10cSrcweir     /* basic thread safeness */
647cdf0e10cSrcweir     pthread_mutex_lock( &aLocalMutex );
648cdf0e10cSrcweir 
649cdf0e10cSrcweir     /* try to set LC_ALL locale */
650cdf0e10cSrcweir     if( NULL == setlocale( LC_ALL, locale_buf ) )
651cdf0e10cSrcweir         ret = -1;
652cdf0e10cSrcweir 
653cdf0e10cSrcweir     pthread_mutex_unlock( &aLocalMutex );
654cdf0e10cSrcweir     return ret;
655cdf0e10cSrcweir }
656cdf0e10cSrcweir 
657cdf0e10cSrcweir #else /* ifdef LINUX || SOLARIS || MACOSX || NETBSD */
658cdf0e10cSrcweir 
659cdf0e10cSrcweir /*
660cdf0e10cSrcweir  * This implementation of osl_getTextEncodingFromLocale maps
661cdf0e10cSrcweir  * from the ISO language codes.
662cdf0e10cSrcweir  */
663cdf0e10cSrcweir 
664cdf0e10cSrcweir const _pair _full_locale_list[] = {
665cdf0e10cSrcweir     { "ja_JP.eucJP",  RTL_TEXTENCODING_EUC_JP      },
666cdf0e10cSrcweir     { "ja_JP.EUC",    RTL_TEXTENCODING_EUC_JP      },
667cdf0e10cSrcweir     { "ko_KR.EUC",    RTL_TEXTENCODING_EUC_KR      },
668cdf0e10cSrcweir     { "zh_CN.EUC",    RTL_TEXTENCODING_EUC_CN      },
669cdf0e10cSrcweir     { "zh_TW.EUC",    RTL_TEXTENCODING_EUC_TW      }
670cdf0e10cSrcweir };
671cdf0e10cSrcweir 
672cdf0e10cSrcweir const _pair _locale_extension_list[] = {
673cdf0e10cSrcweir     { "big5",         RTL_TEXTENCODING_BIG5        },
674cdf0e10cSrcweir     { "big5hk",       RTL_TEXTENCODING_BIG5_HKSCS  },
675cdf0e10cSrcweir     { "gb18030",      RTL_TEXTENCODING_GB_18030    },
676cdf0e10cSrcweir     { "euc",          RTL_TEXTENCODING_EUC_JP      },
677cdf0e10cSrcweir     { "iso8859-1",    RTL_TEXTENCODING_ISO_8859_1  },
678cdf0e10cSrcweir     { "iso8859-10",   RTL_TEXTENCODING_ISO_8859_10 },
679cdf0e10cSrcweir     { "iso8859-13",   RTL_TEXTENCODING_ISO_8859_13 },
680cdf0e10cSrcweir     { "iso8859-14",   RTL_TEXTENCODING_ISO_8859_14 },
681cdf0e10cSrcweir     { "iso8859-15",   RTL_TEXTENCODING_ISO_8859_15 },
682cdf0e10cSrcweir     { "iso8859-2",    RTL_TEXTENCODING_ISO_8859_2  },
683cdf0e10cSrcweir     { "iso8859-3",    RTL_TEXTENCODING_ISO_8859_3  },
684cdf0e10cSrcweir     { "iso8859-4",    RTL_TEXTENCODING_ISO_8859_4  },
685cdf0e10cSrcweir     { "iso8859-5",    RTL_TEXTENCODING_ISO_8859_5  },
686cdf0e10cSrcweir     { "iso8859-6",    RTL_TEXTENCODING_ISO_8859_6  },
687cdf0e10cSrcweir     { "iso8859-7",    RTL_TEXTENCODING_ISO_8859_7  },
688cdf0e10cSrcweir     { "iso8859-8",    RTL_TEXTENCODING_ISO_8859_8  },
689cdf0e10cSrcweir     { "iso8859-9",    RTL_TEXTENCODING_ISO_8859_9  },
690cdf0e10cSrcweir     { "koi8-r",       RTL_TEXTENCODING_KOI8_R      },
691cdf0e10cSrcweir     { "koi8-u",       RTL_TEXTENCODING_KOI8_U      },
692cdf0e10cSrcweir     { "pck",          RTL_TEXTENCODING_MS_932      },
693cdf0e10cSrcweir #if (0)
694cdf0e10cSrcweir     { "sun_eu_greek", RTL_TEXTENCODING_DONTKNOW    },
695cdf0e10cSrcweir #endif
696cdf0e10cSrcweir     { "utf-16",       RTL_TEXTENCODING_UNICODE     },
697cdf0e10cSrcweir     { "utf-7",        RTL_TEXTENCODING_UTF7        },
698cdf0e10cSrcweir     { "utf-8",        RTL_TEXTENCODING_UTF8        }
699cdf0e10cSrcweir };
700cdf0e10cSrcweir 
701cdf0e10cSrcweir const _pair _iso_language_list[] = {
702cdf0e10cSrcweir     { "af",  RTL_TEXTENCODING_ISO_8859_1 },
703cdf0e10cSrcweir     { "ar",  RTL_TEXTENCODING_ISO_8859_6 },
704cdf0e10cSrcweir     { "az",  RTL_TEXTENCODING_ISO_8859_9 },
705cdf0e10cSrcweir     { "be",  RTL_TEXTENCODING_ISO_8859_5 },
706cdf0e10cSrcweir     { "bg",  RTL_TEXTENCODING_ISO_8859_5 },
707cdf0e10cSrcweir     { "ca",  RTL_TEXTENCODING_ISO_8859_1 },
708cdf0e10cSrcweir     { "cs",  RTL_TEXTENCODING_ISO_8859_2 },
709cdf0e10cSrcweir     { "da",  RTL_TEXTENCODING_ISO_8859_1 },
710cdf0e10cSrcweir     { "de",  RTL_TEXTENCODING_ISO_8859_1 },
711cdf0e10cSrcweir     { "el",  RTL_TEXTENCODING_ISO_8859_7 },
712cdf0e10cSrcweir     { "en",  RTL_TEXTENCODING_ISO_8859_1 },
713cdf0e10cSrcweir     { "es",  RTL_TEXTENCODING_ISO_8859_1 },
714cdf0e10cSrcweir     { "et",  RTL_TEXTENCODING_ISO_8859_4 },
715cdf0e10cSrcweir     { "eu",  RTL_TEXTENCODING_ISO_8859_1 },
716cdf0e10cSrcweir     { "fa",  RTL_TEXTENCODING_ISO_8859_6 },
717cdf0e10cSrcweir     { "fi",  RTL_TEXTENCODING_ISO_8859_1 },
718cdf0e10cSrcweir     { "fo",  RTL_TEXTENCODING_ISO_8859_1 },
719cdf0e10cSrcweir     { "fr",  RTL_TEXTENCODING_ISO_8859_1 },
720cdf0e10cSrcweir     { "gr",  RTL_TEXTENCODING_ISO_8859_7 },
721cdf0e10cSrcweir     { "he",  RTL_TEXTENCODING_ISO_8859_8 },
722cdf0e10cSrcweir     { "hi",  RTL_TEXTENCODING_DONTKNOW },
723cdf0e10cSrcweir     { "hr",  RTL_TEXTENCODING_ISO_8859_2 },
724cdf0e10cSrcweir     { "hu",  RTL_TEXTENCODING_ISO_8859_2 },
725cdf0e10cSrcweir     { "hy",  RTL_TEXTENCODING_DONTKNOW },
726cdf0e10cSrcweir     { "id",  RTL_TEXTENCODING_ISO_8859_1 },
727cdf0e10cSrcweir     { "is",  RTL_TEXTENCODING_ISO_8859_1 },
728cdf0e10cSrcweir     { "it",  RTL_TEXTENCODING_ISO_8859_1 },
729cdf0e10cSrcweir     { "iw",  RTL_TEXTENCODING_ISO_8859_8 },
730cdf0e10cSrcweir     { "ja",  RTL_TEXTENCODING_EUC_JP },
731cdf0e10cSrcweir     { "ka",  RTL_TEXTENCODING_DONTKNOW },
732cdf0e10cSrcweir     { "kk",  RTL_TEXTENCODING_ISO_8859_5 },
733cdf0e10cSrcweir     { "ko",  RTL_TEXTENCODING_EUC_KR },
734cdf0e10cSrcweir     { "lt",  RTL_TEXTENCODING_ISO_8859_4 },
735cdf0e10cSrcweir     { "lv",  RTL_TEXTENCODING_ISO_8859_4 },
736cdf0e10cSrcweir     { "mk",  RTL_TEXTENCODING_ISO_8859_5 },
737cdf0e10cSrcweir     { "mr",  RTL_TEXTENCODING_DONTKNOW },
738cdf0e10cSrcweir     { "ms",  RTL_TEXTENCODING_ISO_8859_1 },
739cdf0e10cSrcweir     { "nl",  RTL_TEXTENCODING_ISO_8859_1 },
740cdf0e10cSrcweir     { "no",  RTL_TEXTENCODING_ISO_8859_1 },
741cdf0e10cSrcweir     { "pl",  RTL_TEXTENCODING_ISO_8859_2 },
742cdf0e10cSrcweir     { "pt",  RTL_TEXTENCODING_ISO_8859_1 },
743cdf0e10cSrcweir     { "ro",  RTL_TEXTENCODING_ISO_8859_2 },
744cdf0e10cSrcweir     { "ru",  RTL_TEXTENCODING_ISO_8859_5 },
745cdf0e10cSrcweir     { "sa",  RTL_TEXTENCODING_DONTKNOW },
746cdf0e10cSrcweir     { "sk",  RTL_TEXTENCODING_ISO_8859_2 },
747cdf0e10cSrcweir     { "sl",  RTL_TEXTENCODING_ISO_8859_2 },
748cdf0e10cSrcweir     { "sq",  RTL_TEXTENCODING_ISO_8859_2 },
749cdf0e10cSrcweir     { "sv",  RTL_TEXTENCODING_ISO_8859_1 },
750cdf0e10cSrcweir     { "sw",  RTL_TEXTENCODING_ISO_8859_1 },
751cdf0e10cSrcweir     { "ta",  RTL_TEXTENCODING_DONTKNOW },
752cdf0e10cSrcweir     { "th",  RTL_TEXTENCODING_DONTKNOW },
753cdf0e10cSrcweir     { "tr",  RTL_TEXTENCODING_ISO_8859_9 },
754cdf0e10cSrcweir     { "tt",  RTL_TEXTENCODING_ISO_8859_5 },
755cdf0e10cSrcweir     { "uk",  RTL_TEXTENCODING_ISO_8859_5 },
756cdf0e10cSrcweir     { "ur",  RTL_TEXTENCODING_ISO_8859_6 },
757cdf0e10cSrcweir     { "uz",  RTL_TEXTENCODING_ISO_8859_9 },
758cdf0e10cSrcweir     { "vi",  RTL_TEXTENCODING_DONTKNOW },
759cdf0e10cSrcweir     { "zh",  RTL_TEXTENCODING_BIG5 }
760cdf0e10cSrcweir };
761cdf0e10cSrcweir 
762cdf0e10cSrcweir /*****************************************************************************
763cdf0e10cSrcweir  return the text encoding corresponding to the given locale
764cdf0e10cSrcweir  *****************************************************************************/
765cdf0e10cSrcweir 
osl_getTextEncodingFromLocale(rtl_Locale * pLocale)766cdf0e10cSrcweir rtl_TextEncoding osl_getTextEncodingFromLocale( rtl_Locale * pLocale )
767cdf0e10cSrcweir {
768509a48ffSpfg     const _pair *language = NULL;
769cdf0e10cSrcweir     char locale_buf[64] = "";
770cdf0e10cSrcweir     char *cp;
771cdf0e10cSrcweir 
772cdf0e10cSrcweir     /* default to process locale if pLocale == NULL */
773cdf0e10cSrcweir     if( NULL == pLocale )
774cdf0e10cSrcweir         osl_getProcessLocale( &pLocale );
775cdf0e10cSrcweir 
776cdf0e10cSrcweir     /* convert rtl_Locale to locale string */
777cdf0e10cSrcweir     if( _compose_locale( pLocale, locale_buf, 64 ) )
778cdf0e10cSrcweir     {
779cdf0e10cSrcweir         /* check special handling list (EUC) first */
780cdf0e10cSrcweir         const unsigned int members = sizeof( _full_locale_list ) / sizeof( _pair );
781cdf0e10cSrcweir         language = _pair_search( locale_buf, _full_locale_list, members);
782cdf0e10cSrcweir 
783cdf0e10cSrcweir         if( NULL == language )
784cdf0e10cSrcweir         {
785cdf0e10cSrcweir             /*
786cdf0e10cSrcweir              *  check if there is a charset qualifier at the end of the given locale string
787cdf0e10cSrcweir              *  e.g. de.ISO8859-15 or de.ISO8859-15@euro which strongly indicates what
788cdf0e10cSrcweir              *  charset to use
789cdf0e10cSrcweir              */
790cdf0e10cSrcweir 		    cp = strrchr( locale_buf, '.' );
791cdf0e10cSrcweir 
792cdf0e10cSrcweir             if( NULL != cp )
793cdf0e10cSrcweir             {
794cdf0e10cSrcweir                 const unsigned int members = sizeof( _locale_extension_list ) / sizeof( _pair );
795cdf0e10cSrcweir                 language = _pair_search( cp + 1, _locale_extension_list, members);
796cdf0e10cSrcweir             }
797cdf0e10cSrcweir         }
798cdf0e10cSrcweir 
799cdf0e10cSrcweir         /* use iso language code to determine the charset */
800cdf0e10cSrcweir         if( NULL == language )
801cdf0e10cSrcweir         {
802cdf0e10cSrcweir             const unsigned int members = sizeof( _iso_language_list ) / sizeof( _pair );
803cdf0e10cSrcweir 
804*d2b26721Smseidel             /* iso lang codes have 2 characters */
805cdf0e10cSrcweir             locale_buf[2] = '\0';
806cdf0e10cSrcweir 
807cdf0e10cSrcweir             language = _pair_search( locale_buf, _iso_language_list, members);
808cdf0e10cSrcweir         }
809cdf0e10cSrcweir     }
810cdf0e10cSrcweir 
811cdf0e10cSrcweir     /* a matching item in our list provides a mapping from codeset to
812cdf0e10cSrcweir      * rtl-codeset */
813cdf0e10cSrcweir     if ( language != NULL )
814cdf0e10cSrcweir         return language->value;
815cdf0e10cSrcweir 
816cdf0e10cSrcweir     return RTL_TEXTENCODING_DONTKNOW;
817cdf0e10cSrcweir }
818cdf0e10cSrcweir 
819cdf0e10cSrcweir #ifdef MACOSX
820cdf0e10cSrcweir #include "system.h"
821cdf0e10cSrcweir 
822cdf0e10cSrcweir /* OS X locale discovery function */
823cdf0e10cSrcweir int (*pGetOSXLocale)( char *, sal_uInt32 );
824cdf0e10cSrcweir 
825cdf0e10cSrcweir oslModule SAL_CALL osl_psz_loadModule(const sal_Char *pszModuleName, sal_Int32 nRtldMode);
826cdf0e10cSrcweir /*****************************************************************************
827cdf0e10cSrcweir  return the current process locale
828cdf0e10cSrcweir  *****************************************************************************/
829cdf0e10cSrcweir 
830cdf0e10cSrcweir int macosx_getLocale(char *locale, sal_uInt32 bufferLen);
831cdf0e10cSrcweir 
_imp_getProcessLocale(rtl_Locale ** ppLocale)832cdf0e10cSrcweir void _imp_getProcessLocale( rtl_Locale ** ppLocale )
833cdf0e10cSrcweir {
834cdf0e10cSrcweir     static char *locale = NULL;
835854bf195SJim Jagielski     char *npath, *opath;
836854bf195SJim Jagielski     int slen;
837cdf0e10cSrcweir 
838cdf0e10cSrcweir     /* basic thread safeness */
839cdf0e10cSrcweir //    pthread_mutex_lock( &aLocalMutex );
840cdf0e10cSrcweir 
841cdf0e10cSrcweir     /* Only fetch the locale once and cache it */
842cdf0e10cSrcweir     if ( NULL == locale )
843cdf0e10cSrcweir     {
844cdf0e10cSrcweir 
845cdf0e10cSrcweir         locale = (char *)malloc( 128 );
846cdf0e10cSrcweir         if ( locale )
847cdf0e10cSrcweir             macosx_getLocale( locale, 128 );
848cdf0e10cSrcweir         else
849cdf0e10cSrcweir             fprintf( stderr, "nlsupport.c:  locale allocation returned NULL!\n" );
850cdf0e10cSrcweir     }
851cdf0e10cSrcweir 
852cdf0e10cSrcweir     /* handle the case where OS specific method of finding locale fails */
853cdf0e10cSrcweir     if ( NULL == locale )
854cdf0e10cSrcweir     {
855cdf0e10cSrcweir         /* simulate behavior of setlocale */
856cdf0e10cSrcweir         locale = getenv( "LC_ALL" );
857cdf0e10cSrcweir 
858cdf0e10cSrcweir         if( NULL == locale )
859cdf0e10cSrcweir             locale = getenv( "LC_CTYPE" );
860cdf0e10cSrcweir 
861cdf0e10cSrcweir         if( NULL == locale )
862cdf0e10cSrcweir             locale = getenv( "LANG" );
863cdf0e10cSrcweir 
864cdf0e10cSrcweir         if( NULL == locale )
865cdf0e10cSrcweir             locale = "C";
866cdf0e10cSrcweir     }
867cdf0e10cSrcweir 
868cdf0e10cSrcweir     /* return the locale */
869cdf0e10cSrcweir     *ppLocale = _parse_locale( locale );
870cdf0e10cSrcweir 
871cdf0e10cSrcweir     setenv( "LC_ALL", locale, 1);
872cdf0e10cSrcweir     setenv("LC_CTYPE", locale, 1 );
873cdf0e10cSrcweir     setenv("LANG", locale, 1 );
874cdf0e10cSrcweir 
875854bf195SJim Jagielski     /*
876854bf195SJim Jagielski      * This is a hack. We know that we are setting some envvars here
877854bf195SJim Jagielski      * and due to https://bz.apache.org/ooo/show_bug.cgi?id=127965
878854bf195SJim Jagielski      * we need to update PATH on macOS. Doing it here ensures
8798b1de4c1Sjim      * that it's done but it's not the perfect location to be doing
880854bf195SJim Jagielski      * this.
881854bf195SJim Jagielski      */
882854bf195SJim Jagielski     opath = getenv ( "PATH" );
8838b1de4c1Sjim     if (!strstr ( opath, "/usr/local/bin" )) {
8848b1de4c1Sjim         slen = strlen( "/usr/local/bin" ) + 1;
8858b1de4c1Sjim         if ( opath != NULL )
8868b1de4c1Sjim             slen += strlen( ":" ) + strlen( opath );
8878b1de4c1Sjim         npath = malloc( slen );
8888b1de4c1Sjim         *npath = '\0';
8898b1de4c1Sjim         if ( opath != NULL ) {
8908b1de4c1Sjim             strcat( npath, opath );
8918b1de4c1Sjim             strcat( npath, ":" );
8928b1de4c1Sjim         }
8938b1de4c1Sjim         strcat( npath, "/usr/local/bin" ); /* We are adding at the end */
8948b1de4c1Sjim         setenv("PATH", npath, 1 );
8958b1de4c1Sjim         free(npath);
8962a37e6f7SJim Jagielski     }
8972a37e6f7SJim Jagielski 
898cdf0e10cSrcweir #ifdef DEBUG
899cdf0e10cSrcweir     fprintf( stderr, "nlsupport.c:  _imp_getProcessLocale() returning %s as current locale.\n", locale );
900cdf0e10cSrcweir #endif
901cdf0e10cSrcweir 
902cdf0e10cSrcweir //    pthread_mutex_unlock( &aLocalMutex );
903cdf0e10cSrcweir 
904cdf0e10cSrcweir }
905cdf0e10cSrcweir #else
906cdf0e10cSrcweir /*****************************************************************************
907cdf0e10cSrcweir  return the current process locale
908cdf0e10cSrcweir  *****************************************************************************/
909cdf0e10cSrcweir 
_imp_getProcessLocale(rtl_Locale ** ppLocale)910cdf0e10cSrcweir void _imp_getProcessLocale( rtl_Locale ** ppLocale )
911cdf0e10cSrcweir {
912cdf0e10cSrcweir     /* simulate behavior off setlocale */
913cdf0e10cSrcweir     char * locale = getenv( "LC_ALL" );
914cdf0e10cSrcweir 
915cdf0e10cSrcweir     if( NULL == locale )
916cdf0e10cSrcweir         locale = getenv( "LC_CTYPE" );
917cdf0e10cSrcweir 
918cdf0e10cSrcweir     if( NULL == locale )
919cdf0e10cSrcweir         locale = getenv( "LANG" );
920cdf0e10cSrcweir 
921cdf0e10cSrcweir     if( NULL == locale )
922cdf0e10cSrcweir         locale = "C";
923cdf0e10cSrcweir 
924cdf0e10cSrcweir     *ppLocale = _parse_locale( locale );
925cdf0e10cSrcweir }
926cdf0e10cSrcweir #endif
927cdf0e10cSrcweir 
928cdf0e10cSrcweir /*****************************************************************************
929cdf0e10cSrcweir  set the current process locale
930cdf0e10cSrcweir  *****************************************************************************/
931cdf0e10cSrcweir 
_imp_setProcessLocale(rtl_Locale * pLocale)932cdf0e10cSrcweir int _imp_setProcessLocale( rtl_Locale * pLocale )
933cdf0e10cSrcweir {
934cdf0e10cSrcweir     char locale_buf[64];
935cdf0e10cSrcweir 
936cdf0e10cSrcweir     /* convert rtl_Locale to locale string */
937cdf0e10cSrcweir     if( NULL != _compose_locale( pLocale, locale_buf, 64 ) )
938cdf0e10cSrcweir     {
939cdf0e10cSrcweir         /* only change env vars that exist already */
940cdf0e10cSrcweir         if( getenv( "LC_ALL" ) ) {
941cdf0e10cSrcweir #if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX )
942cdf0e10cSrcweir             setenv( "LC_ALL", locale_buf, 1);
943cdf0e10cSrcweir #else
944cdf0e10cSrcweir             setenv( "LC_ALL", locale_buf );
945cdf0e10cSrcweir #endif
946cdf0e10cSrcweir         }
947cdf0e10cSrcweir 
948cdf0e10cSrcweir         if( getenv( "LC_CTYPE" ) ) {
949cdf0e10cSrcweir #if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX )
950cdf0e10cSrcweir             setenv("LC_CTYPE", locale_buf, 1 );
951cdf0e10cSrcweir #else
952cdf0e10cSrcweir             setenv( "LC_CTYPE", locale_buf );
953cdf0e10cSrcweir #endif
954cdf0e10cSrcweir         }
955cdf0e10cSrcweir 
956cdf0e10cSrcweir         if( getenv( "LANG" ) ) {
957cdf0e10cSrcweir #if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX )
958cdf0e10cSrcweir             setenv("LC_CTYPE", locale_buf, 1 );
959cdf0e10cSrcweir #else
960cdf0e10cSrcweir             setenv( "LANG", locale_buf );
961cdf0e10cSrcweir #endif
962cdf0e10cSrcweir         }
963cdf0e10cSrcweir     }
964cdf0e10cSrcweir 
965cdf0e10cSrcweir     return 0;
966cdf0e10cSrcweir }
967cdf0e10cSrcweir 
968cdf0e10cSrcweir #endif /* ifdef LINUX || SOLARIS || MACOSX || NETBSD */
969cdf0e10cSrcweir 
970cdf0e10cSrcweir 
971