From f4092abdf94af6a99aff944d6264bc1284e8bdd4 Mon Sep 17 00:00:00 2001 From: Reinhard Tartler Date: Mon, 10 Oct 2011 17:43:39 +0200 Subject: Imported nx-X11-3.1.0-1.tar.gz Summary: Imported nx-X11-3.1.0-1.tar.gz Keywords: Imported nx-X11-3.1.0-1.tar.gz into Git repository --- nx-X11/lib/Xp/XpLocale.c | 269 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 nx-X11/lib/Xp/XpLocale.c (limited to 'nx-X11/lib/Xp/XpLocale.c') diff --git a/nx-X11/lib/Xp/XpLocale.c b/nx-X11/lib/Xp/XpLocale.c new file mode 100644 index 000000000..ef7c5fb01 --- /dev/null +++ b/nx-X11/lib/Xp/XpLocale.c @@ -0,0 +1,269 @@ +/* $Xorg: XpLocale.c,v 1.3 2000/08/17 19:46:07 cpqbld Exp $ */ +/****************************************************************************** + ****************************************************************************** + ** + ** (c) Copyright 1996 Hewlett-Packard Company + ** (c) Copyright 1996 International Business Machines Corp. + ** (c) Copyright 1996 Sun Microsystems, Inc. + ** (c) Copyright 1996 Novell, Inc. + ** (c) Copyright 1996 Digital Equipment Corp. + ** (c) Copyright 1996 Fujitsu Limited + ** (c) Copyright 1996 Hitachi, Ltd. + ** + ** Permission is hereby granted, free of charge, to any person obtaining a copy + ** of this software and associated documentation files (the "Software"), to deal + ** in the Software without restriction, including without limitation the rights + ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + ** copies of the Software, and to permit persons to whom the Software is + ** furnished to do so, subject to the following conditions: + ** + ** 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 + ** COPYRIGHT HOLDERS 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 names of the copyright holders shall + ** not be used in advertising or otherwise to promote the sale, use or other + ** dealings in this Software without prior written authorization from said + ** copyright holders. + ** + ****************************************************************************** + *****************************************************************************/ +/* $XFree86: xc/lib/Xp/XpLocale.c,v 1.4 2001/01/17 19:43:02 dawes Exp $ */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include "XpExtUtil.h" + +#include + + +/* + * Global hangers for locale hint machinery. + */ +XPHinterProc _xp_hinter_proc = NULL; +char *_xp_hinter_desc = NULL; +int _xp_hinter_init = 1; /* need to init */ + + +extern char *_xpstrdup(); + + +/****************************************************************************** + * + * THE DEFAULT LOCALE HINTER + * + * Make changes here only. + */ +static char *_XpLocaleHinter() +{ +#ifdef hpux + char lbuf[ LC_BUFSIZ ]; + + if ( setlocale_r( LC_CTYPE, (char *) NULL, lbuf, LC_BUFSIZ ) ) { +#else + char *lbuf; + + if ((lbuf = setlocale(LC_CTYPE, (char *) NULL)) == NULL) { +#endif + return( _xpstrdup( "" ) ); + } + else { + return( _xpstrdup( lbuf ) ); + } +} + +#define _XPLOCALEHINTERDESC NULL + + +/****************************************************************************** + * + * XpSetLocaleHinter + */ +void +XpSetLocaleHinter ( + XPHinterProc hinter_proc, + char *hinter_desc +) +{ + + _XLockMutex(_Xglobal_lock); + + /* + * Free up existing hinter description. + */ + if (_xp_hinter_desc) + XFree( _xp_hinter_desc ); + + /* + * Either install the default hinter, or install the + * one provided by the caller. + */ + if (!hinter_proc) { + _xp_hinter_proc = _XpLocaleHinter; + _xp_hinter_desc = _xpstrdup( _XPLOCALEHINTERDESC ); + _xp_hinter_init = 0; + } + else { + _xp_hinter_proc = hinter_proc; + _xp_hinter_desc = _xpstrdup( hinter_desc ); + _xp_hinter_init = 0; + } + + _XUnlockMutex(_Xglobal_lock); +} + + +/****************************************************************************** + * + * XpGetLocaleHinter + */ +char * +XpGetLocaleHinter ( + XPHinterProc *hinter_proc +) +{ + char *tmpstr; + + _XLockMutex(_Xglobal_lock); + + if (_xp_hinter_init) { + _xp_hinter_proc = _XpLocaleHinter; + _xp_hinter_desc = _xpstrdup( _XPLOCALEHINTERDESC ); + _xp_hinter_init = 0; + } + + *hinter_proc = _xp_hinter_proc; + tmpstr = _xpstrdup( _xp_hinter_desc ); + + _XUnlockMutex(_Xglobal_lock); + + return( tmpstr ); +} + + +/****************************************************************************** + * + * XpGetLocaleNetString + * + * this is the routine that uses the locale hint machinery + * to construct the actual "locale_hint" that is passed in + * the various protocols and ICCCM-selection requests. + * + * A "Locale Net String" is made up of two components, a "locale hint" + * that is the locale, and a "locale description" that is a description + * of how the locale was derived. + * + * If a locale hint and description are available, then the net string + * will be the description, and if the description contains the + * keyword "%locale%", that keyword will be replaced with the locale + * hint. For example: + * + * locale_desc = XOPEN;%locale%;01_00;XFN-001001 + * locale_hint = de_DE + * + * result is = XOPEN;de_DE;01_00;XFN-001001 + * + * If only a locale description is available, then it becomes the + * entire net string. + * + * If only a locale hint is available, then it becomes the + * entire net string. + * + * If neither a hint or description exists, a NULL is returned. + */ +char *XpGetLocaleNetString() +{ + XPHinterProc locale_hinter; + + char *locale_desc; + char *locale_hint; + char *tptr1; + char *locale_net_string; + + + /* + * Fetch the current locale hinter machinery. + */ + locale_desc = XpGetLocaleHinter( &locale_hinter ); + + /* + * Run it. + */ + locale_hint = (locale_hinter)(); + + /* + * Use locale_desc and locale_hint to build a full + * locale net string. + */ + if (locale_desc && locale_hint) { + /* + * Combine the two portions to form locale_net_string. + * + * For example: + */ + + tptr1 = strstr( locale_desc, "%locale%" ); + + if (tptr1) { + /* + * Insert locale_hint into locale_desc. + * + * Note: strlen("%locale%") = 8 + */ + locale_net_string = Xmalloc( strlen(locale_desc) - 8 + + strlen(locale_hint) + 1 ); + + /* + * Copy first portion of locale_desc. + */ + *tptr1 = '\0'; + strcpy( locale_net_string, locale_desc ); + + /* + * Copy middle portion consisting of locale_hint. + */ + strcat( locale_net_string, locale_hint ); + + /* + * Copy first portion of locale_desc. + */ + tptr1 = tptr1 + 8; /* skip by %Locale% keyword */ + + strcat( locale_net_string, tptr1 ); + + /* + * Free up and return. + */ + XFree( locale_hint ); + XFree( locale_desc ); + return( locale_net_string ); + } + else { + /* + * Since a locale_desc was given WITHOUT a place to insert + * the locale_hint, the locale_desc wins out. + */ + XFree( locale_hint ); + return( locale_desc ); + } + } + else if (locale_desc) { + return( locale_desc ); + } + else if (locale_hint) { + return( locale_hint ); + } + else { + return( (char *) NULL ); + } +} + -- cgit v1.2.3