Edit

IABSD.fr/xenocara/lib/libXp/src/XpLocale.c

Branch :

  • Show log

    Commit

  • Author : matthieu
    Date : 2006-11-25 17:22:40
    Hash : 19d7c699
    Message : import from X.Org 7.2RC2

  • lib/libXp/src/XpLocale.c
  • /* $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 );
        }
    }