add wxXLocale class and wxIsxxx_l() and wxToxxx_l() functions (heavily modified and extended patch 1874287)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51632 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
228
src/common/xlocale.cpp
Normal file
228
src/common/xlocale.cpp
Normal file
@@ -0,0 +1,228 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Name: src/common/xlocale.cpp
|
||||
// Purpose: xlocale wrappers/impl to provide some xlocale wrappers
|
||||
// Author: Brian Vanderburg II, Vadim Zeitlin
|
||||
// Created: 2008-01-07
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 2008 Brian Vanderburg II
|
||||
// 2008 Vadim Zeitlin <vadim@wxwidgets.org>
|
||||
// Licence: wxWindows licence
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// ============================================================================
|
||||
// declarations
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// headers
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#if wxUSE_XLOCALE
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/module.h"
|
||||
#endif
|
||||
|
||||
#include "wx/xlocale.h"
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// module globals
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// This is the C locale object, it is created on demand
|
||||
static wxXLocale *gs_cLocale = NULL;
|
||||
|
||||
// ============================================================================
|
||||
// implementation
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Module for gs_cLocale cleanup
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class wxXLocaleModule : public wxModule
|
||||
{
|
||||
public:
|
||||
virtual bool OnInit() { return true; }
|
||||
virtual void OnExit() { wxDELETE(gs_cLocale); }
|
||||
|
||||
DECLARE_DYNAMIC_CLASS(wxXLocaleModule)
|
||||
};
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxXLocaleModule, wxModule)
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// wxXLocale implementation
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// common parts
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// Get the C locale
|
||||
wxXLocale& wxXLocale::GetCLocale()
|
||||
{
|
||||
if ( !gs_cLocale )
|
||||
{
|
||||
gs_cLocale = new wxXLocale(wx_static_cast(wxXLocaleCTag *, NULL));
|
||||
}
|
||||
|
||||
return *gs_cLocale;
|
||||
}
|
||||
|
||||
wxXLocale::wxXLocale(wxLanguage lang)
|
||||
{
|
||||
const wxLanguageInfo * const info = wxLocale::GetLanguageInfo(lang);
|
||||
if ( !info )
|
||||
{
|
||||
m_locale = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
Init(info->CanonicalName);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef wxHAS_XLOCALE_SUPPORT
|
||||
|
||||
#if wxCHECK_VISUALC_VERSION(8)
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// implementation using MSVC locale API
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxXLocale::Init(const char *loc)
|
||||
{
|
||||
m_locale = _create_locale(LC_ALL, loc);
|
||||
}
|
||||
|
||||
void wxXLocale::Free()
|
||||
{
|
||||
if ( m_locale )
|
||||
_free_locale(m_locale);
|
||||
}
|
||||
|
||||
#elif defined(HAVE_LOCALE_T)
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// implementation using xlocale API
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void wxXLocale::Init(const char *loc)
|
||||
{
|
||||
m_locale = newlocale(LC_ALL_MASK, loc, NULL);
|
||||
}
|
||||
|
||||
void wxXLocale::Free()
|
||||
{
|
||||
if ( m_locale )
|
||||
freelocale(m_locale);
|
||||
}
|
||||
|
||||
#else
|
||||
#error "Unknown xlocale support."
|
||||
#endif
|
||||
|
||||
#endif // wxHAS_XLOCALE_SUPPORT
|
||||
|
||||
#ifndef wxHAS_XLOCALE_SUPPORT
|
||||
|
||||
// ============================================================================
|
||||
// Implementation of wxFoo_l() functions for "C" locale without xlocale support
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// character classification and transformation functions
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// lookup table and macros for character type functions
|
||||
#define CTYPE_ALNUM 0x0001
|
||||
#define CTYPE_ALPHA 0x0002
|
||||
#define CTYPE_CNTRL 0x0004
|
||||
#define CTYPE_DIGIT 0x0008
|
||||
#define CTYPE_GRAPH 0x0010
|
||||
#define CTYPE_LOWER 0x0020
|
||||
#define CTYPE_PRINT 0x0040
|
||||
#define CTYPE_PUNCT 0x0080
|
||||
#define CTYPE_SPACE 0x0100
|
||||
#define CTYPE_UPPER 0x0200
|
||||
#define CTYPE_XDIGIT 0x0400
|
||||
|
||||
static unsigned int gs_lookup[] =
|
||||
{
|
||||
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
|
||||
0x0004, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0004, 0x0004,
|
||||
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
|
||||
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
|
||||
0x0140, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0,
|
||||
0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0,
|
||||
0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459,
|
||||
0x0459, 0x0459, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0,
|
||||
0x00D0, 0x0653, 0x0653, 0x0653, 0x0653, 0x0653, 0x0653, 0x0253,
|
||||
0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253,
|
||||
0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253,
|
||||
0x0253, 0x0253, 0x0253, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0,
|
||||
0x00D0, 0x0473, 0x0473, 0x0473, 0x0473, 0x0473, 0x0473, 0x0073,
|
||||
0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073,
|
||||
0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073,
|
||||
0x0073, 0x0073, 0x0073, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x0004
|
||||
};
|
||||
|
||||
|
||||
#define CTYPE_TEST(c, t) ( (c) <= 127 && (gs_lookup[(c)] & (t)) )
|
||||
|
||||
|
||||
// ctype functions
|
||||
#define GEN_ISFUNC(name, test) \
|
||||
int name(const wxUniChar& c, const wxXLocale& loc) \
|
||||
{ \
|
||||
wxCHECK(loc.IsOk(), false); \
|
||||
return CTYPE_TEST(c.GetValue(), test); \
|
||||
}
|
||||
|
||||
GEN_ISFUNC(wxIsalnum_l, CTYPE_ALNUM)
|
||||
GEN_ISFUNC(wxIsalpha_l, CTYPE_ALPHA)
|
||||
GEN_ISFUNC(wxIscntrl_l, CTYPE_CNTRL)
|
||||
GEN_ISFUNC(wxIsdigit_l, CTYPE_DIGIT)
|
||||
GEN_ISFUNC(wxIsgraph_l, CTYPE_GRAPH)
|
||||
GEN_ISFUNC(wxIslower_l, CTYPE_LOWER)
|
||||
GEN_ISFUNC(wxIsprint_l, CTYPE_PRINT)
|
||||
GEN_ISFUNC(wxIspunct_l, CTYPE_PUNCT)
|
||||
GEN_ISFUNC(wxIsspace_l, CTYPE_SPACE)
|
||||
GEN_ISFUNC(wxIsupper_l, CTYPE_UPPER)
|
||||
GEN_ISFUNC(wxIsxdigit_l, CTYPE_XDIGIT)
|
||||
|
||||
wxUniChar wxTolower_l(const wxUniChar& c, const wxXLocale& loc)
|
||||
{
|
||||
wxCHECK(loc.IsOk(), false);
|
||||
|
||||
if(CTYPE_TEST(c, CTYPE_UPPER))
|
||||
{
|
||||
return c - 'A' + 'a';
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
wxUniChar wxToupper_l(const wxUniChar& c, const wxXLocale& loc)
|
||||
{
|
||||
wxCHECK(loc.IsOk(), false);
|
||||
|
||||
if(CTYPE_TEST(c, CTYPE_LOWER))
|
||||
{
|
||||
return c - 'a' + 'A';
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
#endif // !defined(wxHAS_XLOCALE_SUPPORT)
|
||||
|
||||
#endif // wxUSE_XLOCALE
|
||||
Reference in New Issue
Block a user