aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/lib/Xp/XpLocale.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/lib/Xp/XpLocale.c')
-rw-r--r--nx-X11/lib/Xp/XpLocale.c269
1 files changed, 269 insertions, 0 deletions
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 <config.h>
+#endif
+#include <X11/extensions/Printstr.h>
+#include <X11/Xlibint.h>
+#include "XpExtUtil.h"
+
+#include <X11/Xlocale.h>
+
+
+/*
+ * 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 );
+ }
+}
+