diff options
Diffstat (limited to 'libX11/src/SetLocale.c')
-rw-r--r-- | libX11/src/SetLocale.c | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/libX11/src/SetLocale.c b/libX11/src/SetLocale.c new file mode 100644 index 000000000..2302c4473 --- /dev/null +++ b/libX11/src/SetLocale.c @@ -0,0 +1,257 @@ +/* $XdotOrg: lib/X11/src/SetLocale.c,v 1.4 2005-07-03 07:00:55 daniels Exp $ */ +/* $Xorg: SetLocale.c,v 1.4 2001/02/09 02:03:36 xorgcvs Exp $ */ + +/* + * Copyright 1990, 1991 by OMRON Corporation, NTT Software Corporation, + * and Nippon Telegraph and Telephone Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the names of OMRON, NTT Software, and NTT + * not be used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. OMRON, NTT Software, + * and NTT make no representations about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * OMRON, NTT SOFTWARE, AND NTT, DISCLAIM ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL OMRON, NTT SOFTWARE, OR NTT, BE + * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Li Yuhong OMRON Corporation + * Tetsuya Kato NTT Software Corporation + * Hiroshi Kuribayashi OMRON Corporation + * + */ +/* + +Copyright 1987,1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ +/* $XFree86: xc/lib/X11/SetLocale.c,v 3.20 2003/11/17 22:20:08 dawes Exp $ */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xlibint.h" +#include "Xlcint.h" +#include <X11/Xlocale.h> +#include <X11/Xos.h> +#include "XlcPubI.h" + +#define MAXLOCALE 64 /* buffer size of locale name */ + +#ifdef X_LOCALE + +/* alternative setlocale() for when the OS does not provide one */ + +char * +_Xsetlocale( + int category, + _Xconst char *name +) +{ + static char *xsl_name; + char *old_name; + XrmMethods methods; + XPointer state; + + if (category != LC_CTYPE && category != LC_ALL) + return NULL; + if (!name) { + if (xsl_name) + return xsl_name; + return "C"; + } + if (!*name) + name = getenv("LC_CTYPE"); + if (!name || !*name) + name = getenv("LANG"); + if (name && strlen(name) >= MAXLOCALE) + name = NULL; + if (!name || !*name || !_XOpenLC((char *) name)) + name = "C"; + old_name = xsl_name; + xsl_name = (char *)name; + methods = _XrmInitParseInfo(&state); + xsl_name = old_name; + if (!methods) + return NULL; + name = (*methods->lcname)(state); + xsl_name = Xmalloc(strlen(name) + 1); + if (!xsl_name) { + xsl_name = old_name; + (*methods->destroy)(state); + return NULL; + } + strcpy(xsl_name, name); + if (old_name) + Xfree(old_name); + (*methods->destroy)(state); + return xsl_name; +} + +#else /* X_LOCALE */ + +#ifdef __APPLE__ +char * +_Xsetlocale( + int category, + _Xconst char *name +) +{ + return setlocale(category, name); +} +#endif /* __APPLE__ */ + +/* + * _XlcMapOSLocaleName is an implementation dependent routine that derives + * the LC_CTYPE locale name as used in the sample implementation from that + * returned by setlocale. + * + * Should match the code in Xt ExtractLocaleName. + * + * This function name is a bit of a misnomer. Even the siname parameter + * name is a misnomer. On most modern operating systems this function is + * a no-op, simply returning the osname; but on older operating systems + * like Ultrix, or HPUX 9.x and earlier, when you set LANG=german.88591 + * then the string returned by setlocale(LC_ALL, "") will look something + * like: "german.88591 german.88591 ... german.88591". Then this function + * will pick out the LC_CTYPE component and return a pointer to that. + */ + +char * +_XlcMapOSLocaleName( + char *osname, + char *siname) +{ +#if defined(hpux) || defined(CSRG_BASED) || defined(sun) || defined(SVR4) || defined(sgi) || defined(__osf__) || defined(AIXV3) || defined(ultrix) || defined(WIN32) || defined(__UNIXOS2__) || defined(linux) +# ifdef hpux +# ifndef _LastCategory + /* HPUX 9 and earlier */ +# define SKIPCOUNT 2 +# define STARTCHAR ':' +# define ENDCHAR ';' +# else + /* HPUX 10 */ +# define ENDCHAR ' ' +# endif +# else +# ifdef ultrix +# define SKIPCOUNT 2 +# define STARTCHAR '\001' +# define ENDCHAR '\001' +# else +# if defined(WIN32) || defined(__UNIXOS2__) +# define SKIPCOUNT 1 +# define STARTCHAR '=' +# define ENDCHAR ';' +# define WHITEFILL +# else +# if defined(__osf__) || (defined(AIXV3) && !defined(AIXV4)) +# define STARTCHAR ' ' +# define ENDCHAR ' ' +# else +# if defined(linux) +# define STARTSTR "LC_CTYPE=" +# define ENDCHAR ';' +# else +# if !defined(sun) || defined(SVR4) +# define STARTCHAR '/' +# define ENDCHAR '/' +# endif +# endif +# endif +# endif +# endif +# endif + + char *start; + char *end; + int len; +# ifdef SKIPCOUNT + int n; +# endif + + start = osname; +# ifdef SKIPCOUNT + for (n = SKIPCOUNT; + --n >= 0 && start && (start = strchr (start, STARTCHAR)); + start++) + ; + if (!start) + start = osname; +# endif +# ifdef STARTCHAR + if (start && (start = strchr (start, STARTCHAR))) +# elif defined (STARTSTR) + if (start && (start = strstr (start,STARTSTR))) +# endif + { +# ifdef STARTCHAR + start++; +# elif defined (STARTSTR) + start += strlen(STARTSTR); +# endif + if ((end = strchr (start, ENDCHAR))) { + len = end - start; + if (len >= MAXLOCALE) + len = MAXLOCALE - 1; + strncpy(siname, start, len); + *(siname + len) = '\0'; +# ifdef WHITEFILL + for (start = siname; start = strchr(start, ' '); ) + *start++ = '-'; +# endif + return siname; + } else /* if no ENDCHAR is found we are at the end of the line */ + return start; + } +# ifdef WHITEFILL + if (strchr(osname, ' ')) { + len = strlen(osname); + if (len >= MAXLOCALE - 1) + len = MAXLOCALE - 1; + strncpy(siname, osname, len); + *(siname + len) = '\0'; + for (start = siname; start = strchr(start, ' '); ) + *start++ = '-'; + return siname; + } +# endif +# undef STARTCHAR +# undef ENDCHAR +# undef WHITEFILL +#endif + return osname; +} + +#endif /* X_LOCALE */ |