compilation fix for wxUSE_STL==1
[wxWidgets.git] / src / common / xlocale.cpp
1 //////////////////////////////////////////////////////////////////////////////
2 // Name: src/common/xlocale.cpp
3 // Purpose: xlocale wrappers/impl to provide some xlocale wrappers
4 // Author: Brian Vanderburg II, Vadim Zeitlin
5 // Created: 2008-01-07
6 // RCS-ID: $Id$
7 // Copyright: (c) 2008 Brian Vanderburg II
8 // 2008 Vadim Zeitlin <vadim@wxwidgets.org>
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
20 #include "wx/wxprec.h"
21
22 #ifdef __BORLANDC__
23 #pragma hdrstop
24 #endif
25
26 #if wxUSE_XLOCALE
27
28 #ifndef WX_PRECOMP
29 #include "wx/module.h"
30 #endif
31
32 #include "wx/xlocale.h"
33
34 // ----------------------------------------------------------------------------
35 // module globals
36 // ----------------------------------------------------------------------------
37
38 // This is the C locale object, it is created on demand
39 static wxXLocale *gs_cLocale = NULL;
40
41 // ============================================================================
42 // implementation
43 // ============================================================================
44
45 // ----------------------------------------------------------------------------
46 // Module for gs_cLocale cleanup
47 // ----------------------------------------------------------------------------
48
49 class wxXLocaleModule : public wxModule
50 {
51 public:
52 virtual bool OnInit() { return true; }
53 virtual void OnExit() { wxDELETE(gs_cLocale); }
54
55 DECLARE_DYNAMIC_CLASS(wxXLocaleModule)
56 };
57
58 IMPLEMENT_DYNAMIC_CLASS(wxXLocaleModule, wxModule)
59
60
61 // ============================================================================
62 // wxXLocale implementation
63 // ============================================================================
64
65 // ----------------------------------------------------------------------------
66 // common parts
67 // ----------------------------------------------------------------------------
68
69 // Get the C locale
70 wxXLocale& wxXLocale::GetCLocale()
71 {
72 if ( !gs_cLocale )
73 {
74 gs_cLocale = new wxXLocale(wx_static_cast(wxXLocaleCTag *, NULL));
75 }
76
77 return *gs_cLocale;
78 }
79
80 #ifdef wxHAS_XLOCALE_SUPPORT
81
82 wxXLocale::wxXLocale(wxLanguage lang)
83 {
84 const wxLanguageInfo * const info = wxLocale::GetLanguageInfo(lang);
85 if ( !info )
86 {
87 m_locale = NULL;
88 }
89 else
90 {
91 wxString loc;
92 #ifdef __WXMSW__
93 loc = info->Description;
94 #else
95 loc = info->CanonicalName;
96 #endif
97
98 Init(loc.c_str());
99 }
100 }
101
102 #if wxCHECK_VISUALC_VERSION(8)
103
104 // ----------------------------------------------------------------------------
105 // implementation using MSVC locale API
106 // ----------------------------------------------------------------------------
107
108 void wxXLocale::Init(const char *loc)
109 {
110 m_locale = _create_locale(LC_ALL, loc);
111 }
112
113 void wxXLocale::Free()
114 {
115 if ( m_locale )
116 _free_locale(m_locale);
117 }
118
119 #elif defined(HAVE_LOCALE_T)
120
121 // ----------------------------------------------------------------------------
122 // implementation using xlocale API
123 // ----------------------------------------------------------------------------
124
125 void wxXLocale::Init(const char *loc)
126 {
127 m_locale = newlocale(LC_ALL_MASK, loc, NULL);
128 }
129
130 void wxXLocale::Free()
131 {
132 if ( m_locale )
133 freelocale(m_locale);
134 }
135
136 #else
137 #error "Unknown xlocale support."
138 #endif
139
140 #endif // wxHAS_XLOCALE_SUPPORT
141
142 #ifndef wxHAS_XLOCALE_SUPPORT
143
144 // ============================================================================
145 // Implementation of wxFoo_l() functions for "C" locale without xlocale support
146 // ============================================================================
147
148 // ----------------------------------------------------------------------------
149 // character classification and transformation functions
150 // ----------------------------------------------------------------------------
151
152 // lookup table and macros for character type functions
153 #define CTYPE_ALNUM 0x0001
154 #define CTYPE_ALPHA 0x0002
155 #define CTYPE_CNTRL 0x0004
156 #define CTYPE_DIGIT 0x0008
157 #define CTYPE_GRAPH 0x0010
158 #define CTYPE_LOWER 0x0020
159 #define CTYPE_PRINT 0x0040
160 #define CTYPE_PUNCT 0x0080
161 #define CTYPE_SPACE 0x0100
162 #define CTYPE_UPPER 0x0200
163 #define CTYPE_XDIGIT 0x0400
164
165 static unsigned int gs_lookup[] =
166 {
167 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
168 0x0004, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0004, 0x0004,
169 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
170 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
171 0x0140, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0,
172 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0,
173 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459,
174 0x0459, 0x0459, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0,
175 0x00D0, 0x0653, 0x0653, 0x0653, 0x0653, 0x0653, 0x0653, 0x0253,
176 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253,
177 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253,
178 0x0253, 0x0253, 0x0253, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0,
179 0x00D0, 0x0473, 0x0473, 0x0473, 0x0473, 0x0473, 0x0473, 0x0073,
180 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073,
181 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073,
182 0x0073, 0x0073, 0x0073, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x0004
183 };
184
185
186 #define CTYPE_TEST(c, t) ( (c) <= 127 && (gs_lookup[(c)] & (t)) )
187
188
189 // ctype functions
190 #define GEN_ISFUNC(name, test) \
191 int name(const wxUniChar& c, const wxXLocale& loc) \
192 { \
193 wxCHECK(loc.IsOk(), false); \
194 return CTYPE_TEST(c.GetValue(), test); \
195 }
196
197 GEN_ISFUNC(wxIsalnum_l, CTYPE_ALNUM)
198 GEN_ISFUNC(wxIsalpha_l, CTYPE_ALPHA)
199 GEN_ISFUNC(wxIscntrl_l, CTYPE_CNTRL)
200 GEN_ISFUNC(wxIsdigit_l, CTYPE_DIGIT)
201 GEN_ISFUNC(wxIsgraph_l, CTYPE_GRAPH)
202 GEN_ISFUNC(wxIslower_l, CTYPE_LOWER)
203 GEN_ISFUNC(wxIsprint_l, CTYPE_PRINT)
204 GEN_ISFUNC(wxIspunct_l, CTYPE_PUNCT)
205 GEN_ISFUNC(wxIsspace_l, CTYPE_SPACE)
206 GEN_ISFUNC(wxIsupper_l, CTYPE_UPPER)
207 GEN_ISFUNC(wxIsxdigit_l, CTYPE_XDIGIT)
208
209 int wxTolower_l(const wxUniChar& c, const wxXLocale& loc)
210 {
211 wxCHECK(loc.IsOk(), false);
212
213 if(CTYPE_TEST(c.GetValue(), CTYPE_UPPER))
214 {
215 return c - 'A' + 'a';
216 }
217
218 return c;
219 }
220
221 int wxToupper_l(const wxUniChar& c, const wxXLocale& loc)
222 {
223 wxCHECK(loc.IsOk(), false);
224
225 if(CTYPE_TEST(c.GetValue(), CTYPE_LOWER))
226 {
227 return c - 'a' + 'A';
228 }
229
230 return c;
231 }
232
233 #endif // !defined(wxHAS_XLOCALE_SUPPORT)
234
235 #endif // wxUSE_XLOCALE